如果你在开发低延迟的 Netty 应用程序,那么你可能了解过线程亲和性(thread affinity)这一概念。线程亲和性是指一个线程可以被强制在某一特定的 CPU 核和 CPU 核组上运行。这样你就可以在操作系统调度过程中消除线程迁移,提升性能。幸运的是,目前就有一个名为 Java-Thread-Affinity 的 Java 库,可以轻松地与 Netty 应用集成。
首先,需要添加下面的依赖到 Maven pom.xml 里:
<dependency>
<groupId>net.openhft</groupId>
<artifactId>affinity</artifactId>
<version>3.0.6</version>
</dependency>
然后,创建一个 AffinityThreadFactory,并将其传递给 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 上运行别的用户线程。隔离方法是修改内核启动参数,在 grub.conf 文件里添加 isolcpus= 。