線程親和性(Thread Affinity)
如果你正在開發低延遲的網絡應用,那應該對線程親和性(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>
)
最後更新:2017-05-18 20:31:20