歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

高并發情況下Linux系統及kernel參數優化

來源:本站整理 作者:佚名 時間:2017-08-27 TAG: 我要投稿

眾所周知在默認參數情況下Linux對高并發支持并不好,主要受限于單進程最大打開文件數限制、內核TCP參數方面和IO事件分配機制等。下面就從幾方面來調整使Linux系統能夠支持高并發環境。
Iptables相關
  如非必須,關掉或卸載iptables防火墻,并阻止kernel加載iptables模塊。這些模塊會影響并發性能。
單進程最大打開文件數限制
  一般的發行版,限制單進程最大可以打開1024個文件,這是遠遠不能滿足高并發需求的,調整過程如下:
  在#號提示符下敲入:
# ulimit–n 65535
將root啟動的單一進程的最大可以打開的文件數設置為65535個。如果系統回顯類似于“Operationnotpermitted”之類的話,說明上述限制修改失敗,實際上是因為在中指定的數值超過了Linux系統對該用戶打開文件數的軟限制或硬限制。因此,就需要修改Linux系統對用戶的關于打開文件數的軟限制和硬限制。
第一步,修改limits.conf文件,并添加:
# vim /etc/security/limits.conf
* softnofile 65536
* hard nofile65536
  其中'*'號表示修改所有用戶的限制;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 ‘/^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的個數,在這里可以看到,有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

[1] [2]  下一頁

【聲明】:黑吧安全網(http://www.pcpbjo.tw)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        云南快乐十分前三电视