耗尽Linux机器TCP套接字限制(〜70k)?

我是torservers.net的创始人,这是一个运行Tor出口节点的非营利组织。 我们有许多Gbit连接和多个IP的机器,而且我们似乎在所有这些机器上打开了一个TCP套接字的限制。 我们总共徘徊了约70k的TCP连接总数(约10-15k每个IP),并且Tor正在疯狂logging“Error binding network socket:Address already in use”。 有没有解决scheme? BSD遭受同样的问题吗?

我们运行Tor进程,每个人都听一个不同的IP。 例:

# NETSTAT=`netstat -nta` # echo "$NETSTAT" | wc -l 67741 # echo "$NETSTAT" | grep ip1 | wc -l 19886 # echo "$NETSTAT" | grep ip2 | wc -l 15014 # echo "$NETSTAT" | grep ip3 | wc -l 18686 # echo "$NETSTAT" | grep ip4 | wc -l 14109 

我已经应用了我可以在互联网上find的调整:

 # cat /etc/sysctl.conf net.ipv4.ip_forward = 0 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syn_retries = 2 net.ipv4.conf.default.forwarding = 0 net.ipv4.conf.default.proxy_arp = 0 net.ipv4.conf.default.send_redirects = 1 net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.all.send_redirects = 0 kernel.sysrq = 1 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.icmp_ignore_bogus_error_responses = 1 net.core.rmem_max = 33554432 net.core.wmem_max = 33554432 net.ipv4.tcp_rmem = 4096 87380 33554432 net.ipv4.tcp_wmem = 4096 65536 33554432 net.core.netdev_max_backlog = 262144 net.ipv4.tcp_no_metrics_save = 1 net.ipv4.tcp_moderate_rcvbuf = 1 net.ipv4.tcp_orphan_retries = 2 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 0 net.ipv4.tcp_max_orphans = 262144 net.ipv4.tcp_max_syn_backlog = 262144 net.ipv4.tcp_fin_timeout = 4 vm.min_free_kbytes = 65536 net.ipv4.netfilter.ip_conntrack_max = 196608 net.netfilter.nf_conntrack_tcp_timeout_established = 7200 net.netfilter.nf_conntrack_checksum = 0 net.netfilter.nf_conntrack_max = 196608 net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 15 net.nf_conntrack_max = 196608 net.ipv4.tcp_keepalive_time = 60 net.ipv4.tcp_keepalive_intvl = 10 net.ipv4.tcp_keepalive_probes = 3 net.ipv4.ip_local_port_range = 1025 65535 net.core.somaxconn = 262144 net.ipv4.tcp_max_tw_buckets = 2000000 net.ipv4.tcp_timestamps = 0 # sysctl fs.file-max fs.file-max = 806854 # ulimit -n 500000 # cat /etc/security/limits.conf * soft nofile 500000 * hard nofile 500000 

如果有进程绑定到INADDR_ANY ,那么有些系统将尝试从49152到65535范围内select端口。这可能会占用您的〜15k限制,因为范围正好是16384个端口。

维基百科:短暂的港口

您可以通过查找适用于您的操作系统的说明来扩展此范围:

临时端口范围

这是TCP协议的限制。 该端口是一个无符号短整型(0-65535)。 解决scheme是使用不同的IP地址。

如果软件无法更改,则可以使用虚拟化。 创build桥接(不是NAT),并使用公共IP的虚拟机,以便他们以后不会被NAT。

使用netstat检查侦听器在接口上使用IP,而不是所有地址(0.0.0.0):

 sudo netstat -tulnp|grep '0\.0\.0\.0'