久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

如何實現Linux服務器高并發調優

170次閱讀
沒有評論

共計 6143 個字符,預計需要花費 16 分鐘才能閱讀完成。

如何實現 Linux 服務器高并發調優,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

眾所周知在默認參數情況下 Linux 對高并發支持并不好,主要受限于單進程最大打開文件數限制、內核 TCP 參數方面和 IO 事件分配機制等。下面就從幾方面來調整使 Linux 系統能夠支持高并發環境。

iptables 相關

如非必須,關掉或卸載 iptables 防火墻,并阻止 kernel 加載 iptables 模塊。這些模塊會影響并發性能。

單進程最大打開文件數限制

一般的發行版,限制單進程最大可以打開 1024 個文件,這是遠遠不能滿足高并發需求的,調整過程如下:在 #號提示符下敲入:

# ulimit  ndash;n 65535

將 root 啟動的單一進程的最大可以打開的文件數設置為 65535 個。如果系統回顯類似于“Operationnotpermitted”之類的話,說明上述限制修改失敗,實際上是因為在中指定的數值超過了 Linux 系統對該用戶打開文件數的軟限制或硬限制。因此,就需要修改 Linux 系統對用戶的關于打開文件數的軟限制和硬限制。

  第一步,修改 limits.conf 文件,并添加: 

# vim /etc/security/limits.conf * soft nofile 65535 * hard nofile 65535

其中 * 號表示修改所有用戶的限制;soft 或 hard 指定要修改軟限制還是硬限制;65536 則指定了想要修改的新的限制值,即最大打開文件數(請注意軟限制值要小于或等于硬限制)。修改完后保存文件。

  第二步,修改 /etc/pam.d/login 文件,在文件中添加如下行: 

# vim /etc/pam.d/login sessionrequired /lib/security/pam_limits.so

這是告訴 Linux 在用戶完成系統登錄后,應該調用 pam_limits.so 模塊來設置系統對該用戶可使用的各種資源數量的最大限制(包括用戶可打開的最大文件數限制),而 pam_limits.so 模塊就會從 /etc/security/limits.conf 文件中讀取配置來設置這些限制值。修改完后保存此文件。

  第三步,查看 Linux 系統級的最大打開文件數限制,使用如下命令: 

# cat/proc/sys/fs/file-max 32568

這表明這臺 Linux 系統最多允許同時打開(即包含所有用戶打開文件數總和)32568 個文件,是 Linux 系統級硬限制,所有用戶級的打開文件數限制都不應超過這個數值。

通常這個系統級硬限制是 Linux 系統在啟動時根據系統硬件資源狀況計算出來的最佳的最大同時打開文件數限制,如果沒有特殊需要,不應該修改此限制,除非想為用戶級打開文件數限制設置超過此限制的值。修改此硬限制的方法是修改 /etc/sysctl.conf 文件內 fs.file-max= 131072 這是讓 Linux 在啟動完成后強行將系統級打開文件數硬限制設置為 131072。修改完后保存此文件。

完成上述步驟后重啟系統,一般情況下就可以將 Linux 系統對指定用戶的單一進程允許同時打開的最大文件數限制設為指定的數值。

如果重啟后用 ulimit- n 命令查看用戶可打開文件數限制仍然低于上述步驟中設置的最大值,這可能是因為在用戶登錄腳本 /etc/profile 中使用 ulimit- n 命令已經將用戶可同時打開的文件數做了限制。

由于通過 ulimit- n 修改系統對用戶可同時打開文件的最大數限制時,新修改的值只能小于或等于上次 ulimit- n 設置的值,因此想用此命令增大這個限制值是不可能的。

所以,如果有上述問題存在,就只能去打開 /etc/profile 腳本文件,在文件中查找是否使用了 ulimit- n 限制了用戶可同時打開的最大文件數量,如果找到,則刪除這行命令,或者將其設置的值改為合適的值,然后保存文件,用戶退出并重新登錄系統即可。

通過上述步驟,就為支持高并發 TCP 連接處理的通訊處理程序解除關于打開文件數量方面的系統限制。

內核 TCP 參數方面

Linux 系統下,TCP 連接斷開后,會以 TIME_WAIT 狀態保留一定的時間,然后才會釋放端口。當并發請求過多的時候,就會產生大量的 TIME_WAIT 狀態的連接,無法及時斷開的話,會占用大量的端口資源和服務器資源。這個時候我們可以優化 TCP 的內核參數,來及時將 TIME_WAIT 狀態的端口清理掉。

下面介紹的方法只對擁有大量 TIME_WAIT 狀態的連接導致系統資源消耗有效,如果不是這種情況下,效果可能不明顯。可以使用 netstat 命令去查 TIME_WAIT 狀態的連接狀態,輸入下面的組合命令,查看當前 TCP 連接的狀態和對應的連接數量:

# netstat-n | awk  lsquo;/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]} rsquo; # 這個命令會輸出類似下面的結果: LAST_ACK16 SYN_RECV348 ESTABLISHED70 FIN_WAIT1229 FIN_WAIT230 CLOSING33 TIME_WAIT18098

我們只用關心 TIME_WAIT 的個數,在這里可以看到,有 18000 多個 TIME_WAIT,這樣就占用了 18000 多個端口。要知道端口的數量只有 65535 個,占用一個少一個,會嚴重的影響到后繼的新連接。這種情況下,我們就有必要調整下 Linux 的 TCP 內核參數,讓系統更快的釋放 TIME_WAIT 連接。

編輯配置文件:/etc/sysctl.conf,在這個文件中,加入下面的幾行內容:

# 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

輸入下面的命令,讓內核參數生效:

# sysctl-p

簡單的說明上面的參數的含義:

net.ipv4.tcp_syncookies= 1 #表示開啟 SYNCookies。當出現 SYN 等待隊列溢出時,啟用 cookies 來處理,可防范少量 SYN 攻擊,默認為 0,表示關閉; net.ipv4.tcp_tw_reuse= 1 #表示開啟重用。允許將 TIME-WAITsockets 重新用于新的 TCP 連接,默認為 0,表示關閉; net.ipv4.tcp_tw_recycle= 1 #表示開啟 TCP 連接中 TIME-WAITsockets 的快速回收,默認為 0,表示關閉; net.ipv4.tcp_fin_timeout # 修改系統默認的 TIMEOUT  時間。

在經過這樣的調整之后,除了會進一步提升服務器的負載能力之外,還能夠防御小流量程度的 DoS、CC 和 SYN 攻擊。

此外,如果你的連接數本身就很多,我們可以再優化一下 TCP 的可使用端口范圍,進一步提升服務器的并發能力。依然是往上面的參數文件中,加入下面這些配置:

net.ipv4.tcp_keepalive_time= 1200 net.ipv4.ip_local_port_range= 1024 65535 net.ipv4.tcp_max_syn_backlog= 8192 net.ipv4.tcp_max_tw_buckets= 5000

這幾個參數,建議只在流量非常大的服務器上開啟,會有顯著的效果。一般的流量小的服務器上,沒有必要去設置這幾個參數。

net.ipv4.tcp_keepalive_time= 1200

表示當 keepalive 起用的時候,TCP 發送 keepalive 消息的頻度。缺省是 2 小時,改為 20 分鐘。

ip_local_port_range= 1024 65535

表示用于向外連接的端口范圍。缺省情況下很小,改為 1024 到 65535。

net.ipv4.tcp_max_syn_backlog= 8192

表示 SYN 隊列的長度,默認為 1024,加大隊列長度為 8192,可以容納更多等待連接的網絡連接數。

net.ipv4.tcp_max_tw_buckets= 5000

表示系統同時保持 TIME_WAIT 的最大數量,如果超過這個數字,TIME_WAIT 將立刻被清除并打印警告信息。默認為 180000,改為 5000。此項參數可以控制 TIME_WAIT 的最大數量,只要超出了。

內核其他 TCP 參數說明

net.ipv4.tcp_max_syn_backlog= 65535 #記錄的那些尚未收到客戶端確認信息的連接請求的最大值。對于有 128M 內存的系統而言,缺省值是 1024,小內存的系統則是 128。 net.core.netdev_max_backlog= 32768 # 每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目。 net.core.somaxconn= 32768

例如 web 應用中 listen 函數的 backlog 默認會給我們內核參數的 net.core.somaxconn 限制到 128,而 nginx 定義的 NGX_LISTEN_BACKLOG 默認為 511,所以有必要調整這個值。

 net.core.wmem_default= 8388608

 net.core.rmem_default= 8388608

 net.core.rmem_max= 16777216 #最大 socket 讀 buffer, 可參考的優化值:873200

 net.core.wmem_max= 16777216 #最大 socket 寫 buffer, 可參考的優化值:873200

net.ipv4.tcp_timestsmps= 0

時間戳可以避免序列號的卷繞。一個 1Gbps 的鏈路肯定會遇到以前用過的序列號。時間戳能夠讓內核接受這種“異常”的數據包。這里需要將其關掉。

net.ipv4.tcp_synack_retries= 2

為了打開對端的連接,內核需要發送一個 SYN 并附帶一個回應前面一個 SYN 的 ACK。也就是所謂三次握手中的第二次握手。這個設置決定了內核放棄連接之前發送 SYN+ACK 包的數量。

net.ipv4.tcp_syn_retries= 2

在內核放棄建立連接之前發送 SYN 包的數量。

#net.ipv4.tcp_tw_len= 1 net.ipv4.tcp_tw_reuse= 1

開啟重用。允許將 TIME-WAITsockets 重新用于新的 TCP 連接。

net.ipv4.tcp_wmem= 8192 436600 873200

TCP 寫 buffer, 可參考的優化值:8192 436600 873200

net.ipv4.tcp_rmem = 32768 436600 873200

TCP 讀 buffer, 可參考的優化值:32768 436600 873200

net.ipv4.tcp_mem= 94500000 91500000 92700000

同樣有 3 個值, 意思是:

 net.ipv4.tcp_mem[0]: 低于此值,TCP 沒有內存壓力。

 net.ipv4.tcp_mem[1]: 在此值下,進入內存壓力階段。

 net.ipv4.tcp_mem[2]: 高于此值,TCP 拒絕分配 socket。上述內存單位是頁,而不是字節。可參考的優化值是:7864321048576 1572864 

net.ipv4.tcp_max_orphans= 3276800

  系統中最多有多少個 TCP 套接字不被關聯到任何一個用戶文件句柄上。

  如果超過這個數字,連接將即刻被復位并打印出警告信息。

  這個限制僅僅是為了防止簡單的 DoS 攻擊,不能過分依靠它或者人為地減小這個值,

  更應該增加這個值(如果增加了內存之后)。 

net.ipv4.tcp_fin_timeout= 30

如果套接字由本端要求關閉,這個參數決定了它保持在 FIN-WAIT- 2 狀態的時間。對端可以出錯并永遠不關閉連接,甚至意外當機。缺省值是 60 秒。2.2 內核的通常值是 180 秒,你可以按這個設置,但要記住的是,即使你的機器是一個輕載的 WEB 服務器,也有因為大量的死套接字而內存溢出的風險,FIN-WAIT- 2 的危險性比 FIN-WAIT- 1 要小,因為它最多只能吃掉 1.5K 內存,但是它們的生存期長些。

同時還涉及到一個 TCP 擁塞算法的問題,你可以用下面的命令查看本機提供的擁塞算法控制模塊:

sysctlnet.ipv4.tcp_available_congestion_control

對于幾種算法的分析,詳情可以參考下:TCP 擁塞控制算法的優缺點、適用環境、性能分析,比如高延時可以試用 hybla,中等延時可以試用 htcp 算法等。

如果想設置 TCP 擁塞算法為 hybla

net.ipv4.tcp_congestion_control=hybla

額外的,對于內核版高于于 3.7.1 的,我們可以開啟 tcp_fastopen:

net.ipv4.tcp_fastopen= 3

IO 事件分配機制

在 Linux 啟用高并發 TCP 連接,必須確認應用程序是否使用了合適的網絡 I / O 技術和 I / O 事件分派機制。可用的 I / O 技術有同步 I /O,非阻塞式同步 I /O,以及異步 I /O。在高 TCP 并發的情形下,如果使用同步 I /O,這會嚴重阻塞程序的運轉,除非為每個 TCP 連接的 I / O 創建一個線程。但是,過多的線程又會因系統對線程的調度造成巨大開銷。因此,在高 TCP 并發的情形下使用同步 I / O 是不可取的,這時可以考慮使用非阻塞式同步 I / O 或異步 I /O。非阻塞式同步 I / O 的技術包括使用 select(),poll(),epoll 等機制。異步 I / O 的技術就是使用 AIO。

從 I / O 事件分派機制來看,使用 select()是不合適的,因為它所支持的并發連接數有限 (通常在 1024 個以內)。如果考慮性能,poll() 也是不合適的,盡管它可以支持的較高的 TCP 并發數,但是由于其采用“輪詢”機制,當并發數較高時,其運行效率相當低,并可能存在 I / O 事件分派不均,導致部分 TCP 連接上的 I / O 出現“饑餓”現象。而如果使用 epoll 或 AIO,則沒有上述問題(早期 Linux 內核的 AIO 技術實現是通過在內核中為每個 I / O 請求創建一個線程來實現的,這種實現機制在高并發 TCP 連接的情形下使用其實也有嚴重的性能問題。但在最新的 Linux 內核中,AIO 的實現已經得到改進)。

綜上所述,在開發支持高并發 TCP 連接的 Linux 應用程序時,應盡量使用 epoll 或 AIO 技術來實現并發的 TCP 連接上的 I / O 控制,這將為提升程序對高并發 TCP 連接的支持提供有效的 I / O 保證。

經過這樣的優化配置之后,服務器的 TCP 并發處理能力會顯著提高。以上配置僅供參考,用于生產環境請根據自己的實際情況調整觀察再調整。

關于如何實現 Linux 服務器高并發調優問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注丸趣 TV 行業資訊頻道了解更多相關知識。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-25發表,共計6143字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 通州市| 六盘水市| 新晃| 金川县| 化州市| 沂南县| 贞丰县| 蕲春县| 瑞金市| 海淀区| 德钦县| 兰考县| 南阳市| 安仁县| 台江县| 通州区| 晋州市| 宜章县| 博白县| 本溪市| 大竹县| 集贤县| 巴里| 霍州市| 盐源县| 大连市| 邯郸市| 孝昌县| 涞源县| 稷山县| 桐庐县| 香格里拉县| 鹤山市| 威宁| 萨嘎县| 松溪县| 那曲县| 新邵县| 布拖县| 乌拉特后旗| 烟台市|