關於高負載伺服器Kernel的TCP引數優化

2021-09-22 09:20:37 字數 2326 閱讀 3102

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

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 }

參考對於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佇列被佔滿

高負載伺服器效能分析命令

1.檢視埠總連線書 quote netstat an grep 9003 grep established wc l quote 2.輸出每個ip的連線數,以及總的各個狀態的連線數 quote netstat n grep 9003 awk tcp end printf 20s s n total ...

關於伺服器模型與負載

聽到過12306春節 崩了,聽說啊裡每秒種能處理多少多少資料,對於普通人毫無概念,其實對於內門人估計沒什麼概念。現在只是記錄乙個我個人的理解,在此別噴,當我放p。首先應該建立乙個概念 1 伺服器能跑多快?用什麼恒量?2 每處理乙個客戶要占用伺服器多長時間?比如,1.0 伺服器每秒100萬條指令 2....

關於伺服器的負載均衡問題

即為多個不同的ip位址配置同乙個網域名稱,這樣不同的客戶機訪問同乙個域字的時候就會得到不同的ip位址。使得不同的客戶端訪問不同的伺服器,從而達到負載均衡的目的。一般採取輪詢訪問演算法。優點 簡單實用,伺服器的設定位置靈活。缺點 為了使本地dns和其他dns及時互動,保證dns資料及時更新使位址隨機分...