Otimização do Kernel Linux
Para que o sistema suporte uma maior concorrência, além de ser necessário instalar a extensão event, a otimização do kernel linux também é fundamental. As seguintes otimizações são muito, muito importantes, e devem ser realizadas uma a uma.
Explicação dos parâmetros:
max-file: refere-se ao número de descritores de arquivo que podem ser abertos a nível sistêmico. Este valor é em relação a todo o OS, e não a um usuário específico.
ulimit -n: refere-se ao controle do número de descritores de arquivo que podem ser abertos a nível de processo. Este valor controla os descritores de arquivo disponíveis para o usuário atual do
shelle para os processos que ele inicia.
Verifique o número de descritores de arquivo que podem ser abertos a nível sistêmico: cat /proc/sys/fs/file-max
Abra o arquivo /etc/sysctl.conf e adicione as seguintes configurações:
# Este parâmetro define o número de conexões em TIME_WAIT; se exceder o valor padrão, será imediatamente limpo
net.ipv4.tcp_max_tw_buckets = 20000
# Define o comprimento máximo da fila de escuta para cada porta no sistema; é um parâmetro global
net.core.somaxconn = 65535
# Número máximo de pedidos de conexão que podem ser mantidos na fila sem confirmação do destinatário
net.ipv4.tcp_max_syn_backlog = 262144
# Quando a taxa de recebimento de pacotes em cada interface de rede é maior que a taxa de processamento do kernel, permite o número máximo de pacotes na fila
net.core.netdev_max_backlog = 30000
# Esta opção fará com que clientes em rede NAT expirem rapidamente; recomenda-se definir como 0. O Linux removeu a configuração tcp_tw_recycle a partir do kernel 4.12; se ocorrer o erro "No such file or directory", ignore
net.ipv4.tcp_tw_recycle = 0
# Número total de arquivos que todos os processos do sistema podem abrir
fs.file-max = 6815744
# Tamanho da tabela de rastreamento do firewall. Atenção: se o firewall não estiver ativo, aparecerá a mensagem de erro: "net.netfilter.nf_conntrack_max" is an unknown key; basta ignorar
net.netfilter.nf_conntrack_max = 2621440
net.ipv4.ip_local_port_range = 10240 65000
Execute sysctl -p para que as alterações tenham efeito imediato.
Observação:
Há muitas opções que podem ser configuradas em /etc/sysctl.conf; as outras opções podem ser ajustadas conforme as necessidades do seu ambiente.
Número de Arquivos Abertos
Defina as configurações do número de arquivos abertos do sistema para resolver o problema de too many open files em condições de alta concorrência. Esta opção influencia diretamente o número de conexões de cliente que um único processo pode manter.
Soft open files é um parâmetro do sistema Linux que afeta o número máximo de descritores de arquivo que um único processo pode abrir. Este valor impacta aplicativos de longo prazo, como o chat, no número de conexões de usuário que um único processo pode manter. Executar ulimit -n mostrará este valor; se for 1024, significa que um único processo só pode manter no máximo 1024 conexões ao mesmo tempo (na verdade, até menos, pois outros descritores de arquivo também estão abertos). Se quatro processos estiverem mantendo conexões de usuários, o número total de conexões que o aplicativo pode manter não excederá 4 * 1024, ou seja, no máximo, apenas 4x1024 usuários podem estar online. Este valor pode ser aumentado para permitir que o serviço mantenha mais conexões TCP.
Três métodos para alterar Soft open files:
Primeiro: Execute diretamente no terminal ulimit -HSn 102400, e reinicie o workerman.
Isso só será válido no terminal atual; ao sair, o número de arquivos abertos volta ao valor padrão.
Segundo: Adicione uma linha ao final do arquivo /etc/profile com ulimit -HSn 102400; assim, sempre que você fazer login no terminal, essa configuração será aplicada automaticamente. Após a alteração, o workerman deve ser reiniciado.
Terceiro: Para que a modificação no número de arquivos abertos tenha um efeito permanente, você deve editar o arquivo de configuração: /etc/security/limits.conf. Adicione as seguintes linhas ao final do arquivo:
* soft nofile 1024000
* hard nofile 1024000
root soft nofile 1024000
root hard nofile 1024000
Esta abordagem requer um reinício do servidor para ter efeito.