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