您好,登錄后才能下訂單哦!
高并發場景下如何優化服務器的性能,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
作者個人研發的在高并發場景下,提供的簡單、穩定、可擴展的延遲消息隊列框架,具有精準的定時任務和延遲隊列處理功能。自開源半年多以來,已成功為十幾家中小型企業提供了精準定時調度方案,經受住了生產環境的考驗。
寫在前面
最近,有小伙伴在群里提問:Linux系統怎么設置tcp_nodelay參數?也有小伙伴說問我。那今天,我們就來根據這個問題來聊聊在高并發場景下如何優化服務器的性能這個話題。
其實,tcp_nodelay參數并不是在操作系統級別進行配置的,而是在TCP套接字上添加tcp_nodelay參數來關閉粘包算法,以便使數據包能夠立即投遞出去。tcp_nodelay參數主要是對TCP套接字來說的,那對于服務器硬件,如果要使其能夠支撐上百萬甚至上千萬的并發,我們該如何對其進行優化呢?
操作系統
這里,我使用的操作系統為CentOS 8,我們可以輸入如下命令來查看操作系統的版本。
CentOS Linux release 8.0.1905 (Core)
對于高并發的場景,我們主要還是優化操作系統的網絡性能,而操作系統中,有很多關于網絡協議的參數,我們對于服務器網絡性能的優化,主要是對這些系統參數進行調優,以達到提升我們應用訪問性能的目的。
系統參數
在CentOS 操作系統中,我們可以通過如下命令來查看所有的系統參數。
/sbin/sysctl -a
部分輸出結果如下所示。
這里的參數太多了,大概有一千多個,在高并發場景下,我們不可能對操作系統的所有參數進行調優。我們更多的是關注與網絡相關的參數。如果想獲得與網絡相關的參數,那么,我們首先需要獲取操作系統參數的類型,如下命令可以獲取操作系統參數的類型。
/sbin/sysctl -a|awk -F "." '{print $1}'|sort -k1|uniq
運行命令輸出的結果信息如下所示。
abi crypto debug dev fs kernel net sunrpc user vm
其中的net類型就是我們要關注的與網絡相關的操作系統參數。我們可以獲取net類型下的子類型,如下所示。
/sbin/sysctl -a|grep "^net."|awk -F "[.| ]" '{print $2}'|sort -k1|uniq
輸出的結果信息如下所示。
bridge core ipv4 ipv6 netfilter nf_conntrack_max unix
在Linux操作系統中,這些與網絡相關的參數都可以在/etc/sysctl.conf 文件里修改,如果/etc/sysctl.conf 文件中不存在這些參數,我們可以自行在/etc/sysctl.conf 文件中添加這些參數。
在net類型的子類型中,我們需要重點關注的子類型有:core和ipv4。
優化套接字緩沖區
如果服務器的網絡套接字緩沖區太小,就會導致應用程序讀寫多次才能將數據處理完,這會大大影響我們程序的性能。如果網絡套接字緩沖區設置的足夠大,從一定程度上能夠提升我們程序的性能。
我們可以在服務器的命令行輸入如下命令,來獲取有關服務器套接字緩沖區的信息。
/sbin/sysctl -a|grep "^net."|grep "[r|w|_]mem[_| ]"
輸出的結果信息如下所示。
net.core.rmem_default = 212992 net.core.rmem_max = 212992 net.core.wmem_default = 212992 net.core.wmem_max = 212992 net.ipv4.tcp_mem = 43545 58062 87090 net.ipv4.tcp_rmem = 4096 87380 6291456 net.ipv4.tcp_wmem = 4096 16384 4194304 net.ipv4.udp_mem = 87093 116125 174186 net.ipv4.udp_rmem_min = 4096 net.ipv4.udp_wmem_min = 4096
其中,帶有max、default、min關鍵字的為分別代表:最大值、默認值和最小值;帶有mem、rmem、wmem關鍵字的分別為:總內存、接收緩沖區內存、發送緩沖區內存。
這里需要注意的是:帶有rmem 和 wmem關鍵字的單位都是“字節”,而帶有mem關鍵字的單位是“頁”。“頁”是操作系統管理內存的最小單位,在 Linux 系統里,默認一頁是 4KB 大小。
如何優化頻繁收發大文件
如果在高并發場景下,需要頻繁的收發大文件,我們該如何優化服務器的性能呢?
這里,我們可以修改的系統參數如下所示。
net.core.rmem_default net.core.rmem_max net.core.wmem_default net.core.wmem_max net.ipv4.tcp_mem net.ipv4.tcp_rmem net.ipv4.tcp_wmem
這里,我們做個假設,假設系統最大可以給TCP分配 2GB 內存,最小值為 256MB,壓力值為 1.5GB。按照一頁為 4KB 來計算, tcp_mem 的最小值、壓力值、最大值分別是 65536、393216、524288,單位是“頁” 。
假如平均每個文件數據包為 512KB,每個套接字讀寫緩沖區最小可以各容納 2 個數據包,默認可以各容納 4 個數據包,最大可以各容納 10 個數據包,那我們可以算出 tcp_rmem 和 tcp_wmem 的最小值、默認值、最大值分別是 1048576、2097152、5242880,單位是“字節”。而 rmem_default 和 wmem_default 是 2097152,rmem_max 和 wmem_max 是 5242880。
注:后面詳細介紹這些數值是如何計算的~~
這里,還需要注意的是:緩沖區超過了 65535,還需要將 net.ipv4.tcp_window_scaling 參數設置為 1。
經過上面的分析后,我們最終得出的系統調優參數如下所示。
net.core.rmem_default = 2097152 net.core.rmem_max = 5242880 net.core.wmem_default = 2097152 net.core.wmem_max = 5242880 net.ipv4.tcp_mem = 65536 393216 524288 net.ipv4.tcp_rmem = 1048576 2097152 5242880 net.ipv4.tcp_wmem = 1048576 2097152 5242880
優化TCP連接
對計算機網絡有一定了解的小伙伴都知道,TCP的連接需要經過“三次握手”和“四次揮手”的,還要經過慢啟動、滑動窗口、粘包算法等支持可靠性傳輸的一系列技術支持。雖然,這些能夠保證TCP協議的可靠性,但有時這會影響我們程序的性能。
那么,在高并發場景下,我們該如何優化TCP連接呢?
(1)關閉粘包算法
如果用戶對于請求的耗時很敏感,我們就需要在TCP套接字上添加tcp_nodelay參數來關閉粘包算法,以便數據包能夠立刻發送出去。此時,我們也可以設置net.ipv4.tcp_syncookies的參數值為1。
(2)避免頻繁的創建和回收連接資源
網絡連接的創建和回收是非常消耗性能的,我們可以通過關閉空閑的連接、重復利用已經分配的連接資源來優化服務器的性能。重復利用已經分配的連接資源大家其實并不陌生,像:線程池、數據庫連接池就是復用了線程和數據庫連接。
我們可以通過如下參數來關閉服務器的空閑連接和復用已分配的連接資源。
net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time=1800
(3)避免重復發送數據包
TCP支持超時重傳機制。如果發送方將數據包已經發送給接收方,但發送方并未收到反饋,此時,如果達到設置的時間間隔,就會觸發TCP的超時重傳機制。為了避免發送成功的數據包再次發送,我們需要將服務器的net.ipv4.tcp_sack參數設置為1。
(4)增大服務器文件描述符數量
在Linux操作系統中,一個網絡連接也會占用一個文件描述符,連接越多,占用的文件描述符也就越多。如果文件描述符設置的比較小,也會影響我們服務器的性能。此時,我們就需要增大服務器文件描述符的數量。
例如:fs.file-max = 10240000,表示服務器最多可以打開10240000個文件。
關于高并發場景下如何優化服務器的性能問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。