Linux網卡調優篇-禁用ipv6與優化socket緩沖區大小
作者:尹正傑
版權聲明:原創作品,謝絕轉載!否則將追究法律責任。
一般在內網環境中,我們幾乎是用不到IPV6,因此我們沒有必要把多不用的功能開起來從而浪費不必要的資源。默認情況下,系統內核沒有針對快速的的大流量網絡傳輸進行優化,所以對於應用程序來說,一般需要對Linux系統的網絡棧進行調優,以實現對大流量的支持。
一.禁用IPv6圖解
1>.使用ifconfig查看網卡信息(如果沒有該工具,直接yum按照響應的工具包即可:[root@node118 ~]# yum -y install net-tools )
2>. 禁用IPV6的步驟
[root@node118 ~]# echo "net.ipv6.conf.all.disable_ipv6=1" >> /etc/sysctl.conf [root@node118 ~]# [root@node118 ~]# echo "NETWORKING_IPV6=no" >> /etc/sysconfig/network [root@node118 ~]# [root@node118 ~]# echo NETWORKING_IPV6=no >> /etc/sysconfig/network-scripts/ifcfg-bond0 [root@node118 ~]# [root@node118 ~]# sysctl -p net.ipv6.conf.all.disable_ipv6 = 1 [root@node118 ~]#
3>.執行上述命令后,再次查看bond0的網卡配置信息
二.socket讀寫緩沖區調優
實際上,調整Kafka的網絡配置與其他的配置是一樣的。首先可以對分配給socket讀寫緩沖區的內存大小作出調整,這樣可以顯著提升網絡的傳輸性能。
1>.默認的TCP數據發送窗口大小(字節)。
[root@yinzhengjie ~]# cat /proc/sys/net/core/wmem_default #對應net.core.wmem_default這個參數 212992 [root@yinzhengjie ~]# [root@yinzhengjie ~]# sysctl -q net.core.wmem_default net.core.wmem_default = 212992 [root@yinzhengjie ~]# [root@yinzhengjie ~]# [root@yinzhengjie ~]# echo "net.core.wmem_default=256960" >> /etc/sysctl.conf #我這里設置發送大小為256KB [root@yinzhengjie ~]# [root@yinzhengjie ~]# sysctl -p vm.swappiness = 1 vm.dirty_background_ratio = 5 vm.dirty_ratio = 80 net.ipv6.conf.all.disable_ipv6 = 1 net.core.wmem_default = 256960 [root@yinzhengjie ~]# [root@yinzhengjie ~]# sysctl -q net.core.wmem_default net.core.wmem_default = 256960 [root@yinzhengjie ~]# [root@yinzhengjie ~]#
2>.默認的TCP數據接收窗口大小(字節)。
[root@yinzhengjie ~]# cat /proc/sys/net/core/rmem_default #對應的參數是net.core.rmem_default 212992 [root@yinzhengjie ~]# [root@yinzhengjie ~]# sysctl -q net.core.rmem_default net.core.rmem_default = 212992 [root@yinzhengjie ~]# [root@yinzhengjie ~]# echo "net.core.rmem_default=256960" >> /etc/sysctl.conf #我這里接受大小設置的是256KB [root@yinzhengjie ~]# [root@yinzhengjie ~]# sysctl -p vm.swappiness = 1 vm.dirty_background_ratio = 5 vm.dirty_ratio = 80 net.ipv6.conf.all.disable_ipv6 = 1 net.core.wmem_default = 256960 net.core.rmem_default = 256960 [root@yinzhengjie ~]# [root@yinzhengjie ~]# [root@yinzhengjie ~]# sysctl -q net.core.rmem_default net.core.rmem_default = 256960 [root@yinzhengjie ~]#
3>.最大的TCP數據發送窗口(字節)。
[root@yinzhengjie ~]# cat /proc/sys/net/core/wmem_max #對應的參數是:net.core.wmem_max 212992 [root@yinzhengjie ~]# [root@yinzhengjie ~]# sysctl -q net.core.wmem_max net.core.wmem_max = 212992 [root@yinzhengjie ~]# [root@yinzhengjie ~]# [root@yinzhengjie ~]# echo "net.core.wmem_max=2097152" >> /etc/sysctl.conf #我這里將最大的TCP數據發送緩沖區最大值為2M [root@yinzhengjie ~]# [root@yinzhengjie ~]# sysctl -p vm.swappiness = 1 vm.dirty_background_ratio = 5 vm.dirty_ratio = 80 net.ipv6.conf.all.disable_ipv6 = 1 net.core.wmem_default = 256960 net.core.rmem_default = 256960 net.core.wmem_max = 2097152 [root@yinzhengjie ~]# [root@yinzhengjie ~]# sysctl -q net.core.wmem_max net.core.wmem_max = 2097152 [root@yinzhengjie ~]#
4>.最大的TCP數據接收窗口(字節)。
[root@yinzhengjie ~]# cat /proc/sys/net/core/rmem_max #對應參數是:net.core.rmem_max 212992 [root@yinzhengjie ~]# [root@yinzhengjie ~]# [root@yinzhengjie ~]# sysctl -q net.core.rmem_max net.core.rmem_max = 212992 [root@yinzhengjie ~]# [root@yinzhengjie ~]# [root@yinzhengjie ~]# echo "net.core.rmem_max=2097152" >> /etc/sysctl.conf #我這里將TCP數據接受緩沖區的最大值設置為2M [root@yinzhengjie ~]# [root@yinzhengjie ~]# sysctl -p vm.swappiness = 1 vm.dirty_background_ratio = 5 vm.dirty_ratio = 80 net.ipv6.conf.all.disable_ipv6 = 1 net.core.wmem_default = 256960 net.core.rmem_default = 256960 net.core.wmem_max = 2097152 net.core.rmem_max = 2097152 [root@yinzhengjie ~]# [root@yinzhengjie ~]# sysctl -q net.core.rmem_max net.core.rmem_max = 2097152 [root@yinzhengjie ~]#
溫馨提示:最大值並不意味着每個socket一定要有這么大大緩沖空間,只是說在必要大情況下才會達到這個值。
三.TCP socket的讀寫緩沖區調優
除了設置socket外,我們還需要設置TCP socket的讀寫緩沖區。
1>.為自動調優定義socket使用的發送內存(寫)。
[root@yinzhengjie ~]# cat /proc/sys/net/ipv4/tcp_wmem #對應參數:net.ipv4.tcp_wmem 4096 16384 4194304 [root@yinzhengjie ~]# [root@yinzhengjie ~]# sysctl -q net.ipv4.tcp_wmem net.ipv4.tcp_wmem = 4096 16384 4194304 #第一個值是為socket發送緩沖區分配的最少字節數;第二個值是默認值(該值會被wmem_default覆蓋),緩沖區在系統負載不重的情況下可以增長到這個值;第三個值是發送緩沖區空間的最大字節數(該值會被wmem_max覆蓋)。 [root@yinzhengjie ~]# [root@yinzhengjie ~]# [root@yinzhengjie ~]# echo "net.ipv4.tcp_wmem=8760 256960 4088000" >> /etc/sysctl.conf #根據服務接受的實際情況,可能需要設置更高的最大值,為網絡鏈接提供更大的緩存空間。 [root@yinzhengjie ~]# [root@yinzhengjie ~]# sysctl -p vm.swappiness = 1 vm.dirty_background_ratio = 5 vm.dirty_ratio = 80 net.ipv6.conf.all.disable_ipv6 = 1 net.core.wmem_default = 256960 net.core.rmem_default = 256960 net.core.wmem_max = 2097152 net.core.rmem_max = 2097152 net.ipv4.tcp_wmem = 8760 256960 4088000 [root@yinzhengjie ~]# [root@yinzhengjie ~]# sysctl -q net.ipv4.tcp_wmem net.ipv4.tcp_wmem = 8760 256960 4088000 [root@yinzhengjie ~]#
2>. 為自動調優定義socket使用的接受內存(讀)。
[root@yinzhengjie ~]# cat /proc/sys/net/ipv4/tcp_rmem #對應參數為:net.ipv4.tcp_rmem 4096 87380 6291456 [root@yinzhengjie ~]# [root@yinzhengjie ~]# sysctl -q net.ipv4.tcp_rmem net.ipv4.tcp_rmem = 4096 87380 6291456 #第一個值是為socket接收緩沖區分配的最少字節數;第二個值是默認值(該值會被rmem_default覆蓋),緩沖區在系統負載不重的情況下可以增長到這個值;第三個值是接收緩沖區空間的最大字節數(該值會被rmem_max覆蓋)。 [root@yinzhengjie ~]# [root@yinzhengjie ~]# echo "net.ipv4.tcp_rmem=8760 256960 4088000" >> /etc/sysctl.conf [root@yinzhengjie ~]# [root@yinzhengjie ~]# sysctl -p vm.swappiness = 1 vm.dirty_background_ratio = 5 vm.dirty_ratio = 80 net.ipv6.conf.all.disable_ipv6 = 1 net.core.wmem_default = 256960 net.core.rmem_default = 256960 net.core.wmem_max = 2097152 net.core.rmem_max = 2097152 net.ipv4.tcp_wmem = 8760 256960 4088000 net.ipv4.tcp_rmem = 8760 256960 4088000 [root@yinzhengjie ~]# [root@yinzhengjie ~]# sysctl -q net.ipv4.tcp_rmem net.ipv4.tcp_rmem = 8760 256960 4088000 [root@yinzhengjie ~]#
根據kafka服務器接受不了流量的實際情況,可能需要設置更高的最大值,為網絡鏈接提供更大的緩沖空間。
四.其他網絡參數調優
[root@yinzhengjie ~]# echo "net.ipv4.tcp_window_scaling=1" >> /etc/sysctl.conf # 啟用RFC 1323定義的window scaling,要支持超過64KB的TCP窗口,必須啟用該值(1表示啟用),TCP窗口最大至1GB,TCP連接雙方都啟用時才生效。 [root@yinzhengjie ~]# echo "net.ipv4.tcp_max_syn_backlog=2048" >> /etc/sysctl.conf #每一個連接請求(SYN報文)都需要排隊,直至本地服務器接收,該變量就是控制每個端口的 TCP SYN隊列長度的。如果連接請求多余該值,則請求會被丟棄。 [root@yinzhengjie ~]# echo "net.core.netdev_max_backlog=2000" >> /etc/sysctl.conf #該參數定義了當接口收到包的速率大於內核處理包的速率時,設備的輸入隊列中的最大報文數。 [root@yinzhengjie ~]# echo "net.ipv4.tcp_sack=1" >> /etc/sysctl.conf #管理TCP的選擇性應答,允許接收端向發送端傳遞關於字節流中丟失的序列號,減少了段丟失時需要重傳的段數目,當段丟失頻繁時,sack是很有益的。 [root@yinzhengjie ~]# echo "net.ipv4.tcp_fack=1">> /etc/sysctl.conf #啟用轉發應答,可以進行有選擇應答(SACK)從而減少擁塞情況的發生,這個選項也應該啟用。 [root@yinzhengjie ~]# echo "net.ipv4.tcp_tw_recycle=1">> /etc/sysctl.conf #能夠更快地回收TIME-WAIT套接字,默認是0。 [root@yinzhengjie ~]# echo "net.ipv4.tcp_timestamps=0" >> /etc/sysctl.conf #表示不再檢查時間戳,默認值是開啟的。發現tcp_timestamps默認是開啟,如果再把tcp_tw_recycle設置為1,則60s內同一源ip主機的socket connect請求中的timestamp必須是遞增的。也就是說服務器打開了 tcp_tw_reccycle了,就會檢查時間戳,如果對方發來的包的時間戳是亂跳的或者說時間戳是滯后的,這樣服務器肯定不會回復,所以服務器就把帶了“倒退”的時間戳的包當作是“recycle的tw連接的重傳數據,不是新的請求”,於是丟掉不回包,就出現了開始說的syn不響應。