线程亲和性(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>

转载自 并发编程网 - ifeve.com

时间: 2024-10-04 00:19:22

线程亲和性(Thread Affinity)的相关文章

WCF后续之旅(11) 关于并发、回调的线程关联性(Thread Affinity)

对于一般的多线程操作,比如异步地进行基于文件系统的IO操作:异步地调用Web Service:或者是异步地进行数据库访问等等,是和具体的线程无关的.也就是说,对于这些操作,任意创建一个新的线程来执行都是等效的.但是有些情况下,有些操作却只能在固定的线程下执行.比如,在GUI应用下,对控件的访问就需要在创建该控件的线程下执行:或者我们在某个固定的线程中通过TLS(Thread Local Storage)设置了一些Context信息,供具体的操作使用,我们把操作和某个固定的线程的依赖称为线程关联性

[原创]WCF后续之旅(12): 线程关联性(Thread Affinity)对WCF并发访问的影响

在本系列的上一篇文章中,我们重点讨论了线程关联性对service和callback的操作执行的影响:在service host的时候,可以设置当前线程的SynchronizationContext,那么在默认情况下,service操作的执行将在该SynchronizationContext下执行(也就将service操作包装成delegate传入SynchronizationContext的Send或者Post方法):同理,对于Duplex同行方式来讲,在client调用service之前,如果

管理处理器的亲和性(affinity)

简单地说,CPU 亲和性(affinity) 就是进程要在某个给定的 CPU 上尽量长时间地运行而不被迁移到其他处理器的倾向性.Linux 内核进程调度器天生就具有被称为 软 CPU 亲和性(affinity) 的特性,这意味着进程通常不会在处理器之间频繁迁移.这种状态正是我们希望的,因为进程迁移的频率小就意味着产生的负载小. 2.6 版本的 Linux 内核还包含了一种机制,它让开发人员可以编程实现 硬 CPU 亲和性(affinity).这意味着应用程序可以显式地指定进程在哪个(或哪些)处理

认识C#线程类Thread

.NET 基础类库的System.Threading命名空间提供了大量的类和接口支持多线程.这个命名空间有很多的类.System.Threading.Thread类是创建并控制线程,设置其优先级并获取其状态最为常用的类.他有很多的方法,在这里我们将就比较常用和重要的方法做一下介绍: Thread.Start():启动线程的执行: Thread.Suspend():挂起线程,或者如果线程已挂起,则不起作用: Thread.Resume():继续已挂起的线程: Thread.Interrupt():

代码-android线程休眠(Thread.sleep)的问题

问题描述 android线程休眠(Thread.sleep)的问题 我有这么一段代码,照理说运行结果应该是refreshTAG2变成"刷新成功",Logcat输出"刷新成功",然后进程休眠 但是执行的结果却是logcat输出"刷新成功",然后进程休眠0.5秒,最后refreshTAG2变成"刷新成功" 搞了好久找不到问题所在,有谁能教教我,谢谢 解决方案 你这不是异步吧,还是主线程中的操作啊sleep一样会阻塞,知道休眠完毕,

java并发编程学习: 守护线程(Daemon Thread)

在正式理解这个概念前,先把 守护线程 与 守护进程 这二个极其相似的说法区分开,守护进程通常是为了防止某些应用因各种意外原因退出,而在后台独立运行的系统服务或应用程序. 比如:我们开发了一个邮件发送程序,一直不停的监视队列池,发现有待发送的邮件,就将其发送出去.如果这个程序挂了(或被人误操作关了),邮件就不发出去了,为了防止这种情况,再开发一个类似windows 系统服务的应用,常驻后台,监制这个邮件发送程序是否在运行,如果没运行,则自动将其启动.   而我们今天说的java中的守护线程(Dae

WCF后续之旅(12) 线程关联性(Thread Affinity)对WCF并发访问的影响

在本系列的上一篇文章中,我们重点讨论了线程关联性对service和callback的操作执行的影响:在service host的时候,可以设置当前线程的SynchronizationContext,那么在默认情况下,service操作的执行将在该SynchronizationContext下执行(也就将service操作包装成delegate传入SynchronizationContext的Send或者Post方法):同理,对于Duplex同行方式来讲,在client调用service之前,如果

线程-java Thread wait 问题

问题描述 java Thread wait 问题 3C 执行下面代码 public class TestMain { public static void main(String[] args) { new Thread(new Runnable() { private Object obj = new Object(); @Override public void run() { while(true){ System.out.println(""rr""); t

线程-C++ thread的detach函数问题??

问题描述 C++ thread的detach函数问题?? #include<iostream> #include<thread> using namespace std; void function_1() { std::cout << "Hello,world!" << std::endl; } int main() { std::thread t1(function_1); //t1 starts running. //t1.join