关于高负载服务器Kernel的TCP参数优化

net.ipv4.tcp_mem

内核分配给TCP连接的内存,单位是Page,1 Page = 4096 Bytes,可用命令查看:

  #getconf PAGESIZE

  4096

  net.ipv4.tcp_mem = 196608       262144  393216

  第一个数字表示,当 tcp 使用的 page 少于 196608 时,kernel 不对其进行任何的干预

  第二个数字表示,当 tcp 使用了超过 262144 的 pages 时,kernel 会进入 “memory pressure” 压力模式

  第三个数字表示,当 tcp 使用的 pages 超过 393216 时(相当于1.6GB内存),就会报:Out of socket memory

  以上数值适用于4GB内存机器,对于8GB内存机器,建议用以下参数:

  net.ipv4.tcp_mem = 524288     699050  1048576  (TCP连接最多约使用4GB内存)

 

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

posted @ 2016-07-01 09:22 94cool 阅读(...) 评论(...) 编辑 收藏