Netty 与线程绑核

如果你在开发低延迟的 Netty 应用程序,那么你可能了解过线程亲和性(thread affinity)这一概念。线程亲和性是指一个线程可以被强制在某一特定的 CPU 核和 CPU 核组上运行。这样你就可以在操作系统调度过程中消除线程迁移,提升性能。幸运的是,目前就有一个名为 Java-Thread-Affinity 的 Java 库,可以轻松地与 Netty 应用集成。

首先,需要添加下面的依赖到 Maven pom.xml 里:

dependency
    groupIdnet.openhft/groupId
    artifactIdaffinity/artifactId
    version3.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= 。

最新回复(0)
/jishui7A852oWU1tJCUW_2Byq2x0Lohxz1U9FtRReY0FA_3D_3D4795215
8 简首页