下载服务器中 tcp内核参数的一些调整
最近的下载服务器出现两个问题:1.out of socket
memory 2.last_ack状态过多。(我是使用nginx做下载容器)
1. 一看这个情况就知道发送的数据包超过了socket memory的设置;
通过以下几个内核参数对你的应用进行调控:(看字面就知道每个参数的意思了)
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max= 16777216
net.core.wmem_max= 16777216
net.ipv4.tcp_mem = 94500000 94500000 94500000
随着这些参数的调整可能出现以下的情况:(通过dmesg进行观察)
possible SYN flooding on port 80. Sending cookies
通过调整该net.ipv4.tcp_syncookies = 1参数 控制syn的状态
dmesg 中 出现XX messages
通过观察/proc/net/sockstat 中
sockets: used 9013
TCP: inuse 12649 orphan 3628 tw 5063 alloc 12666 mem 64324
的 orphan;然后进行调控,net.ipv4.tcp_max_orphans = 262144
tcp_max_orphans系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。
2.lack_ack过多
主要是调节 tcp_orphan_retries
/proc/sys/net/ipv4/tcp_orphan_retries
本端试图关闭TCP
连接之前重试多少次。缺省值是7,相当于50秒~16分钟(取决于RTO)。如果你的机器是一个重载的WEB服务器,你应该考虑减低这个值,因为这样的套
接字会消耗很多重要的资源。参见tcp_max_orphans。
同时根据其他情况进行调整其他参数。
PS:
在 ftp的情况下调整到2已经收到明显的效果了。
/proc/sys/net/ipv4/tcp_keepalive_time当
keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时。
/proc/sys/net/ipv4 /tcp_keepalive_intvl当探测没有确认时,重新发送探测的频度。缺省是75秒。
/proc/sys/net/ipv4
/tcp_keepalive_probes在认定连接失效之前,发送多少个TCP的keepalive探测包。缺省值是9。这个值乘以
tcp_keepalive_intvl之后决定了,一个连接发送了keepalive之后可以有多少时间没有回应。
/proc/sys/net/ipv4/tcp_max_orphans
系
统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单
的 DoS攻击,你绝对不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。 This limit exists only
to prevent simple DoS attacks, you _must_ not rely on this or lower the
limit artificially, but rather increase it (probably, after increasing
installed memory), if network conditions require more than default
value, and tune network services to linger and kill such states more
aggressively. 让我再次提醒你:每个孤儿套接字最多能够吃掉你64K不可交换的内存。
/proc/sys/net/ipv4/tcp_orphan_retries
本端试图关闭TCP连接之前重试多少次。缺省值是7,相当于50秒~16分钟(取决于RTO)。如果你的机器是一个重载的WEB服务器,你应该考虑减低这
个值,因为这样的套接字会消耗很多重要的资源。参见tcp_max_orphans。
/proc/sys/net/ipv4/tcp_max_syn_backlog
记
录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。如果服务器不堪重负,试
试提高这个值。注意!如果你设置这个值大于1024,最好同时调整include/net/tcp.h中的TCP_SYNQ_HSIZE,以保证
TCP_SYNQ_HSIZE*16 ≤tcp_max_syn_backlo,然后重新编译内核。
/proc/sys/net/ipv4/tcp_max_tw_buckets
系
统同时保持timewait套接字的最大数量。如果超过这个数字,time-wait套接字将立刻被清除并打印警告信息。这个限制仅仅是为了防止简单的
DoS攻击,你绝对不能过分依靠它或者人为地减小这个值,如果网络实际需要大于缺省值,更应该增加这个值(如果增加了内存之后)。
阅读(1719) | 评论(0) | 转发(0) |