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

這篇文章主要講解了“高并發(fā)情況下Linux系統(tǒng)及kernel參數(shù)的優(yōu)化方法”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“高并發(fā)情況下Linux系統(tǒng)及kernel參數(shù)的優(yōu)化方法”吧!

成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供遠安網(wǎng)站建設、遠安做網(wǎng)站、遠安網(wǎng)站設計、遠安網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、遠安企業(yè)網(wǎng)站模板建站服務,十余年遠安做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。

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

iptables相關

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

單進程最大打開文件數(shù)限制

一般的發(fā)行版,限制單進程最大可以打開1024個文件,這是遠遠不能滿足高并發(fā)需求的,調整過程如下:

在#號提示符下敲入:

# ulimit –n 65535

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

這個命令會輸出類似下面的結果:

LAST_ACK16  SYN_RECV348  ESTABLISHED70  FIN_WAIT1229  FIN_WAIT230  CLOSING33  TIME_WAIT18098

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

編輯配置文件:/etc/sysctl.conf,在這個文件中,加入下面的幾行內(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

簡單的說明上面的參數(shù)的含義:

net.ipv4.tcp_syncookies= 1

表示開啟SYNCookies。當出現(xiàn)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

修改系統(tǒng)默認的TIMEOUT 時間。

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

此外,如果你的連接數(shù)本身就很多,我們可以再優(yōu)化一下TCP的可使用端口范圍,進一步提升服務器的并發(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

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

net.ipv4.tcp_keepalive_time= 1200

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

ip_local_port_range= 1024 65535

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

net.ipv4.tcp_max_syn_backlog= 8192

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

net.ipv4.tcp_max_tw_buckets= 5000

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

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

net.ipv4.tcp_max_syn_backlog= 65535

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

net.core.netdev_max_backlog= 32768

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

net.core.somaxconn= 32768

例如web應用中l(wèi)isten函數(shù)的backlog默認會給我們內(nèi)核參數(shù)的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,可參考的優(yōu)化值:873200  net.core.wmem_max= 16777216 #最大socket寫buffer,可參考的優(yōu)化值:873200  net.ipv4.tcp_timestsmps= 0

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

net.ipv4.tcp_synack_retries= 2

為了打開對端的連接,內(nèi)核需要發(fā)送一個SYN并附帶一個回應前面一個SYN的ACK。也就是所謂三次握手中的第二次握手。這個設置決定了內(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

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

net.ipv4.tcp_wmem= 8192 436600 873200

TCP寫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個值,意思是:

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

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

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

上述內(nèi)存單位是頁,而不是字節(jié)。可參考的優(yōu)化值是:7864321048576 1572864

net.ipv4.tcp_max_orphans= 3276800

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

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

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

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

net.ipv4.tcp_fin_timeout= 30

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

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

sysctlnet.ipv4.tcp_available_congestion_control

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

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

net.ipv4.tcp_congestion_control=hybla

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

net.ipv4.tcp_fastopen= 3

IO事件分配機制

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

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

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

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

感謝各位的閱讀,以上就是“高并發(fā)情況下Linux系統(tǒng)及kernel參數(shù)的優(yōu)化方法”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對高并發(fā)情況下Linux系統(tǒng)及kernel參數(shù)的優(yōu)化方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關知識點的文章,歡迎關注!

網(wǎng)站題目:高并發(fā)情況下Linux系統(tǒng)及kernel參數(shù)的優(yōu)化方法
鏈接地址:http://bm7419.com/article16/jjsegg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供虛擬主機手機網(wǎng)站建設、網(wǎng)站內(nèi)鏈、定制網(wǎng)站、外貿(mào)建站、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設計公司