Eu tenho um servidor web (dedicado) muito bom, com bons recursos de memória:
System information
Server load 2.19 (8 CPUs)
Memory Used 29.53% (4,804,144 of 16,267,652)
Swap Used 10.52% (220,612 of 2,097,136)
Como você pode ver, meu servidor está usando swap quando há muita memória livre disponível.
Isso é normal ou há algo errado com a configuração ou a codificação?
Nota:
meu processo MySQL está usando mais de 160% da energia da CPU por algum motivo; Não sei por que, mas não tenho mais de 70 usuários simultâneos ...
Respostas:
Isso é perfeitamente normal.
Na inicialização do sistema, vários serviços são iniciados. Esses serviços se inicializam, leem os arquivos de configuração, criam estruturas de dados e assim por diante. Eles usam um pouco de memória. Muitos desses serviços nunca serão executados novamente o tempo todo em que o sistema estiver funcionando porque você não os está usando. Alguns deles podem durar horas, dias ou semanas. No entanto, todos esses dados estão na memória física.
Obviamente, o sistema não pode jogar esses dados fora. Não é possível provar que nunca será acessado literalmente. Um desses serviços, por exemplo, pode ser o que fornece acesso remoto à caixa. Você pode não usá-lo em uma semana, mas se você usá-lo, é melhor trabalhar.
Mas o sistema sabe que talvez queira usar essa memória física para coisas como um cache de disco ou de outras maneiras que melhorem o desempenho. O mesmo acontece com a troca oportunista. Quando não tem nada melhor para fazer, grava dados que não são usados há muito tempo no disco, usando espaço de troca. No entanto, ainda mantém as páginas na memória física. Portanto, eles ainda podem ser acessados sem precisar trocá-los.
Agora, se o sistema mais tarde precisar dessa memória física para outra coisa, ele pode simplesmente jogar fora essas páginas porque já as escreveu para trocar. Isso dá ao sistema o melhor dos dois mundos. Os dados ainda são mantidos na memória, para que possam ser acessados sem a necessidade de lê-los no disco. Mas se o sistema precisar dessa memória para outro objetivo, não precisará escrevê-la primeiro. Grande vitória por toda parte.
fonte
Isso pode acontecer se em algum momento no passado você precisou de mais memória do que a RAM física na máquina. Nesse momento, alguns dados serão gravados no espaço de troca.
Quando a memória posterior é liberada, os dados do swap não são lidos automaticamente novamente na RAM: isso só acontece quando os dados no swap são realmente necessários por algum processo. Isso é perfeitamente normal.
Quanto ao seu processo mysql: tudo isso depende do tipo de consultas que você executa. Em teoria, 2 consultas muito complexas provavelmente seriam suficientes para obter essa carga, independentemente do número de usuários. Você pode habilitar o log lento de consultas para obter mais informações sobre quais consultas demandam muita carga.
fonte
Você também pode alterar esse comportamento
sysctl -w vm.swappiness=10
, o que reduzirá bastante o uso de troca até que seja realmente necessário.Quanto ao MySQL, você pelo menos realizou um teste de configuração de linha de base usando o script tuning-primer.sh ?
fonte
Provavelmente, como David explicou, é um comportamento normal do Kernel do Linux, mas também pode ser uma ocorrência do problema de “troca de insanidade” do MySQL . No seu caso (8 CPU, 16 GB RAM total, 5 GB usados), para que isso aconteça, seu computador deve ser um sistema NUMA com 4 nós (soquetes) e 4 GB de RAM por nó e um buffer pool do MySQL InnoDB de 4 GB.
Em resumo (você deve ler o link acima para obter detalhes completos), é isso que acontece:
Para evitar isso, altere a alocação de memória do MySQL para alocar RAM em todos os núcleos (veja o link acima para mais detalhes).
fonte