net.ipv4.tcp_memhtml
内核分配给TCP链接的内存,单位是Page,1 Page = 4096 Bytes,可用命令查看:web
#getconf PAGESIZE服务器
4096cookie
net.ipv4.tcp_mem = 196608 262144 393216网络
第一个数字表示,当 tcp 使用的 page 少于 196608 时,kernel 不对其进行任何的干预socket
第二个数字表示,当 tcp 使用了超过 262144 的 pages 时,kernel 会进入 “memory pressure” 压力模式tcp
第三个数字表示,当 tcp 使用的 pages 超过 393216 时(至关于1.6GB内存),就会报:Out of socket memoryatom
以上数值适用于4GB内存机器,对于8GB内存机器,建议用如下参数:spa
net.ipv4.tcp_mem = 524288 699050 1048576 (TCP链接最多约使用4GB内存).net
net.ipv4.tcp_rmem 和 net.ipv4.tcp_wmem
为每一个TCP链接分配的读、写缓冲区内存大小,单位是Byte
net.ipv4.tcp_rmem = 4096 8192 4194304
net.ipv4.tcp_wmem = 4096 8192 4194304
第一个数字表示,为TCP链接分配的最小内存
第二个数字表示,为TCP链接分配的缺省内存
第三个数字表示,为TCP链接分配的最大内存
通常按照缺省值分配,上面的例子就是读写均为8KB,共16KB
1.6GB TCP内存能容纳的链接数,约为 1600MB/16KB = 100K = 10万
4.0GB TCP内存能容纳的链接数,约为 4000MB/16KB = 250K = 25万
net.ipv4.tcp_max_orphans
最大孤儿套接字(orphan sockets)数,单位是个
net.ipv4.tcp_max_orphans = 65536
表示最多65536个
注意:当cat /proc/net/sockstat看到的orphans数量达到net.ipv4.tcp_max_orphans的约一半时,就会报:Out of socket memory
详见kernel源码:
include/net/tcp.h:
268 static inline bool tcp_too_many_orphans(struct sock *sk, int shift)
269 {
270 struct percpu_counter *ocp = sk->sk_prot->orphan_count;
271 int orphans = percpu_counter_read_positive(ocp);
272
273 if (orphans << shift > sysctl_tcp_max_orphans) {
274 orphans = percpu_counter_sum_positive(ocp);
275 if (orphans << shift > sysctl_tcp_max_orphans)
276 return true;
277 }
278
279 if (sk->sk_wmem_queued > SOCK_MIN_SNDBUF &&
280 atomic_long_read(&tcp_memory_allocated) > sysctl_tcp_mem[2])
281 return true;
282 return false;
283 }
参考http://blog.tsunanet.net/2011/03/out-of-socket-memory.html
对于net.ipv4.tcp_max_orphans = 65536,当orphans达到32768个时,会报Out of socket memory,此时占用内存 32K*64KB=2048MB=2GB
(每一个孤儿socket可占用多达64KB内存),实际可能小一些
net.ipv4.tcp_orphan_retries
孤儿socket废弃前重试的次数,重负载web服务器建议调小
net.ipv4.tcp_orphan_retries = 1
设置较小的数值,能够有效下降orphans的数量(net.ipv4.tcp_orphan_retries = 0并非想像中的不重试)
net.ipv4.tcp_retries2
活动TCP链接重传次数,超过次数视为掉线,放弃链接。缺省值:15,建议设为 2或者3.
net.ipv4.tcp_synack_retries
TCP三次握手的syn/ack阶段,重试次数,缺省5,设为2-3
net.ipv4.tcp_fin_timeout = 30
FIN_WAIT状态的TCP链接的超时时间
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
TIME_WAIT状态的socket快速回收,循环使用
net.ipv4.tcp_max_syn_backlog = 4096
TCP链接SYN队列大小
net.core.netdev_max_backlog = 2048
网络设备的收发包的队列大小
net.ipv4.tcp_syncookies = 1
TCP SYN Cookies,防范DDOS攻击,防止SYN队列被占满
参考文献:
http://jaseywang.me/2012/05/09/%E5%85%B3%E4%BA%8E-out-of-socket-memory-%E7%9A%84%E8%A7%A3%E9%87%8A-2/
http://blog.tsunanet.net/2011/03/out-of-socket-memory.html
http://rdc.taobao.com/blog/cs/?p=1062