Desempenho da rede Ubuntu em mais de 2k conexões

0

Estou usando uma máquina EC2 c3.8xlarge Ubuntu 14.04 LTS com mais de 3k threads simultaneamente, transferindo páginas da web uma após a outra.

Embora esta máquina deva ter um desempenho de rede de 10 Gb, não consigo fazer com que ela tenha um desempenho superior a 10 MB / s.

Existe alguma maneira de melhorar a velocidade de rede da minha máquina?

meu /etc/sysctl.conf

net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_syncookies = 0
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0
fs.file-max = 262144
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.conf.all.log_martians = 0
net.ipv4.ip_local_port_range = 1024 65000
net.core.somaxconn = 1024
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_mem = 16777216 16777216 16777216
net.ipv4.tcp_max_orphans = 262144
net.core.netdev_max_backlog = 2000
net.ipv4.route.flush=1 
    
por Sanaz Marshall 02.02.2016 / 20:47

1 resposta

0

% bl0ck_qu0te%

Existe o seu problema. Você precisa reprojetar seu aplicativo para não usar um número insano de threads, que estão competindo entre si por recursos. Veja io_submit() e amigos sobre como enviar ao kernel uma requisição de IO sem bloquear o encadeamento até que ele seja concluído. Você também pode usar setsockopt() para definir o tamanho do buffer do kernel para zero, para que ele não perca tempo copiando os dados entre seus buffers e os seus próprios. Obviamente, você precisará fornecer várias solicitações de E / S pendentes ao mesmo tempo, para que, assim que terminar uma, ela já tenha outra para passar para a conclusão. Ao fazer isso, você pode ter um único thread (ou um por núcleo cpu de qualquer forma) gerenciar todo o IO em milhares de conexões sem a sobrecarga de alternar entre milhares de threads.

    
por psusi 02.02.2016 / 21:20