如果你正在开发低延迟的网络应用,那应该对线程亲和性(Thread affinity)有所了解。线程亲和性能够强制使你的应用线程运行在特定的一个或多个cpu上。通过这种方式,可以消除操作系统进行调度过程导致线程迁移所造成的影响。幸运的是,刚好有一个这么一个java库
Java-Thread-Affinity
,并且很容易就可以整合到你的netty应用中。
首先,pom.xml中需增加以下依赖:
<dependency> <groupId>net.openhft</groupId> <artifactId>affinity</artifactId> <version>3.0.6</version> </dependency>
其次,创建一个特定策略的AffinityThreadFactory,并传入包含延迟敏感(latency-sensitive)线程的EventLoopGroup中。示例如下:
final int acceptorThreads = 1; final int workerThreads = 10; EventLoopGroup acceptorGroup = new NioEventLoopGroup(acceptorThreads); ThreadFactory threadFactory = new AffinityThreadFactory("atf_wrk", AffinityStrategies.DIFFERENT_CORE); EventLoopGroup workerGroup = new NioEventLoopGroup(workerThreads, threadFactory); ServerBootstrap serverBootstrap = new ServerBootstrap().group(acceptorGroup, workerGroup);
注意,需要将指定的一系列cpu从系统调度器中隔离出来,才能达到最低的延迟效果。而这将导致系统调度器无法再使用这些cpu运行其他用户线程(user-space processes)。同时别忘了修改内核启动参数
isolcpus(如:
grub.conf
中增加
isolcpus=<cpu-list>
)