【原創】Linux 大規模請求伺服器連線數相關設定

黑夜路人發表於2015-05-13


【原創】Linux 大規模請求伺服器連線數相關設定

作者:heiyeluren

最後更新:2017/3/19


一般一個大規模Linux伺服器請求數可能是幾十萬上百萬的情況,需要足夠的連線數來使用,所以務必進行相應的設定。

預設的Linux伺服器檔案描述符等開啟最大是1024,用ulimit -a 檢視:

[viewuser@~]$ ulimit -a
core file size          (blocks, -c) 0   #coredump 檔案大小
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 255622
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024   #開啟檔案數量,root賬戶無限制
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 4096   #root使用者本項是無限
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

如果超過了連線數量,可以在 /var/log/message 裡面看到類似:
May 14 16:13:52 hostname kernel: nf_conntrack: table full, dropping packet

的資訊,基本可以判定是fd不夠用引起的。(伺服器受到攻擊也會有這個資訊)



設定要求:假設我們要設定為100W最大開啟檔案描述符

1. 修改 nr_open 限制 (用途:能夠配置nofile最大數)
cat /proc/sys/fs/nr_open 
Linux 核心 2.6.25 以前,在核心裡面巨集定義是1024*1024,最大隻能是100w(1048576),所以不要設定更大的值,如果Linux核心大於 2.6.25 則可以設定更大值。
設定方法:
sudo bash -c 'echo 1000000 > /proc/sys/fs/nr_open'
注意:只有修改了 nr_open 限制,才能修改下面的限制。(如果 nr_open 的預設現有值如果高於我們的100w,那麼可以不用修改)


2. 開啟檔案描述符限制:修改 limits.conf 的nofile軟硬開啟檔案限制(用途:tcp連線數)

(1) 臨時生效

如果想針對當前登陸session臨時生效檔案描述符修改,可以直接使用 ulimit 命令:
ulimit -SHn 1000000  

再執行相應的程式就能夠正常使用不會超過限制,但是重啟伺服器會失效。
如果想一直生效,可以把這個內容儲存到啟動裡面,同步到 : /etc/rc.local 檔案
sudo echo "ulimit -SHn 1000000" >> /etc/rc.local

注意:如果需要讓 /etc/rc.local 下次啟動生效,務必記得有該檔案必須有執行許可權:sudo chmod +x /etc/rc.local

下次啟動會自動執行這句,也是可以正常使用的。

(2) 永久生效

檔案位置:/etc/security/limits.conf 
查詢 nofile ,如果沒有,則在自己最後加上:
2.6.25 及以前核心設定為100W:
*        soft     nofile  1000000  
*        hard    nofile  1000000

2.6.25 以後版本核心可以設定為200W:
*        soft     nofile  2000000  
*        hard    nofile  2000000

設定後儲存本檔案。(本操作必須重啟才生效,如果無法重啟,會無法生效,不確定是否使用 /sbin/sysctl -p 是否可以直接生效)

說明:如果需要 limits.conf生效,有部分需要載入/lib/security/pam_limits.so才能生效(預設情況一般不關心),如果需要關注,則需要在 /etc/pam.d/login 在末尾追加 session required /lib/security/pam_limits.so ,但是目前新版核心應該都沒問題問題,可以忽略。

3. 開啟程式限制:修改 limits.conf 中的nproc限制 (用途:程式數)

說明:如果你對程式總數量沒有特殊要求,可以不修改本選項,如果你是一個高效能多程式的server,需要很多程式來處理,那麼可以修改本選項。
ulimit -a 裡可以看到 max user processes 如果值是比較大的,可以不用設定 nproc 項。
配置檔案:/etc/security/limits.d/20-nproc.conf  (RHEL 7/CentOS 7,如果是 RHEL6.x/CentOS6.x 檔案在 /etc/security/limits.d/90-nproc.conf)
*          soft    nproc  4096
root     soft    nproc  unlimited

就是root無限(實際root使用者限制是:255622),其他非root使用者是4096個程式。

說明:

硬限制表明soft限制中所能設定的最大值。 soft限制指的是當前系統生效的設定值。 hard限制值可以被普通使用者降低。但是不能增加。 soft限制不能設定的比hard限制更高。 只有root使用者才能夠增加hard限制值。

當增加檔案限制描述,可以簡單的把當前值雙倍。 例子如下, 如果你要提高預設值1024, 最好提高到2048, 如果還要繼續增加, 就需要設定成4096。



4. 修改 file-max 選項 (用途:可分配檔案控制程式碼數目
 
file-max 價值:指定了可以分配的檔案控制程式碼的最大數目(可以使用 /proc/sys/fs/file-nr 檔案檢視到當前已經使用的檔案控制程式碼和總控制程式碼數。)

(1) 臨時生效:
檔案路徑:/proc/sys/fs/file-max
cat /proc/sys/fs/file-max
3252210
如果要修改,直接覆蓋檔案:(比如改成200w)
sudo echo 1000000 > /proc/sys/fs/file-max
注意:如果你想每次啟動都自動執行上面的命令,可以在系統啟動配置檔案/etc/rc.local裡面新增一句命令:(跟永久生效差不多)
echo 1000000 > /proc/sys/fs/file-max
或者直接Shell全搞定:
echo "echo 1000000 > /proc/sys/fs/file-max" >> /etc/rc.local
注意:如果需要讓 /etc/rc.local 下次啟動生效,務必記得有該檔案必須有執行許可權:sudo chmod +x /etc/rc.local
(2) 永久生效:
修改配置檔案,檔案位置:/etc/sysctl.conf
開啟配置檔案到最末尾,如果配置檔案裡沒有則可以直接新增:
sudo echo "fs.file-max = 1000000" >>/etc/sysctl.conf
配置檔案生效:sudo /sbin/sysctl -p


5. 修改TCP等相關選項

配置檔案:/etc/sysctl.conf
修改選項:
net.core.somaxconn = 2048   
net.core.rmem_default = 262144  
net.core.wmem_default = 262144  
net.core.rmem_max = 16777216  
net.core.wmem_max = 16777216  
net.core.netdev_max_backlog = 20000  
net.ipv4.tcp_rmem = 4096 4096 16777216  
net.ipv4.tcp_wmem = 4096 4096 16777216  
net.ipv4.tcp_mem = 786432 2097152 3145728  
net.ipv4.tcp_max_syn_backlog = 16384  
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_tw_reuse = 1  
net.ipv4.tcp_tw_recycle = 0  
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_orphans = 131072
fs.file-max = 2000000
fs.inotify.max_user_watches = 16384
net.netfilter.nf_conntrack_max = 6553500   #本選項在一些版本下無效,可以刪除
net.netfilter.nf_conntrack_tcp_timeout_established = 1200     #本選項在一些版本下無效,可以刪除
  配置檔案生效:sudo /sbin/sysctl -p

以上選項也可以直接給 /proc/sys/net/ 目錄下面按照各個選項可以直接使用類似於 echo VALUE > /proc/sys/net/core/wmem_max 來直接修改記憶體臨時值生效。

主要看這幾項:
  •  net.ipv4.tcp_rmem 用來配置讀緩衝的大小,三個值,第一個是這個讀緩衝的最小值,第三個是最大值,中間的是預設值。我們可以在程式中修改讀緩衝的大小,但是不能超過最小與最大。為了使每個socket所使用的記憶體數最小,我這裡設定預設值為4096。     
  • net.ipv4.tcp_wmem 用來配置寫緩衝的大小。讀緩衝與寫緩衝在大小,直接影響到socket在核心中記憶體的佔用。   
  • net.ipv4.tcp_mem 則是配置tcp的記憶體大小,其單位是頁,而不是位元組。當超過第二個值時,TCP進入 pressure模式,此時TCP嘗試穩定其記憶體的使用,當小於第一個值時,就退出pressure模式。當記憶體佔用超過第三個值時,TCP就拒絕分配 socket了,檢視dmesg,會打出很多的日誌“TCP: too many of orphaned sockets”。 
  • net.ipv4.tcp_max_orphans 這個值也要設定一下,這個值表示系統所能處理不屬於任何程式的 socket數量,當我們需要快速建立大量連線時,就需要關注下這個值了。當不屬於任何程式的socket的數量大於這個值時,dmesg就會看 到”too many of orphaned sockets”。
  • net.ipv4.tcp_syncookies = 1表示開啟SYN Cookies。當出現SYN等待佇列溢位時,啟用cookies來處理,可防範少量SYN攻擊,預設為0,表示關閉;
  • net.ipv4.tcp_tw_reuse = 1表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連線,預設為0,表示關閉;
  • net.ipv4.tcp_tw_recycle = 1表示開啟TCP連線中TIME-WAIT sockets的快速回收,預設為0,表示關閉。
  • net.ipv4.tcp_fin_timeout修改系統預設的TIMEOUT時間
  • net.ipv4.tcp_max_syn_backlog 進入SYN包的最大請求佇列.預設1024.對重負載伺服器,增加該值顯然有好處.可調整到16384.
  • net.ipv4.tcp_keepalive_time = 300 表示當keepalive起用的時候,TCP傳送keepalive訊息的頻度。預設是2小時,改為300秒。
  • net.ipv4.tcp_max_tw_buckets = 5000 表示系統同時保持TIME_WAIT套接字的最大數量,如果超過這個數字,TIME_WAIT套接字將立刻被清除並列印警告資訊。預設為180000,改為5000。
  • fs.file-max = 2000000 是指能夠開啟的檔案描述符的最大數量,如果系統報錯:too many file opened,就需要修改本值(本值必須跟 /etc/security/limits.conf 一塊修改才生效)
  • fs.inotify.max_user_watches = 16384 設定檔案系統變化監聽上線。如果在沒滿各種正常的情況下,還出現tail -f這種watch事件報錯No space left on device就是這個值不夠了

注意:如果是客戶端程式,為了更好的訪問server程式不是卡在埠分配上,建議把客戶端的埠(port_range)範圍開大一些:
修改檔案:/etc/sysctl.conf
net.ipv4.ip_local_port_range = 1024 65535  

配置生效:sudo /sbin/sysctl -p
如果是客戶端,其他檔案開啟限制等可以參考上面的來設定。

6. 調整單個程式可以用的VMA(虛擬記憶體區域)的數量 

預設值:cat /proc/sys/vm/max_map_count
一般預設是 65530

(1) 臨時生效:

方法1:sudo sysctl -w vm.max_map_count=655360 && sysctl -p
方法2:sudo echo "655360" > /proc/sys/vm/max_map_count

(2) 永久生效
sudo echo "vm.max_map_count=655360" >> /etc/sysctl.conf
sudo sysctl -p


7. 其他一些配置

(1) 開啟core檔案

如果為了觀察程式是否正常,出現問題後生成相應映像檔案,可以開啟coredump相關的操作,可以開啟:(非必須,如果線上環境,擔心影響穩定性,可以考慮不開啟)
配置檔案:/etc/security/limits.conf
修改配置檔案:
增加: 
*        soft     core   102400
*        hard    core   2048003

建議設定為無限大小:
*        soft     core   unlimited
*        hard    core   unlimited
然後重啟機器生效(不確定是否可以使用 /sbin/sysctl -p 生效),使用: ulimit -a 或 ulimit -c 檢視結果,後續如果程式出現棧溢位等都會生成coredump檔案,方便用gdb等追查問題原因。

(2) 修改其他 limits.conf 配置
如果想臨時當前會話裡讓 /etc/security/limits.conf 生效,可以直接使用 ulimit 命令進行修改,在當前session就直接生效(退出登陸或者重啟失效,為了永久生效,必須直接修改 /etc/security/limits.conf 檔案)
ulimit -SHc unlimited   #修改coredump檔案大小,修改完當前session就生效了,啟動的程式都會直接可用這個新配置值
ulimit -SHn 10000000  #修改開啟檔案數量限制為100W,修改完當前session就生效
ulimit -SHu 4096  #修改當前使用者開啟程式數量限制為4096個,修改完後當前session直接生效

#修改完成後使用 ulimit -a 可以檢視修改的效果,需要用就生效修改 /etc/security/limits.conf 檔案,然後重啟伺服器生效 #


參考URL:
http://blog.csdn.net/arkblue/article/details/45796107




-------------------------------------------------------------------------------------

黑夜路人,一個關注開源技術、樂於學習、喜歡分享的程式設計師


部落格:http://blog.csdn.net/heiyeshuwu

微博:http://weibo.com/heiyeluren

微信:heiyeluren2012  

想獲取更多IT開源技術相關資訊,歡迎關注微信!

微信二維碼掃描快速關注本號碼:






相關文章