我有一个有两个线程的应用程序,thread1会接收多播包 从网卡eth1,假设我使用sched_setaffinity来设置cpu亲和性 对于thread1到cpu核心1,然后我有thread2来使用这些包 (从thread1接收,位于堆区域全局变量中)进行一些操作, 我将thread2的cpu亲和性设置为核心7,假设核心1和核心7是 在超线程的同一核心中,我认为性能会很好, 因为核心1和核心7可以使用L1缓存。
我已经看过/ proc / interrupt,我看到eth1在几个cpu核心中有中断, 所以在我的情况下,我为core1设置了cpu affinity到core 1,但是发生了中断 在许多核心中,它会影响性能吗?从eth1收到的那些包裹 无论哪个核心有中断,它都会直接进入主存储器?
我对linux内核中的网络知之甚少,可能会有人建议 书籍或网站可以帮助我这个主题?感谢您的任何评论~~
编辑:根据“每个程序员应该了解的内存”6.3.5“直接缓存访问”,我认为“DCA”是我想知道的......
答案 0 :(得分:1)
中断将(很可能)发生在与接收数据包不同的核心上。取决于驱动程序如何处理数据包,这可能或不重要。如果驱动程序读取数据包(例如,擦除副本),则它不理想,因为缓存在不同的CPU上填充。但是如果数据包刚刚使用DMA加载到某个地方的存储器中,并留在那里供软件稍后拿起,那么它没关系[事实上,最好让它发生在不同的CPU上,就像“你的”cpu有更多时间做其他事情]。
至于使用超线程,我的经验(以及许多其他人的经验)是超线程SOMETIMES带来了好处,但往往最终类似于没有超线程,因为两个线程使用相同核心的相同执行单元。您可能希望将吞吐量与同一核心上设置为亲缘关系的两个线程进行比较,以查看是否会使其“更好”或“更糟” - 就像大多数情况一样,通常细节会产生影响,因此您的代码可能会与某些人略有不同,这意味着它在一个或另一个案例中效果更好。
编辑:如果您的系统有多个套接字,您可能还需要确保套接字上的CPU“最近”(如QPI / PCI桥跳数),网卡。