如果需要開發低延遲的網絡應用,那應該對線程親和性(Thread affinity)有所了解。線程親和性能夠強制使你的應用線程運作在特定的一個或多個cpu上。通過這種方式,可以消除作業系統進行排程造成的線程的頻繁的上下文切換。
實作方式:
1、引入依賴
maven:
<!-- https://mvnrepository.com/artifact/net.openhft/affinity -->
<dependency>
<groupId>net.openhft</groupId>
<artifactId>affinity</artifactId>
<version>3.21ea5</version>
</dependency>
gradle:
// https://mvnrepository.com/artifact/net.openhft/affinity
implementation group: 'net.openhft', name: 'affinity', version: '3.21ea5'
2、測試:
public class AffinityTests {
@Test
public void test() {
try (AffinityLock affinityLock = AffinityLock.acquireLock(2)) {
while (true) {
}
}
}
}
運作起來會發現第三個核心使用率達到了100%(下标從0開始)
3、線程親和排程的一些場景
(1)Nginx親和性
例如4核心的CPU,每個核心綁定一個CPU
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
2核心4線程cpu,将第一個工作程序綁定到cpu0/2,第二個綁定cpu1/3,合有超線程技術的cpu
worker_processes 2;
worker_cpu_affinity 0101 1010;
上面的計算方式是掩碼計算,從右往左,綁定哪個核心,此位的值就為1
(2)netty的eventloop
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);