有多个套接字时Linux OS如何调度线程

Posted

技术标签:

【中文标题】有多个套接字时Linux OS如何调度线程【英文标题】:How do Linux OS schedule threads when there are multiple sockets 【发布时间】:2013-04-24 17:06:13 【问题描述】:

例如,在具有 2 个四核处理器的双插槽系统中,线程调度程序是否会尝试将线程保持在同一处理器中的同一进程中?因为在一个进程中的线程有大量共享内存访问的情况下,在不同处理器中交错不同进程的线程会降低性能。

【问题讨论】:

可能与NUMA有关 【参考方案1】:

视情况而定。

在当前的 Intel 平台上,Bios 默认值似乎是内存在系统中的插槽之间逐页交错。分配 1Mbyte,一半在一个套接字上,一半在另一个套接字上。这意味着无论您的线程在哪里,它们都可以平等地访问数据。

这使得操作系统非常简单——任何地方都可以。

这可能对你不利。呈现给操作系统的 SMP 硬件环境是由 CPU 在 QPI 上协作合成的。如果有很多线程都在访问相同的数据,那么这些链接会变得非常繁忙。如果他们太忙,那么这会限制性能,并且您会受到 I/O 限制。这就是我所在的地方;采用英特尔内存子系统设计的 Z80 内核将与我实际拥有的 nahelem 内核一样快(好吧,我可能夸大了......)。

归根结底,真正的问题是内存不够快。英特尔和 AMD 最近都在内存方面做了一些令人印象深刻的事情,但我们仍然受到其缓慢的阻碍。理想情况下,内存应该足够快,以便所有内核都有时钟频率访问时间。 Cell 处理器就是这样做的——每个 SPE 都有一些 SRAM 而不是缓存,一旦你对它们有所了解,你就可以让它们真正唱歌。

===编辑===

还有更多。正如 Basile Starynkevitch 暗示的那样,另一种方法是采用 NUMA。

NUMA 是现代 CPU 的实际体现,内存访问是不统一的,因为其他 CPU 插槽上的内存不能通过寻址总线直接访问。相反,CPU 通过 QPI 链路(或 AMD 的 Hypertransport)请求数据,以要求其他 CPU 从其内存中获取数据并将其发送回。因为 CPU 在硬件中为您完成所有这些工作,所以它最终看起来就像一个传统的 SMP 环境。而且 QPI / Hypertransport 非常快,所以大多数时候它已经足够快了。

如果您编写代码以反映硬件架构,理论上您可以进行改进。因此,这可能涉及(例如)在系统中拥有两个数据副本,每个套接字上一个。 Linux 中有内存关联例程专门以这种方式分配内存,而不是在所有套接字之间交错。还有 CPU 关联例程允许您控制线程在哪个 CPU 内核上运行,这个想法是您在靠近将要处理的数据缓冲区的内核上运行它。

好的,所以这可能意味着要对源代码进行大量投资以使其适合您(尤其是如果该数据重复不适合程序的流程),但如果 QPI 已成为有问题的瓶颈这是你唯一能做的。

我已经在某种程度上摆弄了这个。在某种程度上,这是一个正确的 faff。英特尔和 AMD(以及操作系统和库)的整体思路是为您提供一个 SMP 环境,在大多数情况下,这个环境非常好。但是,它们让您通过加载大量库函数来使用 NUMA,您必须调用这些函数来部署所需的线程和内存。

但是,对于需要一点额外速度的边缘情况,如果架构和操作系统完全是 NUMA,根本没有 SMP,那会更容易。实际上就像 Cell 处理器一样。更容易,不是因为它写起来很简单(实际上它会更难),而是如果你让它运行起来,你就会确定它是硬件所能达到的一样快。使用我们现在拥有的伪造 SMP,您可以尝试使用 NUMA,但您大多想知道它是否尽可能快。库并没有告诉您您正在访问实际驻留在另一个套接字上的内存,它们只是让您这样做,而没有暗示还有改进的余地。

【讨论】:

理想情况下内存应该足够快...除非基础物理学发生革命,否则 RAM 永远不会比现在快得多:内存总线在一个受到光速限制的数量级。严重地。 (从技术上讲,铜中电磁波的速度,大约是 2/3 c = 20cm/ns。当你把所有的线加起来时,CPU 距离 RAM 大约 20cm .) @Zack,是的,距离是个问题(PS3 中的 XDR 内存之类的东西在主板上的数据总线迹线上有不止一个位...),但 DRAM 单元本身是狗慢的。甚至 DDR3-2133 的基本主频也只有 266MHz,比内核慢十倍以上;良好的吞吐量,垃圾延迟。惠普的忆阻器要好得多——显然它的时钟频率 >1GHz,比最快的 DRAM 快 4 倍。非易失性主存储器有人吗? 嗯,还有最后一个数量级...要访问多少个周期,你知道吗? @Zack,你的意思是访问忆阻器存储单元吗?我不完全确定,但我认为这只是一个。忆阻器是一项非常有趣的技术,如果惠普/海力士做对了,他们就会清理干净。主要功能 - 1GHz 时钟(比其他任何东西都快)、非易失性(如闪存)、随机读取、随机权限(如 DRAM)、无磨损问题(与闪存不同),并且显然可以缩放到 1 petabit / cm^2制造技术(远比其他任何东西都密集,包括硬盘驱动器)。如果一切都属实,那么这是一个理想的存储解决方案。 如果将其用作 DRAM 替代品,请多考虑一下,那么他们很可能也会为忆阻器采用 DDR 风格的访问方案。所以仍然会有 CAS 等。但它应该归结为访问时间快 4 倍,因为基本内存时钟快 4 倍。惠普和海力士对这一切都非常沉默,但据说他们已经整理好了所有的基本技术,现在正计划在市场上争取最大的收入。所以现在不要指望 1pbit,他们会想先卖给我们小得多的设备,然后再卖给我们更大的设备。

以上是关于有多个套接字时Linux OS如何调度线程的主要内容,如果未能解决你的问题,请参考以下文章

Linux socket使用多线程发送

多端口监听套接字linux

建立多个连接时如何在C中设置套接字超时?

如何在 Rust 中关闭 Unix 套接字?

使用单个套接字处理多个传入UDP连接

如何通过 Mac OS X 上的 Unix 域套接字传递用户凭据?