Ubuntu 在超过 2k 个连接上的网络性能

Ubuntu 在超过 2k 个连接上的网络性能

我正在使用一台 EC2 c3.8xlarge Ubuntu 14.04 LTS 机器,该机器有超过 3k 个线程同时接连下载网页。

虽然这台机器应该有10Gb的网络性能,但我无法让它的性能高于10MB/s。

有什么方法可以提高我的机器的网络速度吗?

我的 /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 

答案1

同时运行 3k 个线程

这就是你的问题。你需要重新设计你的应用程序,不要使用大量的线程,因为这些线程都在相互竞争资源。请参阅io_submit()和朋友如何向内核发送 IO 请求而不阻塞线程直到它完成。你还可以使用setsockopt()将内核缓冲区大小设置为零,这样它就不会浪费时间在你的缓冲区和它自己的缓冲区之间来回复制数据。当然,你需要确保同时给它多个待处理的 IO 请求,这样一旦它完成一个请求,它就会有另一个请求要继续完成。通过这样做,你可以让一个线程(或者每个 CPU 核心一个线程)管理数千个连接上的所有 IO,而无需在数千个线程之间切换的开销。

相关内容