【原創】Linux 大規模請求伺服器連線數相關設定
【原創】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
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
修改檔案:/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
sudo sysctl -p
7. 其他一些配置
(1) 開啟core檔案
如果為了觀察程式是否正常,出現問題後生成相應映像檔案,可以開啟coredump相關的操作,可以開啟:(非必須,如果線上環境,擔心影響穩定性,可以考慮不開啟)
如果為了觀察程式是否正常,出現問題後生成相應映像檔案,可以開啟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://www.tuicool.com/articles/r6NvQr
http://blog.yufeng.info/archives/2568#more-2568
http://heylinux.com/archives/2938.html
http://club.1688.com/article/8964198.html
http://blog.csdn.net/qxk1989/article/details/7822792
http://blog.csdn.net/unix21/article/details/8743537
http://blog.csdn.net/force_eagle/article/details/6725243
http://blog.csdn.net/guichenglin/article/details/7753047
http://blog.csdn.net/wenchao126/article/details/7528543
http://blog.csdn.net/zhangxinrun/article/details/7621028
http://blog.yufeng.info/archives/2568#more-2568
http://heylinux.com/archives/2938.html
http://club.1688.com/article/8964198.html
http://blog.csdn.net/qxk1989/article/details/7822792
http://blog.csdn.net/unix21/article/details/8743537
http://blog.csdn.net/force_eagle/article/details/6725243
http://blog.csdn.net/guichenglin/article/details/7753047
http://blog.csdn.net/wenchao126/article/details/7528543
http://blog.csdn.net/zhangxinrun/article/details/7621028
http://blog.csdn.net/arkblue/article/details/45796107
-------------------------------------------------------------------------------------
黑夜路人,一個關注開源技術、樂於學習、喜歡分享的程式設計師
部落格:http://blog.csdn.net/heiyeshuwu
微博:http://weibo.com/heiyeluren
微信:heiyeluren2012
想獲取更多IT開源技術相關資訊,歡迎關注微信!
微信二維碼掃描快速關注本號碼:
相關文章
- oracle 連線數相關Oracle
- MySQL 連線相關引數MySql
- oracle最大連線數相關Oracle
- ajax中POST請求與引數(請求體)設定
- linux如何處理多連線請求?Linux
- nginx如何限制併發連線請求數?Nginx
- Apache提供併發連線請求數量Apache
- Http請求相關(轉)HTTP
- 什麼是併發連線數和請求數
- [原創] LINUX ES4.0 中限制TELNET連線數Linux
- 遠端連線Linux相關操作Linux
- httpWebRequest請求錯誤,基礎連線已經關閉: 連線被意外關閉HTTPWeb
- OkHttp關於https請求的設定HTTP
- MySQL伺服器最大連線數怎麼設定才合理MySql伺服器
- Linux 預設連線數Linux
- 請教關於資料庫連線池的設定問題?資料庫
- 【原創】需求分析之用例規模
- 詳解nginx的請求限制(連線限制和請求限制)Nginx
- 模擬介面請求到web伺服器Web伺服器
- oracle 安裝相關引數設定Oracle
- springmvc引數設定預設值,多地址請求SpringMVC
- linux 檢視伺服器的連線數Linux伺服器
- 【原創】表空間相關操作
- JAVA設定http請求代理JavaHTTP
- ajax中設定請求頭和自定義請求頭
- Jmeter —— jmeter設定HTTP資訊頭管理器模擬請求頭JMeterHTTP
- Linux curl 命令模擬 POST/GET 請求Linux
- GoLand 相關設定GoLand
- Http請求get與post請求方式的各種相關面試總結HTTP面試
- 【web】Spring RestTemplate提交時設定POST請求引數WebSpringREST
- 建立 MQTT 連線時如何設定引數?MQQT
- 檢視mysql資料庫連線數、併發數相關資訊MySql資料庫
- webapi 設定swagger上請求引數的預設值WebAPISwagger
- MYSQL連線相關引數和狀態值詳解MySql
- 騰訊雲伺服器 MySQL 遠端連線設定伺服器MySql
- Code::Blocks 編譯引數的相關設定BloC編譯
- AFN 請求 並設定acceptableContentTypes
- 檢視http的併發請求數與其TCP連線狀態HTTPTCP