-1

我有一个有两个线程的应用程序,thread1 将从网卡 eth1 接收多播包,假设我使用 sched_setaffinity 将 thread1 的 cpu 亲和性设置为 cpu core 1,然后我让 thread2 使用这些包(从 thread1 接收,位于heap area global vars) 做一些操作,我将thread2的cpu亲和力设置为core 7,假设core 1和core 7在同一个core中具有超线程,我认为性能会很好,因为core 1和core 7可以使用 L1 缓存。

我看过/proc/interrupt,我看到eth1在几个cpu核心中有中断,所以在我的例子中,我将thread1的cpu亲和力设置为核心1,但是
在很多核心中都发生了中断,会影响性能吗?无论哪个内核有中断,从 eth1 收到的那些包都会直接进入主内存吗?

我对linux内核中的网络不太了解,任何建议书籍或网站的人都可以帮助我解决这个问题吗?谢谢大家的意见~~

编辑:根据“每个程序员应该了解的内存”6.3.5“直接缓存访问”,我认为“DCA”是我想知道的......

4

1 回答 1

1

中断将(很可能)发生在与接收数据包的内核不同的内核上。取决于驱动程序如何处理数据包,这可能重要也可能不重要。如果驱动程序读取数据包(例如制作副本),那么它并不理想,因为缓存在不同的 CPU 上被填满。但是,如果数据包刚刚使用 DMA 加载到内存中,并留在那里供软件稍后获取,那么没关系 [事实上,最好让它发生在不同的 CPU 上,作为“你的”cpu有更多时间做其他事情]。

至于使用超线程,我(以及许多其他人的经验)是超线程有时会带来好处,但通常最终类似于没有超线程,因为两个线程使用相同内核的相同执行单元。您可能希望将吞吐量与在同一核心上设置为亲和性的两个线程进行比较,看看这是否使它“更好”或“更差” - 就像大多数事情一样,它通常是细节会产生影响,所以你的代码可能与其他人略有不同,这意味着它在一种或另一种情况下效果更好。

编辑:如果您的系统有多个插槽,您可能还需要确保插槽上的 CPU“最近”(如 QPI/PCI 桥接跳数)网卡。

于 2013-01-24T02:23:23.997 回答