Estou interessado em limites teóricos, talvez com exemplos de sistemas com um grande número de CPUs.
Estou interessado em limites teóricos, talvez com exemplos de sistemas com um grande número de CPUs.
Respostas:
Pelo menos 2048 na prática. Como exemplo concreto, a SGI vende seu sistema UV , que pode usar 256 soquetes (2.048 núcleos) e 16 TB de memória compartilhada, todos rodando em um único kernel. Eu sei que existem pelo menos alguns sistemas que foram vendidos nessa configuração.
De acordo com a SGI:
O Altix UV executa Linux completamente não modificado, incluindo distribuições padrão da Novell e da Red Hat.
isto é o que o Launchpad tem a dizer sobre o Ubuntu, então acho que se aplica a outros:
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.
Ou seja, 32 ou 64 CPUs para x86 e x86_64, respectivamente.
Redhat diz o mesmo, mas em uma tabela amigável para gerenciamento . O Redhat EL6 pode executar 32 para núcleos de CPUs x86 ou 128 ou 4096 para x86_64.
CONFIG_NR_CPUS
limites podem ser aumentados se CONFIG_MAXSMP
estiver ativado.
O kernel Linux x86_64 pode lidar com no máximo 4096 threads de processador em uma única imagem do sistema. Isso significa que, com o hyper threading ativado, o número máximo de núcleos de processador é 2048. Sim, existem computadores com mais de 2048 núcleos de processador; mas eles são executados como clusters nos quais vários kernels do Linux cooperam, conectados a uma interconexão de alta velocidade, normalmente uma malha Infiniband.
do kernel mais atual 3.13, em ~ / arch / x86 / Kconfig:
config 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.
Atualização: nos kernels mais recentes, isso é específico da arquitetura - por exemplo, em 4.15 x86_64, você pode definir NR_CPUS para 8192 nas circunstâncias certas, enquanto o braço de 32 bits para em 32 .
Este bebê corre 10.368!
Os encadeamentos são subjetivos ao modelo de multitarefa e ao esquema de gerenciamento de encadeamentos. O Gdt dos sistemas baseados em intel é usado no linux, se bem me lembro. A idéia é que há uma possibilidade de 8192 threads no tamanho máximo. Isso assumindo que o sistema está usando o gdt para gerenciar os threads. Em máquinas de 32 bits, a comutação de tarefas é gerenciada e os vetores de interrupção nas máquinas de 32 e 64 bits precisam ter entradas gdt. Não tenho certeza de como o braço faz isso, mas a mesma articulação deve ser alcançada. Os conceitos de troca de tarefas repetem o GDT nos modelos de tarefas.
Se você interromper o esquema gdt, provavelmente poderá alcançar o que tem memória quando tiver, para cada encadeamento, um quadro de pilha de páginas, base de código de página para o encadeamento e página do espaço de pilha. Você não pode assumir que possui uma página de código ou heap, que são as variáveis aleatórias. Geralmente, existem dois quadros de pilha para cada thread, um mantido pelo thread e outro mantido pelo kernel do linux. Você adiciona conceitos de memória virtual de espaço de troca e o modelo é expulso da água, mas é sobre a prioridade do encadeamento.
Além disso:
Se você estiver usando um Linux como controle no UV SGI e estiver usando os Bladecenters com ela no próprio kernel 4.15, poderá usar no momento:
Cremalheiras da lâmina 4096. 1 Rack usando 1024 núcleos x 4096 núcleos. Esta configuração será no momento o núcleo mais alto usando no Linux. Você pode controlar todos os núcleos no Red Hat.