Go to file
Scott Mitchell 1fa7a5e697 EPOLL - decouple schedule tasks from epoll_wait life cycle (#7834)
Motivation:
EPOLL supports decoupling the timed wakeup mechanism from the selector call. The EPOLL transport takes advantage of this in order to offer more fine grained timer resolution. However we are current calling timerfd_settime on each call to epoll_wait and this is expensive. We don't have to re-arm the timer on every call to epoll_wait and instead only have to arm the timer when a task is scheduled with an earlier expiration than any other existing scheduled task.

Modifications:
- Before scheduled tasks are added to the task queue, we determine if the new
  duration is the soonest to expire, and if so update with timerfd_settime. We
also drain all the tasks at the end of the event loop to make sure we service
any expired tasks and get an accurate next time delay.
- EpollEventLoop maintains a volatile variable which represents the next deadline to expire. This variable is modified inside the event loop thread (before calling epoll_wait) and out side the event loop thread (immediately to ensure proper wakeup time).
- Execute the task queue before the schedule task priority queue. This means we
  may delay the processing of scheduled tasks but it ensures we transfer all
pending tasks from the task queue to the scheduled priority queue to run the
soonest to expire scheduled task first.
- Deprecate IORatio on EpollEventLoop, and drain the executor and scheduled queue on each event loop wakeup. Coupling the amount of time we are allowed to drain the executor queue to a proportion of time we process inbound IO may lead to unbounded queue sizes and unpredictable latency.

Result:
Fixes https://github.com/netty/netty/issues/7829
- In most cases this results in less calls to timerfd_settime
- Less event loop wakeups just to check for scheduled tasks executed outside the event loop
- More predictable executor queue and scheduled task queue draining
- More accurate and responsive scheduled task execution
2019-08-14 10:11:04 +02:00
.github Change the netty.io homepage scheme(http -> https) (#9344) 2019-07-09 21:09:42 +02:00
.mvn support publishing snapshots from docker based ci (#8634) 2018-12-07 05:43:06 +01:00
all [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
bom [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
buffer [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
codec [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
codec-dns [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
codec-haproxy [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
codec-http [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
codec-http2 [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
codec-memcache [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
codec-mqtt [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
codec-redis [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
codec-smtp [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
codec-socks [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
codec-stomp [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
codec-xml [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
common EPOLL - decouple schedule tasks from epoll_wait life cycle (#7834) 2019-08-14 10:11:04 +02:00
dev-tools [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
docker Use OpenJDK13 RC (#9457) 2019-08-14 10:06:25 +02:00
example [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
handler [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
handler-proxy [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
license Use Table lookup for HPACK decoder (#9307) 2019-07-02 20:09:44 +02:00
microbench [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
resolver [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
resolver-dns [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
tarball [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
testsuite [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
testsuite-autobahn [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
testsuite-http2 [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
testsuite-native-image [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
testsuite-osgi [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
testsuite-shading [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
transport EPOLL - decouple schedule tasks from epoll_wait life cycle (#7834) 2019-08-14 10:11:04 +02:00
transport-native-epoll EPOLL - decouple schedule tasks from epoll_wait life cycle (#7834) 2019-08-14 10:11:04 +02:00
transport-native-kqueue [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
transport-native-unix-common [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
transport-native-unix-common-tests [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
transport-rxtx [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
transport-sctp [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
transport-udt [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
.fbprefs Updated Find Bugs configuration 2009-03-04 10:33:09 +00:00
.gitattributes Include mvn wrapper to make setup of development env easier 2018-01-26 08:13:17 +01:00
.gitignore Add .gitignore for docker-sync stuff 2019-03-19 14:03:15 +01:00
CONTRIBUTING.md Change the netty.io homepage scheme(http -> https) (#9344) 2019-07-09 21:09:42 +02:00
LICENSE.txt Relicensed to Apache License v2 2009-08-28 07:15:49 +00:00
mvnw Include mvn wrapper to make setup of development env easier 2018-01-26 08:13:17 +01:00
mvnw.cmd Include mvn wrapper to make setup of development env easier 2018-01-26 08:13:17 +01:00
NOTICE.txt Change the netty.io homepage scheme(http -> https) (#9344) 2019-07-09 21:09:42 +02:00
pom.xml [maven-release-plugin] prepare for next development iteration 2019-08-13 17:16:42 +00:00
README.md Change the netty.io homepage scheme(http -> https) (#9344) 2019-07-09 21:09:42 +02:00
run-example.sh Add UptimeServer and adjust UptimeClient's code style. 2017-04-28 07:41:07 +02:00

Netty Project

Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.

How to build

For the detailed information about building and developing Netty, please visit the developer guide. This page only gives very basic information.

You require the following to build Netty:

Note that this is build-time requirement. JDK 5 (for 3.x) or 6 (for 4.0+) is enough to run your Netty-based application.

Branches to look

Development of all versions takes place in each branch whose name is identical to <majorVersion>.<minorVersion>. For example, the development of 3.9 and 4.0 resides in the branch '3.9' and the branch '4.0' respectively.

Usage with JDK 9

Netty can be used in modular JDK9 applications as a collection of automatic modules. The module names follow the reverse-DNS style, and are derived from subproject names rather than root packages due to historical reasons. They are listed below:

  • io.netty.all
  • io.netty.buffer
  • io.netty.codec
  • io.netty.codec.dns
  • io.netty.codec.haproxy
  • io.netty.codec.http
  • io.netty.codec.http2
  • io.netty.codec.memcache
  • io.netty.codec.mqtt
  • io.netty.codec.redis
  • io.netty.codec.smtp
  • io.netty.codec.socks
  • io.netty.codec.stomp
  • io.netty.codec.xml
  • io.netty.common
  • io.netty.handler
  • io.netty.handler.proxy
  • io.netty.resolver
  • io.netty.resolver.dns
  • io.netty.transport
  • io.netty.transport.epoll (native omitted - reserved keyword in Java)
  • io.netty.transport.kqueue (native omitted - reserved keyword in Java)
  • io.netty.transport.unix.common (native omitted - reserved keyword in Java)
  • io.netty.transport.rxtx
  • io.netty.transport.sctp
  • io.netty.transport.udt

Automatic modules do not provide any means to declare dependencies, so you need to list each used module separately in your module-info file.