一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

高并發(fā)情況下Linux系統(tǒng)及kernel參數(shù)優(yōu)化

 Bladexu的文庫(kù) 2017-09-06

眾所周知在默認(rèn)參數(shù)情況下Linux對(duì)高并發(fā)支持并不好,主要受限于單進(jìn)程最大打開(kāi)文件數(shù)限制、內(nèi)核TCP參數(shù)方面和IO事件分配機(jī)制等。下面就從幾方面來(lái)調(diào)整使Linux系統(tǒng)能夠支持高并發(fā)環(huán)境。

Iptables相關(guān)

如非必須,關(guān)掉或卸載iptables防火墻,并阻止kernel加載iptables模塊。這些模塊會(huì)影響并發(fā)性能。

單進(jìn)程最大打開(kāi)文件數(shù)限制

一般的發(fā)行版,限制單進(jìn)程最大可以打開(kāi)1024個(gè)文件,這是遠(yuǎn)遠(yuǎn)不能滿(mǎn)足高并發(fā)需求的,調(diào)整過(guò)程如下:

在#號(hào)提示符下敲入:

# ulimit–n 65535

將root啟動(dòng)的單一進(jìn)程的最大可以打開(kāi)的文件數(shù)設(shè)置為65535個(gè)。如果系統(tǒng)回顯類(lèi)似于“Operationnotpermitted”之類(lèi)的話(huà),說(shuō)明上述限制修改失敗,實(shí)際上是因?yàn)樵谥兄付ǖ臄?shù)值超過(guò)了Linux系統(tǒng)對(duì)該用戶(hù)打開(kāi)文件數(shù)的軟限制或硬限制。因此,就需要修改Linux系統(tǒng)對(duì)用戶(hù)的關(guān)于打開(kāi)文件數(shù)的軟限制和硬限制。

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

# vim /etc/security/limits.conf

* softnofile 65536

* hard nofile65536

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

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

# vim /etc/pam.d/login

sessionrequired /lib/security/pam_limits.so

這是告訴Linux在用戶(hù)完成系統(tǒng)登錄后,應(yīng)該調(diào)用pam_limits.so模塊來(lái)設(shè)置系統(tǒng)對(duì)該用戶(hù)可使用的各種資源數(shù)量的最大限制(包括用戶(hù)可打開(kāi)的最大文件數(shù)限制),而pam_limits.so模塊就會(huì)從/etc/security/limits.conf文件中讀取配置來(lái)設(shè)置這些限制值。修改完后保存此文件。

第三步,查看Linux系統(tǒng)級(jí)的最大打開(kāi)文件數(shù)限制,使用如下命令:

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

32568

這表明這臺(tái)Linux系統(tǒng)最多允許同時(shí)打開(kāi)(即包含所有用戶(hù)打開(kāi)文件數(shù)總和)32568個(gè)文件,是Linux系統(tǒng)級(jí)硬限制,所有用戶(hù)級(jí)的打開(kāi)文件數(shù)限制都不應(yīng)超過(guò)這個(gè)數(shù)值。通常這個(gè)系統(tǒng)級(jí)硬限制是Linux系統(tǒng)在啟動(dòng)時(shí)根據(jù)系統(tǒng)硬件資源狀況計(jì)算出來(lái)的最佳的最大同時(shí)打開(kāi)文件數(shù)限制,如果沒(méi)有特殊需要,不應(yīng)該修改此限制,除非想為用戶(hù)級(jí)打開(kāi)文件數(shù)限制設(shè)置超過(guò)此限制的值。修改此硬限制的方法是修改/etc/sysctl.conf文件內(nèi)fs.file-max= 131072

這是讓Linux在啟動(dòng)完成后強(qiáng)行將系統(tǒng)級(jí)打開(kāi)文件數(shù)硬限制設(shè)置為131072。修改完后保存此文件。

完成上述步驟后重啟系統(tǒng),一般情況下就可以將Linux系統(tǒng)對(duì)指定用戶(hù)的單一進(jìn)程允許同時(shí)打開(kāi)的最大文件數(shù)限制設(shè)為指定的數(shù)值。如果重啟后用ulimit-n命令查看用戶(hù)可打開(kāi)文件數(shù)限制仍然低于上述步驟中設(shè)置的最大值,這可能是因?yàn)樵谟脩?hù)登錄腳本/etc/profile中使用ulimit-n命令已經(jīng)將用戶(hù)可同時(shí)打開(kāi)的文件數(shù)做了限制。由于通過(guò)ulimit-n修改系統(tǒng)對(duì)用戶(hù)可同時(shí)打開(kāi)文件的最大數(shù)限制時(shí),新修改的值只能小于或等于上次ulimit-n設(shè)置的值,因此想用此命令增大這個(gè)限制值是不可能的。所以,如果有上述問(wèn)題存在,就只能去打開(kāi)/etc/profile腳本文件,在文件中查找是否使用了ulimit-n限制了用戶(hù)可同時(shí)打開(kāi)的最大文件數(shù)量,如果找到,則刪除這行命令,或者將其設(shè)置的值改為合適的值,然后保存文件,用戶(hù)退出并重新登錄系統(tǒng)即可。

通過(guò)上述步驟,就為支持高并發(fā)TCP連接處理的通訊處理程序解除關(guān)于打開(kāi)文件數(shù)量方面的系統(tǒng)限制。

內(nèi)核TCP參數(shù)方面

Linux系統(tǒng)下,TCP連接斷開(kāi)后,會(huì)以TIME_WAIT狀態(tài)保留一定的時(shí)間,然后才會(huì)釋放端口。當(dāng)并發(fā)請(qǐng)求過(guò)多的時(shí)候,就會(huì)產(chǎn)生大量的TIME_WAIT狀態(tài)的連接,無(wú)法及時(shí)斷開(kāi)的話(huà),會(huì)占用大量的端口資源和服務(wù)器資源。這個(gè)時(shí)候我們可以?xún)?yōu)化TCP的內(nèi)核參數(shù),來(lái)及時(shí)將TIME_WAIT狀態(tài)的端口清理掉。

下面介紹的方法只對(duì)擁有大量TIME_WAIT狀態(tài)的連接導(dǎo)致系統(tǒng)資源消耗有效,如果不是這種情況下,效果可能不明顯??梢允褂胣etstat命令去查T(mén)IME_WAIT狀態(tài)的連接狀態(tài),輸入下面的組合命令,查看當(dāng)前TCP連接的狀態(tài)和對(duì)應(yīng)的連接數(shù)量:

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

這個(gè)命令會(huì)輸出類(lèi)似下面的結(jié)果:

LAST_ACK16

SYN_RECV348

ESTABLISHED70

FIN_WAIT1229

FIN_WAIT230

CLOSING33

TIME_WAIT18098

我們只用關(guān)心TIME_WAIT的個(gè)數(shù),在這里可以看到,有18000多個(gè)TIME_WAIT,這樣就占用了18000多個(gè)端口。要知道端口的數(shù)量只有65535個(gè),占用一個(gè)少一個(gè),會(huì)嚴(yán)重的影響到后繼的新連接。這種情況下,我們就有必要調(diào)整下Linux的TCP內(nèi)核參數(shù),讓系統(tǒng)更快的釋放TIME_WAIT連接。

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

# 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

輸入下面的命令,讓內(nèi)核參數(shù)生效:

# sysctl-p

簡(jiǎn)單的說(shuō)明上面的參數(shù)的含義:

net.ipv4.tcp_syncookies= 1

#表示開(kāi)啟SYNCookies。當(dāng)出現(xiàn)SYN等待隊(duì)列溢出時(shí),啟用cookies來(lái)處理,可防范少量SYN攻擊,默認(rèn)為0,表示關(guān)閉;

net.ipv4.tcp_tw_reuse= 1

#表示開(kāi)啟重用。允許將TIME-WAITsockets重新用于新的TCP連接,默認(rèn)為0,表示關(guān)閉;

net.ipv4.tcp_tw_recycle= 1

#表示開(kāi)啟TCP連接中TIME-WAITsockets的快速回收,默認(rèn)為0,表示關(guān)閉;

net.ipv4.tcp_fin_timeout

#修改系統(tǒng)默認(rèn)的TIMEOUT 時(shí)間。

在經(jīng)過(guò)這樣的調(diào)整之后,除了會(huì)進(jìn)一步提升服務(wù)器的負(fù)載能力之外,還能夠防御小流量程度的DoS、CC和SYN攻擊。

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

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

這幾個(gè)參數(shù),建議只在流量非常大的服務(wù)器上開(kāi)啟,會(huì)有顯著的效果。一般的流量小的服務(wù)器上,沒(méi)有必要去設(shè)置這幾個(gè)參數(shù)。

net.ipv4.tcp_keepalive_time= 1200

#表示當(dāng)keepalive起用的時(shí)候,TCP發(fā)送keepalive消息的頻度。缺省是2小時(shí),改為20分鐘。

net.ipv4.ip_local_port_range= 1024 65535

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

net.ipv4.tcp_max_syn_backlog= 8192

#表示SYN隊(duì)列的長(zhǎng)度,默認(rèn)為1024,加大隊(duì)列長(zhǎng)度為8192,可以容納更多等待連接的網(wǎng)絡(luò)連接數(shù)。

net.ipv4.tcp_max_tw_buckets= 5000

#表示系統(tǒng)同時(shí)保持TIME_WAIT的最大數(shù)量,如果超過(guò)這個(gè)數(shù)字,TIME_WAIT將立刻被清除并打印警告信息。默認(rèn)為180000,改為5000。此項(xiàng)參數(shù)可以控制TIME_WAIT的最大數(shù)量,只要超出了。

內(nèi)核其他TCP參數(shù)說(shuō)明:

net.ipv4.tcp_max_syn_backlog= 65536

#記錄的那些尚未收到客戶(hù)端確認(rèn)信息的連接請(qǐng)求的最大值。對(duì)于有128M內(nèi)存的系統(tǒng)而言,缺省值是1024,小內(nèi)存的系統(tǒng)則是128。

net.core.netdev_max_backlog= 32768

#每個(gè)網(wǎng)絡(luò)接口接收數(shù)據(jù)包的速率比內(nèi)核處理這些包的速率快時(shí),允許送到隊(duì)列的數(shù)據(jù)包的最大數(shù)目。

net.core.somaxconn= 32768

#例如web應(yīng)用中l(wèi)isten函數(shù)的backlog默認(rèn)會(huì)給我們內(nèi)核參數(shù)的net.core.somaxconn限制到128,而nginx定義的NGX_LISTEN_BACKLOG默認(rèn)為511,所以有必要調(diào)整這個(gè)值。

net.core.wmem_default= 8388608

net.core.rmem_default= 8388608

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

net.core.wmem_max= 16777216 #最大socket寫(xiě)buffer,可參考的優(yōu)化值:873200

net.ipv4.tcp_timestsmps= 0

#時(shí)間戳可以避免序列號(hào)的卷繞。一個(gè)1Gbps的鏈路肯定會(huì)遇到以前用過(guò)的序列號(hào)。時(shí)間戳能夠讓內(nèi)核接受這種“異?!钡臄?shù)據(jù)包。這里需要將其關(guān)掉。

1

net.ipv4.tcp_synack_retries= 2

#為了打開(kāi)對(duì)端的連接,內(nèi)核需要發(fā)送一個(gè)SYN并附帶一個(gè)回應(yīng)前面一個(gè)SYN的ACK。也就是所謂三次握手中的第二次握手。這個(gè)設(shè)置決定了內(nèi)核放棄連接之前發(fā)送SYN+ACK包的數(shù)量。

net.ipv4.tcp_syn_retries= 2

#在內(nèi)核放棄建立連接之前發(fā)送SYN包的數(shù)量。

#net.ipv4.tcp_tw_len= 1

net.ipv4.tcp_tw_reuse= 1

# 開(kāi)啟重用。允許將TIME-WAITsockets重新用于新的TCP連接。

net.ipv4.tcp_wmem= 8192 436600 873200

# TCP寫(xiě)buffer,可參考的優(yōu)化值:8192 436600 873200

net.ipv4.tcp_rmem = 32768 436600 873200

# TCP讀buffer,可參考的優(yōu)化值:32768 436600 873200

net.ipv4.tcp_mem= 94500000 91500000 92700000

# 同樣有3個(gè)值,意思是:

net.ipv4.tcp_mem[0]:低于此值,TCP沒(méi)有內(nèi)存壓力。

net.ipv4.tcp_mem[1]:在此值下,進(jìn)入內(nèi)存壓力階段。

net.ipv4.tcp_mem[2]:高于此值,TCP拒絕分配socket。

上述內(nèi)存單位是頁(yè),而不是字節(jié)??蓞⒖嫉膬?yōu)化值是:7864321048576 1572864

net.ipv4.tcp_max_orphans= 3276800

#系統(tǒng)中最多有多少個(gè)TCP套接字不被關(guān)聯(lián)到任何一個(gè)用戶(hù)文件句柄上。

如果超過(guò)這個(gè)數(shù)字,連接將即刻被復(fù)位并打印出警告信息。

這個(gè)限制僅僅是為了防止簡(jiǎn)單的DoS攻擊,不能過(guò)分依靠它或者人為地減小這個(gè)值,

更應(yīng)該增加這個(gè)值(如果增加了內(nèi)存之后)。

net.ipv4.tcp_fin_timeout= 30

#如果套接字由本端要求關(guān)閉,這個(gè)參數(shù)決定了它保持在FIN-WAIT-2狀態(tài)的時(shí)間。對(duì)端可以出錯(cuò)并永遠(yuǎn)不關(guān)閉連接,甚至意外當(dāng)機(jī)。缺省值是60秒。2.2 內(nèi)核的通常值是180秒,你可以按這個(gè)設(shè)置,但要記住的是,即使你的機(jī)器是一個(gè)輕載的WEB服務(wù)器,也有因?yàn)榇罅康乃捞捉幼侄鴥?nèi)存溢出的風(fēng)險(xiǎn),F(xiàn)IN-WAIT-2的危險(xiǎn)性比FIN-WAIT-1要小,因?yàn)樗疃嘀荒艹缘?.5K內(nèi)存,但是它們的生存期長(zhǎng)些。

同時(shí)還涉及到一個(gè)TCP 擁塞算法的問(wèn)題,你可以用下面的命令查看本機(jī)提供的擁塞算法控制模塊:

sysctlnet.ipv4.tcp_available_congestion_control

對(duì)于幾種算法的分析,詳情可以參考下:TCP擁塞控制算法的優(yōu)缺點(diǎn)、適用環(huán)境、性能分析,比如高延時(shí)可以試用hybla,中等延時(shí)可以試用htcp算法等。

如果想設(shè)置TCP 擁塞算法為hybla

net.ipv4.tcp_congestion_control=hybla

額外的,對(duì)于內(nèi)核版高于于3.7.1的,我們可以開(kāi)啟tcp_fastopen:

net.ipv4.tcp_fastopen= 3

IO事件分配機(jī)制

在Linux啟用高并發(fā)TCP連接,必須確認(rèn)應(yīng)用程序是否使用了合適的網(wǎng)絡(luò)I/O技術(shù)和I/O事件分派機(jī)制??捎玫腎/O技術(shù)有同步I/O,非阻塞式同步I/O,以及異步I/O。在高TCP并發(fā)的情形下,如果使用同步I/O,這會(huì)嚴(yán)重阻塞程序的運(yùn)轉(zhuǎn),除非為每個(gè)TCP連接的I/O創(chuàng)建一個(gè)線(xiàn)程。但是,過(guò)多的線(xiàn)程又會(huì)因系統(tǒng)對(duì)線(xiàn)程的調(diào)度造成巨大開(kāi)銷(xiāo)。因此,在高TCP并發(fā)的情形下使用同步I/O是不可取的,這時(shí)可以考慮使用非阻塞式同步I/O或異步I/O。非阻塞式同步I/O的技術(shù)包括使用select(),poll(),epoll等機(jī)制。異步I/O的技術(shù)就是使用AIO。

從I/O事件分派機(jī)制來(lái)看,使用select()是不合適的,因?yàn)樗С值牟l(fā)連接數(shù)有限(通常在1024個(gè)以?xún)?nèi))。如果考慮性能,poll()也是不合適的,盡管它可以支持的較高的TCP并發(fā)數(shù),但是由于其采用“輪詢(xún)”機(jī)制,當(dāng)并發(fā)數(shù)較高時(shí),其運(yùn)行效率相當(dāng)?shù)?,并可能存在I/O事件分派不均,導(dǎo)致部分TCP連接上的I/O出現(xiàn)“饑餓”現(xiàn)象。而如果使用epoll或AIO,則沒(méi)有上述問(wèn)題(早期Linux內(nèi)核的AIO技術(shù)實(shí)現(xiàn)是通過(guò)在內(nèi)核中為每個(gè)I/O請(qǐng)求創(chuàng)建一個(gè)線(xiàn)程來(lái)實(shí)現(xiàn)的,這種實(shí)現(xiàn)機(jī)制在高并發(fā)TCP連接的情形下使用其實(shí)也有嚴(yán)重的性能問(wèn)題。但在最新的Linux內(nèi)核中,AIO的實(shí)現(xiàn)已經(jīng)得到改進(jìn))。

綜上所述,在開(kāi)發(fā)支持高并發(fā)TCP連接的Linux應(yīng)用程序時(shí),應(yīng)盡量使用epoll或AIO技術(shù)來(lái)實(shí)現(xiàn)并發(fā)的TCP連接上的I/O控制,這將為提升程序?qū)Ω卟l(fā)TCP連接的支持提供有效的I/O保證。

經(jīng)過(guò)這樣的優(yōu)化配置之后,服務(wù)器的TCP并發(fā)處理能力會(huì)顯著提高。以上配置僅供參考,用于生產(chǎn)環(huán)境請(qǐng)根據(jù)自己的實(shí)際情況調(diào)整觀察再調(diào)整。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多

    精品推荐国产麻豆剧传媒| 日韩精品中文字幕在线视频| 久久精品国产99国产免费| 国产激情国产精品久久源| 国产又粗又长又爽又猛的视频| 欧美人与动牲交a精品| 午夜精品一区二区av| 欧美日韩亚洲精品内裤| 深夜福利亚洲高清性感| 日韩不卡一区二区在线| 亚洲国产av一二三区| 久久热在线视频免费观看| 国产中文另类天堂二区| 日本少妇三级三级三级| 丰满人妻一二区二区三区av| 欧美日韩亚洲综合国产人| 日本人妻的诱惑在线观看| 欧美一级黄片免费视频| 日本午夜一本久久久综合| 日韩中文字幕人妻精品| av在线免费观看在线免费观看| 国产欧美日韩不卡在线视频| 在线欧洲免费无线码二区免费| 国产精品成人免费精品自在线观看| 亚洲国产成人精品一区刚刚| 丰满少妇高潮一区二区| 真实偷拍一区二区免费视频| 久久老熟女一区二区三区福利| 国产成人亚洲精品青草天美| 偷拍洗澡一区二区三区| 中文字幕一区二区熟女| 91福利视频日本免费看看| 日韩一区二区三区在线日| 免费在线成人激情视频| 亚洲视频在线观看你懂的| 日本不卡在线视频你懂的| 国产精品久久男人的天堂| 一本色道久久综合狠狠躁| 少妇被粗大进猛进出处故事| 日韩亚洲激情在线观看| 国产又粗又爽又猛又黄的|