執行緒親和性(Thread Affinity)
阿新 • • 發佈:2018-12-22
原文連結 譯者:裘卡
如果你正在開發低延遲的網路應用,那應該對執行緒親和性(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>
)