真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

高并發(fā)場(chǎng)景下如何優(yōu)化服務(wù)器的性能

高并發(fā)場(chǎng)景下如何優(yōu)化服務(wù)器的性能,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

成都創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站建設(shè)、做網(wǎng)站與策劃設(shè)計(jì),惠州網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:惠州等地區(qū)?;葜葑鼍W(wǎng)站價(jià)格咨詢:18980820575

作者個(gè)人研發(fā)的在高并發(fā)場(chǎng)景下,提供的簡(jiǎn)單、穩(wěn)定、可擴(kuò)展的延遲消息隊(duì)列框架,具有精準(zhǔn)的定時(shí)任務(wù)和延遲隊(duì)列處理功能。自開源半年多以來,已成功為十幾家中小型企業(yè)提供了精準(zhǔn)定時(shí)調(diào)度方案,經(jīng)受住了生產(chǎn)環(huán)境的考驗(yàn)。

寫在前面

最近,有小伙伴在群里提問:Linux系統(tǒng)怎么設(shè)置tcp_nodelay參數(shù)?也有小伙伴說問我。那今天,我們就來根據(jù)這個(gè)問題來聊聊在高并發(fā)場(chǎng)景下如何優(yōu)化服務(wù)器的性能這個(gè)話題。

其實(shí),tcp_nodelay參數(shù)并不是在操作系統(tǒng)級(jí)別進(jìn)行配置的,而是在TCP套接字上添加tcp_nodelay參數(shù)來關(guān)閉粘包算法,以便使數(shù)據(jù)包能夠立即投遞出去。tcp_nodelay參數(shù)主要是對(duì)TCP套接字來說的,那對(duì)于服務(wù)器硬件,如果要使其能夠支撐上百萬甚至上千萬的并發(fā),我們?cè)撊绾螌?duì)其進(jìn)行優(yōu)化呢?

操作系統(tǒng)

這里,我使用的操作系統(tǒng)為CentOS 8,我們可以輸入如下命令來查看操作系統(tǒng)的版本。

CentOS Linux release 8.0.1905 (Core)

對(duì)于高并發(fā)的場(chǎng)景,我們主要還是優(yōu)化操作系統(tǒng)的網(wǎng)絡(luò)性能,而操作系統(tǒng)中,有很多關(guān)于網(wǎng)絡(luò)協(xié)議的參數(shù),我們對(duì)于服務(wù)器網(wǎng)絡(luò)性能的優(yōu)化,主要是對(duì)這些系統(tǒng)參數(shù)進(jìn)行調(diào)優(yōu),以達(dá)到提升我們應(yīng)用訪問性能的目的。

系統(tǒng)參數(shù)

在CentOS 操作系統(tǒng)中,我們可以通過如下命令來查看所有的系統(tǒng)參數(shù)。

/sbin/sysctl -a

部分輸出結(jié)果如下所示。

高并發(fā)場(chǎng)景下如何優(yōu)化服務(wù)器的性能

這里的參數(shù)太多了,大概有一千多個(gè),在高并發(fā)場(chǎng)景下,我們不可能對(duì)操作系統(tǒng)的所有參數(shù)進(jìn)行調(diào)優(yōu)。我們更多的是關(guān)注與網(wǎng)絡(luò)相關(guān)的參數(shù)。如果想獲得與網(wǎng)絡(luò)相關(guān)的參數(shù),那么,我們首先需要獲取操作系統(tǒng)參數(shù)的類型,如下命令可以獲取操作系統(tǒng)參數(shù)的類型。

/sbin/sysctl -a|awk -F "." '{print $1}'|sort -k1|uniq

運(yùn)行命令輸出的結(jié)果信息如下所示。

abi crypto debug dev fs kernel net sunrpc user vm

高并發(fā)場(chǎng)景下如何優(yōu)化服務(wù)器的性能

其中的net類型就是我們要關(guān)注的與網(wǎng)絡(luò)相關(guān)的操作系統(tǒng)參數(shù)。我們可以獲取net類型下的子類型,如下所示。

/sbin/sysctl -a|grep "^net."|awk -F "[.| ]" '{print $2}'|sort -k1|uniq

輸出的結(jié)果信息如下所示。

bridge core ipv4 ipv6 netfilter nf_conntrack_max unix

高并發(fā)場(chǎng)景下如何優(yōu)化服務(wù)器的性能

在Linux操作系統(tǒng)中,這些與網(wǎng)絡(luò)相關(guān)的參數(shù)都可以在/etc/sysctl.conf 文件里修改,如果/etc/sysctl.conf  文件中不存在這些參數(shù),我們可以自行在/etc/sysctl.conf 文件中添加這些參數(shù)。

在net類型的子類型中,我們需要重點(diǎn)關(guān)注的子類型有:core和ipv4。

優(yōu)化套接字緩沖區(qū)

如果服務(wù)器的網(wǎng)絡(luò)套接字緩沖區(qū)太小,就會(huì)導(dǎo)致應(yīng)用程序讀寫多次才能將數(shù)據(jù)處理完,這會(huì)大大影響我們程序的性能。如果網(wǎng)絡(luò)套接字緩沖區(qū)設(shè)置的足夠大,從一定程度上能夠提升我們程序的性能。

我們可以在服務(wù)器的命令行輸入如下命令,來獲取有關(guān)服務(wù)器套接字緩沖區(qū)的信息。

/sbin/sysctl -a|grep "^net."|grep "[r|w|_]mem[_| ]"

輸出的結(jié)果信息如下所示。

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

高并發(fā)場(chǎng)景下如何優(yōu)化服務(wù)器的性能

其中,帶有max、default、min關(guān)鍵字的為分別代表:最大值、默認(rèn)值和最小值;帶有mem、rmem、wmem關(guān)鍵字的分別為:總內(nèi)存、接收緩沖區(qū)內(nèi)存、發(fā)送緩沖區(qū)內(nèi)存。

這里需要注意的是:帶有rmem 和 wmem關(guān)鍵字的單位都是“字節(jié)”,而帶有mem關(guān)鍵字的單位是“頁”?!绊摗笔遣僮飨到y(tǒng)管理內(nèi)存的最小單位,在 Linux  系統(tǒng)里,默認(rèn)一頁是 4KB 大小。

如何優(yōu)化頻繁收發(fā)大文件

如果在高并發(fā)場(chǎng)景下,需要頻繁的收發(fā)大文件,我們?cè)撊绾蝺?yōu)化服務(wù)器的性能呢?

這里,我們可以修改的系統(tǒng)參數(shù)如下所示。

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

這里,我們做個(gè)假設(shè),假設(shè)系統(tǒng)最大可以給TCP分配 2GB 內(nèi)存,最小值為 256MB,壓力值為 1.5GB。按照一頁為 4KB 來計(jì)算, tcp_mem  的最小值、壓力值、最大值分別是 65536、393216、524288,單位是“頁” 。

假如平均每個(gè)文件數(shù)據(jù)包為 512KB,每個(gè)套接字讀寫緩沖區(qū)最小可以各容納 2 個(gè)數(shù)據(jù)包,默認(rèn)可以各容納 4 個(gè)數(shù)據(jù)包,最大可以各容納 10  個(gè)數(shù)據(jù)包,那我們可以算出 tcp_rmem 和 tcp_wmem 的最小值、默認(rèn)值、最大值分別是  1048576、2097152、5242880,單位是“字節(jié)”。而 rmem_default 和 wmem_default 是 2097152,rmem_max  和 wmem_max 是 5242880。

注:后面詳細(xì)介紹這些數(shù)值是如何計(jì)算的~~

這里,還需要注意的是:緩沖區(qū)超過了 65535,還需要將 net.ipv4.tcp_window_scaling 參數(shù)設(shè)置為 1。

經(jīng)過上面的分析后,我們最終得出的系統(tǒng)調(diào)優(yōu)參數(shù)如下所示。

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

優(yōu)化TCP連接

對(duì)計(jì)算機(jī)網(wǎng)絡(luò)有一定了解的小伙伴都知道,TCP的連接需要經(jīng)過“三次握手”和“四次揮手”的,還要經(jīng)過慢啟動(dòng)、滑動(dòng)窗口、粘包算法等支持可靠性傳輸?shù)囊幌盗屑夹g(shù)支持。雖然,這些能夠保證TCP協(xié)議的可靠性,但有時(shí)這會(huì)影響我們程序的性能。

那么,在高并發(fā)場(chǎng)景下,我們?cè)撊绾蝺?yōu)化TCP連接呢?

(1)關(guān)閉粘包算法

如果用戶對(duì)于請(qǐng)求的耗時(shí)很敏感,我們就需要在TCP套接字上添加tcp_nodelay參數(shù)來關(guān)閉粘包算法,以便數(shù)據(jù)包能夠立刻發(fā)送出去。此時(shí),我們也可以設(shè)置net.ipv4.tcp_syncookies的參數(shù)值為1。

(2)避免頻繁的創(chuàng)建和回收連接資源

網(wǎng)絡(luò)連接的創(chuàng)建和回收是非常消耗性能的,我們可以通過關(guān)閉空閑的連接、重復(fù)利用已經(jīng)分配的連接資源來優(yōu)化服務(wù)器的性能。重復(fù)利用已經(jīng)分配的連接資源大家其實(shí)并不陌生,像:線程池、數(shù)據(jù)庫連接池就是復(fù)用了線程和數(shù)據(jù)庫連接。

我們可以通過如下參數(shù)來關(guān)閉服務(wù)器的空閑連接和復(fù)用已分配的連接資源。

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)避免重復(fù)發(fā)送數(shù)據(jù)包

TCP支持超時(shí)重傳機(jī)制。如果發(fā)送方將數(shù)據(jù)包已經(jīng)發(fā)送給接收方,但發(fā)送方并未收到反饋,此時(shí),如果達(dá)到設(shè)置的時(shí)間間隔,就會(huì)觸發(fā)TCP的超時(shí)重傳機(jī)制。為了避免發(fā)送成功的數(shù)據(jù)包再次發(fā)送,我們需要將服務(wù)器的net.ipv4.tcp_sack參數(shù)設(shè)置為1。

(4)增大服務(wù)器文件描述符數(shù)量

在Linux操作系統(tǒng)中,一個(gè)網(wǎng)絡(luò)連接也會(huì)占用一個(gè)文件描述符,連接越多,占用的文件描述符也就越多。如果文件描述符設(shè)置的比較小,也會(huì)影響我們服務(wù)器的性能。此時(shí),我們就需要增大服務(wù)器文件描述符的數(shù)量。

例如:fs.file-max = 10240000,表示服務(wù)器最多可以打開10240000個(gè)文件。

關(guān)于高并發(fā)場(chǎng)景下如何優(yōu)化服務(wù)器的性能問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。


新聞標(biāo)題:高并發(fā)場(chǎng)景下如何優(yōu)化服務(wù)器的性能
網(wǎng)站地址:http://weahome.cn/article/ijgdcj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部