![Linux 内核可以处理多少个内核?](https://linux22.com/image/42447/Linux%20%E5%86%85%E6%A0%B8%E5%8F%AF%E4%BB%A5%E5%A4%84%E7%90%86%E5%A4%9A%E5%B0%91%E4%B8%AA%E5%86%85%E6%A0%B8%EF%BC%9F.png)
我对理论限制感兴趣,也许还有具有大量 CPU 的系统的示例。
答案1
实际上至少2048。作为一个具体的例子,SGI 出售其紫外线系统,可以使用 256 个套接字(2,048 个内核)和 16TB 共享内存,全部运行在单个内核下。我知道至少有一些系统已采用这种配置出售。
根据SGI:
Altix UV 运行完全未经修改的 Linux,包括 Novell 和 Red Hat 的标准发行版。
答案2
这就是 Launchpad不得不说关于 Ubuntu,所以我想它也适用于其他人:
1.Intel x86:
Maximum CPUs: 32 (including logical CPUs)
Maximum memory: 64GB
Maximum filesize: 8TB
Maximum filesystem size (ext3) 16TB
Maximum per-process virtual address space: 4GB
2.AMD64/EM64T:
Maximum CPUs: 64
Maximum memory: 128GB
Maximum filesize: 8TB
Maximum filesystem size (ext3): 16TB
Maximum per-process virtual address space: N/A
These are standard max limitations whereas Linux cluster systems can scale up to 1024 CPU's.
对于 x86 和 x86_64 分别是 32 或 64 个 CPU。
Redhat 也这么说,但是在易于管理的表。 Redhat EL6 可以为 x86 提供 32 个 CPU 核心,或者为 x86_64 提供 128 或 4096 个 CPU 核心。
答案3
x86_64 Linux 内核在单个系统映像中最多可以处理 4096 个处理器线程。这意味着在启用超线程的情况下,处理器核心的最大数量为 2048。是的,存在具有超过 2048 个处理器核心的计算机;但它们作为集群运行,其中多个 Linux 内核协作,通过高速互连(通常是 Infiniband 结构)连接。
从最新的内核 3.13 开始,在 ~/arch/x86/Kconfig 中:
配置NR_CPUS
---help---
This allows you to specify the maximum number of CPUs which this
kernel will support. If CPUMASK_OFFSTACK is enabled, the maximum
supported value is 4096, otherwise the maximum value is 512. The
minimum value which makes sense is 2.
This is purely to save memory - each supported CPU adds
approximately eight kilobytes to the kernel image.
更新:在较新的内核上,这是特定于体系结构的 - 例如在 4.15 x86_64 上允许您将 NR_CPUS 设置为 8192在适当的情况下,而32位臂停在32。
答案4
线程受多任务模型和线程管理方案的影响。如果我没记错的话,基于intel的系统的Gdt用于linux。这个想法是最大可能有 8192 个线程。假设系统使用 gdt 来管理线程。在 32 位机器上,任务切换是受管理的,并且 32 位和 64 位机器上的中断向量需要有 gdt 条目。不确定手臂是如何做到的,但必须实现相同的关节。任务切换概念迭代了任务分配模型中的 GDT。
如果你打破了 gdt 方案,当你为每个线程拥有一个页面堆栈帧、线程的页面代码库和堆空间页面时,你大概可以达到你所拥有的内存。您不能假设您有一页代码或堆,它们是随机变量。一般每个线程有两个栈帧,一个由线程维护,一个由linux内核维护。您添加交换空间的虚拟内存概念,模型就会被打乱,但它与线程优先级有关。