zoukankan      html  css  js  c++  java
  • 关于高负载服务器Kernel的ipv4的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

  • 相关阅读:
    浏览器兼容
    jquery 判断网络资源,网络文件是否存在
    [Maven] 变态问题收集
    maven project中,在main方法上右键Run as Java Application时,提示错误:找不到或无法加载主类XXX.XXXX.XXX
    maven install Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.1.1:war (default-war) on project web_nanchang
    java 获取文件列表,并按照文件名称排序
    maven install时报错Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile
    tar 命令基本使用(加密)
    八卦某 G 的前端开发方式及流程
    use mkisofs 重新打包beini,tinycore linux
  • 原文地址:https://www.cnblogs.com/keyi/p/11684339.html
Copyright © 2011-2022 走看看