CentOS/Linux 操作系統性能調優持續更新2020

1. 優化內核相關參數

配置文件/etc/sysctl.conf

配置方法直接將參數添加進文件每條一行.

  • sysctl -a可以查看默認配置

  • sysctl -p 執行並檢測是否有錯誤
    例如設置錯了參數:

    [root@ossec makeit]# sysctl -p
    net.ipv4.ip_forward = 1
    sysctl: cannot stat /proc/sys/net/core/somaxconn1: 沒有那個文件或目錄
    

網絡相關

  • net.core.somaxconn=65535
    一個端口最大監聽TCP連接隊列的長度
  • net.core.netdev_max_backlog=65535
    數據包速率比內核處理快時,送到隊列的數據包上限
  • net.ipv4.tcp_max_syn_backlog=65535
    TCP syn 隊列的最大長度, 第一次握手的連接參數過大可能也會遭受syn flood攻擊
  • net.ipv4.tcp_fin_timeout=10
    fin超時時間,表示如果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間
  • net.ipv4.tcp_tw_reuse=1
    是否允許將TIME-WAIT sockets重新用於新的TCP連接,默認爲0 關閉
  • net.ipv4.tcp_tw_recycle=1
    是否開啓TCP連接中TIME-WAIT sockets的快速回收,默認爲0 關閉

關於網絡參數調優模板,模板配置爲8和16g內存[按需調整]

參數默認配置調整配置說明
fs.file-max 1048576 9999999 所有進程打開的文件描述符數
fs.nr_open 1635590 1635590 單個進程可分配的最大文件數
net.core.rmem_default 124928 262144 默認的TCP讀取緩衝區
net.core.wmem_default 124928 262144 默認的TCP發送緩衝區
net.core.rmem_max 124928 8388608 默認的TCP最大讀取緩衝區
net.core.wmem_max 124928 8388608 默認的TCP最大發送緩衝區
net.ipv4.tcp_wmem 4096 16384 4194304 4096 16384 8388608 TCP發送緩衝區
net.ipv4.tcp_rmem 4096 87380 4194304 4096 87380 8388608 TCP讀取緩衝區
net.ipv4.tcp_mem 384657 512877 769314 384657 512877 3057792 TCP內存大小
net.core.netdev_max_backlog 1000 5000 在每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目
net.core.optmem_max 20480 81920 每個套接字所允許的最大緩衝區的大小
net.core.somaxconn 128 2048 每一個端口最大的監聽隊列的長度,這是個全局的參數
net.ipv4.tcp_fin_timeout 60 30 對於本端斷開的socket連接,TCP保持在FIN-WAIT-2狀態的時間(秒)。對方可能會斷開連接或一直不結束連接或不可預料的進程死亡
net.core.netdev_max_backlog 1000 10000 在每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目
net.ipv4.tcp_max_syn_backlog 1024 2048 對於還未獲得對方確認的連接請求,可保存在隊列中的最大數目。如果服務器經常出現過載,可以嘗試增加這個數字
net.ipv4.tcp_max_tw_buckets 5000 5000 系統在同時所處理的最大timewait sockets數目
net.ipv4.tcp_tw_reuse 0 1 是否允許將TIME-WAIT sockets重新用於新的TCP連接
net.ipv4.tcp_keepalive_time 7200 900 表示TCP鏈接在多少秒之後沒有數據報文傳輸時啓動探測報文(發送空的報文)
net.ipv4.tcp_keepalive_intvl 75 30 表示前一個探測報文和後一個探測報文之間的時間間隔
net.ipv4.tcp_keepalive_probes 9 3 表示探測的次數

注意:

* 參數值並不是設置的越大越好,有的需要考慮服務器的硬件配置,參數對服務器上其它服務的影響等。

本地端口號

有時候我們修改了文件句柄限制數後,錯誤日誌又會提示 "Can’t assignrequested address"。這是因爲TCP 建立連接,在創建 Socket 句柄時,需要佔用一個本地端口號(與 TCP 協議端口號不一樣),相當於一個進程,便於與其它進程進行交互。而Linux內核的TCP/IP 協議實現模塊對本地端口號的範圍進行了限制。當端口號用盡,就會出現這種錯誤了。

我們可以修改本地端口號的範圍。

# 查看IP協議本地端口號限制
cat /proc/sys/net/ipv4/ip_local_port_range

#一般系統默認爲以下值
32768    61000

#修改本地端口號
vim /etc/sysctl.conf

#修改參數
net.ipv4.ip_local_port_range = 1024 65000

#保存修改後,需要執行sysctl命令讓修改生效
sysctl -p

注意:
1、net.ipv4.ip_local_port_range的最小值爲1024,1024以下的端口已經規劃爲TCP協議佔用,如果想將 TCP 協議端口設置爲8080等大端口號,可以將這裏的最小值調大。

2、如果存在應用服務端口號大於1024的,應該將 net.ipv4.ip_local_port_range 的起始值修改爲大於應用服務端口號,否則服務會報錯。

kernel.shmmax=4294967295
該參數定義了共享內存段的最大尺寸(以字節爲單位)。

其值應>=sag_max_size初始化參數的大小,否則SAG由多個內存段構成,效率降低,
還要不小於物理內存的一半,默認情況下在32位x86系統中,Oracle SGA最大不能超過1.7GB.

kernel.shmmni=4096
這個內核參數用於設置系統範圍內共享內存段的最大數量。該參數的默認值是 4096.

kernel.shmall = 2097152
該參數表示系統任意時刻可以分配的所有共享內存段的總和的最大值(以頁爲單位).

其值應不小於shmmax/page_size.缺省值就是2097152,如果服務器上運行的所有實例的
SGA總和不超過8GB(通常系統可分配的共享內存的和最大值爲8GB),通常不需要修改.

vm.swappiness=0

內存分配策略,設置爲0是告訴系統除非虛擬內存完全滿了 否則不要使用交換區

風險:

    • 降低操作系統性能
    • 在系統資源不足下,容易被OOM kill掉

重要參數:

somaxconn

/proc/sys/net/core/somaxconn這個參數,linux中內核的一個不錯的參數somaxconn 

  看下其解析:

  對於一個TCP連接,Server與Client需要通過三次握手來建立網絡連接.當三次握手成功後,

  我們可以看到端口的狀態由LISTEN轉變爲ESTABLISHED,接着這條鏈路上就可以開始傳送數據了.

  每一個處於監聽(Listen)狀態的端口,都有自己的監聽隊列.監聽隊列的長度,與如下兩方面有關:

  - somaxconn參數.

  - 使用該端口的程序中listen()函數.

  1. 關於somaxconn參數:

  定義了系統中每一個端口最大的監聽隊列的長度,這是個全局的參數,默認值爲128,具體信息爲:

  Purpose:

  Specifies the maximum listen backlog.

  Values:

  Default: 128 connections

  Range: 0 to MAXSHORT

  Type: Connect

  Diagnosis:

  N/A

  Tuning

  Increase this parameter on busy Web servers to handle peak connection rates.

  看下FREEBSD的解析:

  限制了接收新 TCP 連接偵聽隊列的大小。對於一個經常處理新連接的高負載 web服務環境來說,默認的 128 太小了。大多數環境這個值建議增加到 1024 或者更多。

   

修改somaxconn

該內核參數默認值一般是128,對於負載很大的服務程序來說大大的不夠。一般會將它修改爲2048或者更大。

echo 2048 >   /proc/sys/net/core/somaxconn    但是這樣系統重啓後保存不了

在/etc/sysctl.conf中添加如下

net.core.somaxconn = 2048

然後在終端中執行

sysctl -p

大量TIME_WAIT

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

通過以上命令執行,查看time_wait如果較多,我這裏是4000以上。

vim /etc/sysctl.conf
編輯文件,加入以下內容:

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
全面優化:
net.ipv4.tcp_max_tw_buckets
= 6000 net.ipv4.ip_local_port_range = 1024 65000 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_syncookies = 1 net.core.somaxconn = 262144 net.core.netdev_max_backlog = 262144 net.ipv4.tcp_max_orphans = 262144 net.ipv4.tcp_max_syn_backlog = 262144 net.ipv4.tcp_synack_retries = 1 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_fin_timeout = 1 net.ipv4.tcp_keepalive_time = 30 將上面的內核參數值加入 /etc/sysctl.conf 文件中,然後執行如 下命令使之生效 : /sbin/sysctl -p

可以用下面的精簡版

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
然後執行 /sbin/sysctl -p 讓參數生效。

net.ipv4.tcp_syncookies = 1 表示開啓SYN cookies。當出現SYN等待隊列溢出時,啓用cookies來處理,可防範少量SYN攻擊,默認爲0,表示關閉;
net.ipv4.tcp_tw_reuse = 1 表示開啓重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認爲0,表示關閉;
net.ipv4.tcp_tw_recycle = 1 表示開啓TCP連接中TIME-WAIT sockets的快速回收,默認爲0,表示關閉。
net.ipv4.tcp_fin_timeout 修改系統默認的 TIMEOUT 時間
下面附上TIME_WAIT狀態的意義:

客戶端與服務器端建立TCP/IP連接後關閉SOCKET後,服務器端連接的端口
狀態爲TIME_WAIT

是不是所有執行主動關閉的socket都會進入TIME_WAIT狀態呢?
有沒有什麼情況使主動關閉的socket直接進入CLOSED狀態呢?

主動關閉的一方在發送最後一個 ack 後
就會進入 TIME_WAIT 狀態 停留2MSL(max segment lifetime)時間
這個是TCP/IP必不可少的,也就是“解決”不了的。

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