如果需要开发低延迟的网络应用,那应该对线程亲和性(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);