2013-01-24 21 views
-1

我有一个应用程序有两个线程,thread1将接收来自网卡eth1的组播包 ,假设我使用sched_setaffinity将cpu亲缘性 设置为将thread1设置为cpu core 1,然后我将thread2使用这些包 (从线程1接收,位于堆区域全局变量中)执行一些操作, 我将thread2的cpu关联设置为核心7,假设核心1和核心7在具有超线程的同一个核心中为 ,I因为核心1和核心7可以使用L1缓存,所以认为性能会很好, 。Linux中的网络性能调整

我看过的/ proc /中断,我看到了ETH1中断在几个CPU内核, 所以在我的情况,我设置CPU亲和力核心1线程1,但中断在许多核心发生
,将它的效果性能?从eth1 收到的那些软件包将直接进入主内存,而不管哪个内核有中断?

我对linux内核的网络了解不多,可能谁会建议 书籍或网站可以帮我解决这个问题?感谢您的任何意见~~

编辑:据“每个程序员应该知道记忆什么” 6.3.5“直接高速缓存访​​问”,我认为“DCA”是HWAT我想知道......

回答

1

中断将很可能发生在与接收数据包不同的内核上。取决于驱动程序如何处理数据包,这可能或可能不重要。如果驱动程序读取数据包(例如复制副本),那么它不是理想的,因为高速缓存被填充到不同的CPU上。但是,如果数据包只是在使用DMA的某个地方加载到内存中,并留在那里让软件稍后拿起,那么它并不重要[事实上,它最好在不同的CPU上发生,因为“你的”CPU有更多时间做其他事情]。对于使用超线程,我的经验(以及许多其他人)的经验是,超线程有时候会带来好处,但通常会导致类似于没有超线程的情况,因为两个线程使用相同内核的相同执行单元。您可能想要将吞吐量与设置为相同内核的两个线程的吞吐量进行比较,以查看是否使其“更好”或“更糟糕” - 就像大多数情况一样,通常细节会影响效果,因此您的代码可能会与其他人的情况略有不同,这意味着它在一种或另一种情况下效果更好。

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

+0

谢谢大家,我的服务器只有一个cpu插座,6个超线程核心,使它成为12个单元,请问我该如何确保网卡使用DMA?如果这些数据包使用DMA,那么由于所有数据包都会直接进入主存储器,在这种情况下,这些数据包将加载到主存储器并转到我的thread1正在运行的核心(核心1)缓存中,我正确吗? – barfatchen

+0

你不知道(不查看驱动程序的源代码)究竟是如何工作的。但是大多数卡只是直接写入存储器而不涉及CPU。这意味着您将看到的唯一“缓存活动”是缓存行的失效,因为数据进入缓存行为时会覆盖已存在于缓存中的数据。 主内存不是“每个内核”,因此无论您的线程运行的是哪个内核,都会在数据包正在处理时使用相关数据填充缓存。 –