(Resposta sinônima, mas adicionando algumas informações de diagnóstico e palavras-chave de pesquisa.)
Sintomas
O problema em questão é que nenhum novo soquete não-TCP pode ser criado, o que significa principalmente soquetes de domínio Unix usados para comunicação entre processos no sistema. Pode não ser reproduzível sempre, pois às vezes alguns soquetes são excluídos, abrindo algumas opções para criar novos soquetes abaixo do limite.
Os sintomas não estão restritos ao uso de sudo
, mas afetarão a maioria ou todos os sites em execução no servidor e o uso do MySQL por meio de uma conexão de soquete. Mensagens de erro seriam assim:
PDOException: SQLSTATE[HY000] [2001] Can't create UNIX socket (12) in […]
PDOException: SQLSTATE[HY000] [2002] Can't connect to local MySQL server
through socket '/var/run/mysqld/mysqld.sock' (12) in […]
PHP Warning: mysqli_connect(): (HY000/2001): Can't create UNIX socket
(12) in […]
PHP Warning: mysqli_connect(): (HY000/2002): Can't connect to local MySQL
server through socket '/var/run/mysqld/mysqld.sock' (12) in […]
Além disso, enviar e buscar e-mails através de postfix
resp. O dovecot
server provavelmente também falhará no estágio de login. Mensagens de erro incluem:
mailq: fatal: inet_addr_local[getifaddrs]: getifaddrs: Cannot allocate memory
O elemento comum nesses erros é o código de erro 12, que significa "código de erro do sistema operacional 12: não é possível alocar memória", conforme perror 12
[ fonte ].
Solução
Veja a saída de cat /proc/user_beancounters
, que mostra os limites do ambiente de virtualização do OpenVZ do seu VPS. Com toda a probabilidade, você verá um grande número de falhas para o limite de recursos numothersock
(> 10.000 para mim). Isso significa que um software tentou criar um soquete, mas foi proibido pelo OpenVZ de fazê-lo porque o número máximo de soquetes não-TCP já existia.
Para ver o número e o uso de todos os soquetes contados nesse limite de recursos numothersock
, observe o arquivo de saída gerado por:
ss --processes --all --socket=udp,unix,unix_dgram,unix_stream > results.txt
No meu caso, mostrou que cerca de 80% dos sockets estavam relacionados aos processos postfix e dovecot. Os soquetes relacionados ao postfix podem ser reduzidos para cerca de 10%, limitando o número de conexões simultâneas do padrão 100 para um razoável 10 - veja as instruções . Depois de aplicar essa solução ao postfix ( default_process_limit = 10
) e reiniciá-la, meus soquetes em uso foram de ~ 1020 para ~ 520 imediatamente. Problema resolvido por enquanto.