Linux下內核socket優化項

vi /etc/sysctl.conf
net.core.netdev_max_backlog = 30000 每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目

net.core.somaxconn = 262144 用來限制監聽(LISTEN)隊列最大數據包的數量,超過這個數量就會導致鏈接超時或者觸發重傳機制
net.core.rmem_default = 8388608 接收套接字緩衝區大小的默認值(以字節爲單位)
net.core.wmem_default = 8388608 發送套接字緩衝區大小的默認值(以字節爲單位)
net.core.rmem_max=16777216 接收套接字緩衝區大小的最大值(以字節爲單位)
net.core.wmem_max=16777216 發送套接字緩衝區大小的最大值(以字節爲單位)
net.ipv4.ip_local_port_range = 1024 65536 用於向外連接的端口範圍
net.ipv4.tcp_mem = 786432 1048576 1572864 確定 TCP 棧應該如何反映內存使用,此處分別爲3G、4G、6G;每個值的單位都是內存頁(通常是 4KB)。第一個值是內存使用的下限。第二個值是內存壓力模式開始對緩衝區使用應用壓力的上限。第三個值是內存上限。在這個層次上可以將報文丟棄,從而減少對內存的使用。
net.ipv4.tcp_rmem=4096 87380 16777216 TCP接收緩衝區,3個字段分別是min,default,max。Min:爲TCP socket預留用於接收緩衝的內存數量,即使在內存出現緊張情況下TCP socket都至少會有這麼多數量的內存用於接收緩衝。
  Default: 爲TCP socket預留用於接收緩衝的內存數量,默認情況下該值影響其它協議使用的 net.core.wmem中default的值。該值決定了 在tcp_adv_win_scale、tcp_app_win和tcp_app_win的 默認值情況下,TCP 窗口大小爲65535。
  Max:爲TCP socket預留用於接收緩衝的內存最大值。該值不會影響 net.core.wmem中max的值
net.ipv4.tcp_wmem=4096 65536 16777216 TCP發送緩衝區,3個字段分別是min,default,max。Min:爲TCP socket預留用於發送緩衝的內存最小值。每個TCP socket都可以使用它。
  Default:爲TCP socket預留用於發送緩衝的內存數量,默認情況下該值會影響其它協議使用的net.core.wmem中default的 值,一般要低於net.core.wmem中default的值。
  Max:爲TCP socket預留用於發送緩衝的內存最大值。該值不會影響net.core.wmem_max
net.ipv4.tcp_fin_timeout = 10 如果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間。對端可以出錯並永遠不關閉連接,甚至意外當機。缺省值是60 秒
net.ipv4.tcp_tw_recycle = 1 開啓TCP連接中TIME-WAIT sockets的快速回收,默認爲0,表示關閉
net.ipv4.tcp_tw_reuse = 1 表示是否允許重新應用處於TIME-WAIT狀態的socket用於新的TCP連接。
net.ipv4.tcp_max_tw_buckets = 6000 系統在同時所處理的最大timewait sockets 數目。如果超過此數的話,time-wait socket 會被立即砍除並且顯示警告信息。之所以要設定這個限制,純粹爲了抵禦那些簡單的 DoS 攻擊,千萬不要人爲的降低這個限制,不過,如果網絡條件需要比默認值更多,則可以提高它(或許還要增加內存)
net.ipv4.tcp_timestamps = 0 時間戳可以避免序列號的卷繞。一個1Gbps 的鏈路肯定會遇到以前用過的序列號。時間戳能夠讓內核接受這種“異常”的數據包。這裏需要將其關掉。
net.ipv4.tcp_window_scaling = 1 支持更大的TCP窗口. 如果TCP窗口最大超過65535(64KB), 必須設置該數值爲1。
net.ipv4.tcp_sack = 1 表示是否啓用有選擇的應答(Selective Acknowledgment),這可以通過有選擇地應答亂序接收到的報文來提高性能(這樣可以讓發送者只發送丟失的報文段);(對於廣域網通信來說)這個選項應該啓用,但是這會增加對 CPU 的佔用
net.ipv4.tcp_no_metrics_save=1 默認情況下一個tcp連接關閉後,把這個連接曾經有的參數比如慢啓動門限snd_sthresh,擁塞窗口snd_cwnd 還有srtt等信息保存到dst_entry中, 只要dst_entry 沒有失效,下次新建立相同連接的時候就可以使用保存的參數來初始化這個連接.通常情況下是關閉的。
net.ipv4.tcp_keepalive_time = 1200 當keepalive起用的時候,TCP發送keepalive消息的頻度。缺省是2小時,改爲20分鐘
net.ipv4.tcp_syncookies = 1 當出現SYN等待隊列溢出時,啓用cookies來處理,可防範少量SYN攻擊,默認爲0,表示關閉
net.ipv4.tcp_max_orphans = 262144 系統中最多有多少個TCP 套接字不被關聯到任何一個用戶文件句柄上。如果超過這個數字,孤兒連接將即刻被複位並打印出警告信息。這個限制僅僅是爲了防止簡單的DoS 攻擊,不能過分依靠它或者人爲地減小這個值,更應該增加這個值(如果增加了內存之後)。
net.ipv4.tcp_max_syn_backlog = 262144 表示那些尚未收到客戶端確認信息的連接(SYN消息)隊列的長度,默認爲1024,加大隊列長度爲262144,可以容納更多等待連接的網絡連接數。
net.ipv4.tcp_synack_retries = 2 爲了打開對端的連接,內核需要發送一個SYN 並附帶一個迴應前面一個SYN 的ACK。也就是所謂三次握手中的第二次握手。這個設置決定了內核放棄連接之前發送SYN+ACK 包的數量。
net.ipv4.tcp_syn_retries = 2 在內核放棄建立連接之前發送SYN 包的數量

web服務器收到了大量的連接,在啓用了iptables的情況下,iptables會把所有的連接都做鏈接跟蹤處理,這樣iptables就會有一個鏈接跟蹤表
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=1800 鏈接跟蹤表保存時間,單位:秒
net.ipv4.netfilter.ip_conntrack_max=131070 鏈接跟蹤表最大數目

kernel.sysrq = 0 允許按住Alt + PrtSc鍵打印內核信息,除非是調試,一般要關閉此功能
kernel.core_uses_pid = 1 控制core文件的文件名中是否添加pid作爲擴展。文件內容爲1,表示添加pid作爲擴展名,生成的core文件格式爲core.xxxx;爲0則表示生成的core文件同一命名爲core
kernel.msgmnb = 65536 每個消息隊列的最大字節限制。
kernel.msgmax = 65536 從一個進程發送到另一個進程的消息的最大長度(bytes)。進程間的消息傳遞是在內核的內存中進行的,不會交換到磁盤上,所以如果增加該值,則將增加操作系統所使用的內存數量。
kernel.shmmax = 68719476736 表示內核所允許的最大共享內存段的大小(bytes)
kernel.shmall = 4294967296 系統上可以使用的共享內存的總量(bytes)
kernel.randomize_va_space = 1 將該值設置爲 0 可禁用地址空間佈局隨機化。DB2 數據服務器依賴特定共享內存對象的固定地址,地址空間佈局隨機化會導致有些活動發生錯誤
net.ipv4.ip_forward = 0 0表示禁用 IPv4 包轉送
net.ipv4.neigh.default.gc_stale_time=120 ARP參數,檢查一次相鄰層記錄的有效性的週期。當相鄰層記錄失效時,將在給它發送數據前,再解析一次。缺省值是60秒。
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_announce=2

以下命令使內核參數生效:
/sbin/sysctl -p 生效
/sbin/sysctl -a | grep net.core.netdev_max_backlog 查看

完整的參數列表:

net.core.netdev_max_backlog = 30000
net.core.somaxconn = 262144
net.core.rmem_default = 8388608
net.core.wmem_default = 8388608
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.ip_local_port_range = 1024 65536
net.ipv4.tcp_mem = 786432 1048576 1572864
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_no_metrics_save=1
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=1800
net.ipv4.netfilter.ip_conntrack_max=131070

kernel.sysrq = 0
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kernel.randomize_va_space = 1
kernel.exec-shield = 1
net.ipv4.ip_forward = 0
net.ipv4.neigh.default.gc_stale_time=120
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_announce=2

如果出現error: “net.ipv4.netfilter.ip_conntrack_max” is an unknown key

執行下面的命令加載對應模塊:

modprobe ip_conntrack
lsmod |grep conn – if you see entries it means modules have been loaded correctly
sysctl -w – to write the changes you made under /etc/sysctl.conf
sysctl -p – to view the changes and see if it was actually loaded.
還不行,把net.ipv4.netfilter.ip_conntrack_max替換爲:

net.nf_conntrack_max = 131070試試看

除了調整內核參數,還需 調整文件數:

linux系統優化完網絡必須調高系統允許打開的文件數才能支持大的併發,默認1024是遠遠不夠的。
查看進程佔用的文件句柄數; lsof -n |awk ‘{print $2}’|sort|uniq -c |sort -nr|more 其中第一行是打開的文件句柄數量,第二行是進程號

執行Shell命令:
echo ulimit -HSn 65536 >> /etc/rc.local
echo ulimit -HSn 65536 >>/root/.bash_profile
ulimit -HSn 65536

如果要sudo執行時,使用:sudo sh -c “ulimit -HSn 65536 && exec su $LOGNAME”

-H 設置硬資源限制.
-S 設置軟資源限制.
-a 顯示當前所有的資源限制.
-c size:設置core文件的最大值.單位:blocks
-d size:設置數據段的最大值.單位:kbytes
-f size:設置創建文件的最大值.單位:blocks
-l size:設置在內存中鎖定進程的最大值.單位:kbytes
-m size:設置可以使用的常駐內存的最大值.單位:kbytes
-n size:設置內核可以同時打開的文件描述符的最大值.單位:n
-p size:設置管道緩衝區的最大值.單位:kbytes
-s size:設置堆棧的最大值.單位:kbytes
-t size:設置CPU使用時間的最大上限.單位:seconds
-v size:設置虛擬內存的最大值.單位:kbytes
-u <程序數目>  用戶最多可開啓的程序數目

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章