由於默認的Linux內核參數考慮的是最通用的場景,這明顯不符合用於支持高並發訪問的Web服務器的定義,所以需要修改Linux參數,使得Nginx等Web服務可以擁有更高的性能:
首先,需要修改/etc/sysctl.conf來更改內核參數。如下最常用的配置
首先,需要修改/etc/sysctl.conf來更改內核參數。如下最常用的配置
我目前生產機器的配置:
vm.swappiness = 0 vm.max_map_count=655360 fs.file-max = 999999 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_keepalive_time = 60 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_max_tw_buckets = 5000 net.ipv4.ip_local_port_range = 1024 61000 net.ipv4.tcp_rmem = 4096 32768 262142 net.ipv4.tcp_wmem = 4096 32768 262142 net.core.netdev_max_backlog = 8096 net.core.rmem_default = 262144 net.core.wmem_default = 262144 net.core.rmem_max = 2097152 net.core.wmem_max = 2097152 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn.backlog = 1024
swapoff -a && swapon -a 然后執行 sysctl -p 命令,使上述修改生效。
上面的參數意義解釋如下:
- vm.swappiness : 關閉swap分區,kubernetes環境必備
- vm.max_map_count : ElasticSearch環境必備,否則啟動報錯。
- file-max : 這個參數表示進程(比如一個work進程)可以同時打開的最大句柄數,這個參數直接限制最大並發連接數,需根據實際情況配置。
- tcp_tw_reuse : 這個參數設置為1,表示允許將TIME-WAIT狀態的socket重新用於新的TCP連接,這對於服務器來說很有意義,因為服務器上總會有大量TIME-WAIT狀態。
- tcp_keepalive_time : 這個參數表示當keepalive啟用時,TCP發送keepalive消息的頻率。默認是2小時,若將其設置的小一些,可以更快第清理無效的連接。
- tcp_fin_timeout : 這個參數表示當服務器主動關閉連接時,socket保持在FIN-WAIT-2狀態的最大時間。
- tcp_max_tw_buckets : 這個參數表示操作系統允許TIME_WAIT套接字數量的最大值,如果超過這個數字,TIME_WAIT套接字將立刻被清除病打印警告信息。該參數默認為180000,過多的TIME_WAIT套接字會使Web服務器變慢。
- tcp_max_syn_backlog : 這個參數表示TCP三次握手建立階段接收SYN請求隊列的最大長度,默認為1024,將其設置得大一些可以使出現Nginx繁忙來不及accept新連接的情況時,Linux不至於丟失客戶端發起的連接請求。
- ip_local_port_range : 這個參數定義了在UDP和TCP連接中本地(不包括連接的遠端)端口的取值范圍。
- net.ipv4.tcp_rmem : 這個參數定義了TCP接收緩存(用於TCP接收滑動窗口)的最小值、默認值、最大值。
- net.ipv4.tcp_wmem : 這個參數定義了TCP發送緩存(用於TCP發送滑動窗口)的最小值、默認值、最大值。
- netdev_max_backlog : 當網卡接收數據包的速度大於內核處理的速度時,會有一個隊列保存這些數據包。這個參數表示該隊列的最大值。
- rmem_default : 這個參數表示內核套接字接收緩存區默認的大小。
- wmem_default : 這個參數表示內核套接字發送緩存區默認的大小。
- rmem_max : 這個參數表示內核套接字接收緩存區的最大大小。
- wmem_max : 這個參數表示內核套接字發送緩存區的最大大小。
- tcp_syncookies : 該參數與性能無關,用於解決TCP的SYN攻擊。
其他配置參考(注意,切忌過度優化,有些參數需要具體了解,否則會出現莫名其妙的問題,如 https://www.cnblogs.com/lulu/p/4149312.html):
#CTCDN系統優化參數 #關閉ipv6 net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 #決定檢查過期多久鄰居條目 net.ipv4.neigh.default.gc_stale_time=120 #使用arp_announce / arp_ignore解決ARP映射問題 net.ipv4.conf.default.arp_announce = 2 net.ipv4.conf.all.arp_announce=2 net.ipv4.conf.lo.arp_announce=2 # 避免放大攻擊 net.ipv4.icmp_echo_ignore_broadcasts = 1 # 開啟惡意icmp錯誤消息保護 net.ipv4.icmp_ignore_bogus_error_responses = 1 #關閉路由轉發 net.ipv4.ip_forward = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 #開啟反向路徑過濾 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 #處理無源路由的包 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 #關閉sysrq功能 kernel.sysrq = 0 #core文件名中添加pid作為擴展名 kernel.core_uses_pid = 1 # 開啟SYN洪水攻擊保護 net.ipv4.tcp_syncookies = 1 #修改消息隊列長度 kernel.msgmnb = 65536 kernel.msgmax = 65536 #設置最大內存共享段大小bytes kernel.shmmax = 68719476736 kernel.shmall = 4294967296 #timewait的數量,默認180000 net.ipv4.tcp_max_tw_buckets = 6000 net.ipv4.tcp_sack = 1 net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_rmem = 4096 87380 4194304 net.ipv4.tcp_wmem = 4096 16384 4194304 net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 #每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目 net.core.netdev_max_backlog = 262144 #限制僅僅是為了防止簡單的DoS 攻擊 net.ipv4.tcp_max_orphans = 3276800 #未收到客戶端確認信息的連接請求的最大值 net.ipv4.tcp_max_syn_backlog = 262144 net.ipv4.tcp_timestamps = 0 #內核放棄建立連接之前發送SYNACK 包的數量 net.ipv4.tcp_synack_retries = 1 #內核放棄建立連接之前發送SYN 包的數量 net.ipv4.tcp_syn_retries = 1 #啟用timewait 快速回收 net.ipv4.tcp_tw_recycle = 1 #開啟重用。允許將TIME-WAIT sockets 重新用於新的TCP 連接 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_mem = 94500000 915000000 927000000 net.ipv4.tcp_fin_timeout = 1 #當keepalive 起用的時候,TCP 發送keepalive 消息的頻度。缺省是2 小時 net.ipv4.tcp_keepalive_time = 1800 net.ipv4.tcp_keepalive_probes = 3 net.ipv4.tcp_keepalive_intvl = 15 #允許系統打開的端口范圍 net.ipv4.ip_local_port_range = 1024 65000 #修改防火牆表大小,默認65536 net.netfilter.nf_conntrack_max=655350 net.netfilter.nf_conntrack_tcp_timeout_established=1200 # 確保無人能修改路由表 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.default.secure_redirects = 0