1. 程式人生 > >執行緒親和性(Thread Affinity)

執行緒親和性(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>