天天看點

java實作将線程綁定到某個CPU核上(線程親和性)

如果需要開發低延遲的網絡應用,那應該對線程親和性(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開始)

java實作将線程綁定到某個CPU核上(線程親和性)

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);