Designando Processos aos Núcleos da CPU

4

Eu tenho acesso a um servidor web do CentOS 6 (um fórum PHP / MySQL) rodando o Apache 2.2.15 e o MySQL 5.1.52. Esta caixa tem dual Xeons oct-core.

O que eu acho olhando os gráficos da CPU é que os dois primeiros núcleos (0 e 1) atingem 90% de uso enquanto os outros quatorze estão atingindo apenas 30-40% de uso. Core 8, que eu acredito ser o primeiro núcleo do segundo processador, veja o alto uso (até 90%) mas, como mencionado, todos os outros são baixos.

O Apache gera cerca de 20 processos e suspeito que, em seu estado padrão, ele não possa entender e usar todos os núcleos naturalmente. Este deve ser o trabalho de kernels eu acho (alguém pode confirmar?). No entanto, com esses núcleos maximizando, há uma queda de desempenho notável, apesar da reserva de RAM e E / S de disco.

Existe algo que eu possa ajustar no Apache para "torná-lo ciente" de todos os outros núcleos, ou talvez um peramater do kernel para designar certos processos para certos núcleos? Posso excluir núcleos 0 e 1, por exemplo, de serem usados para o Apache e o MySQL?

    
por jwbensley 01.01.2012 / 14:19

3 respostas

3

Afinidade do processo de ajuste com o taskset

por exemplo, atribua o processo atual ao cpu-core 0,1,3

$ taskset -cp 0,1,3 $$

lista de afinidade atual do pid 21698: 0-7

nova lista de afinidades do pid 21698: 0,1,3

Isole as CPUs para executar apenas um processo específico. O parâmetro do kernel “isolcpus” pode isolar determinadas CPUs de outras tarefas. Juntamente com o taskset, você pode ter CPUs específicas para executar apenas tarefas designadas. Por exemplo, "isolcpus = 2,3" no grub.conf irá isolar a CPU 2 e 3.

link

    
por 28.01.2012 / 13:22
5

Nem todo o tráfego de aplicativos é altamente paralelizável. Nós temos uma aplicação web internamente que é resolutamente single-threaded, mesmo quando rodando em um monstro de 24 núcleos. No nosso caso, o web-server terá todo o prazer em usar tantos núcleos quanto nós lançamos para servidores estáticos; mas quando ligado a um servidor de aplicativos específico, ele fica com um.

Se observarmos o uso por núcleo quando esse processo de encadeamento único estiver em execução, cada núcleo será executado na porcentagem de 100 * (1 / n). O kernel está movendo a carga entre vários núcleos como deveria, mas somente 100% da capacidade de um processador é usada.

No nosso caso, estamos executando uma pilha LAMx. Onde (x) é indefinido nesta resposta. Como se vê, o que (x) representa é bastante importante. Então, sim, a capacidade de usar muitos núcleos depende de todas as etapas da pilha, não apenas das partes do LAM.

    
por 01.01.2012 / 15:32
2

Na verdade, é tarefa do kernel agendar tarefas. Em um ambiente multi core, às vezes (mas nem sempre), acontece que o kernel atribui trabalho a todos os núcleos, mas em um ou dois núcleos todos os processos pesados como o apache são atribuídos.
Idealmente, seu kernel já deve estar ciente de que existem vários núcleos em sua máquina. Ainda execute o seguinte para confirmar como superusuário:

dmidecode|grep Core

Na minha máquina dual core, diz:

Version: Intel(R) Core(TM) i5-2410M CPU @ 2.30GHz
Core Count: 2
Core Enabled: 2
    
por 01.01.2012 / 14:35