關於高負載服務器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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM