Linux(centos 7)文件數限制
內核參數fs.file-max? /proc/sys/fs/file-max
655360
內核參數fs.file-nr? ? /proc/sys/fs/file-nr
它有三個值:已分配文件句柄的數目,已使用文件句柄的數目,文件句柄的最大數目
該參數只讀,不修改 3648 0 655360
文件數限制分三個級別
系統級限制? ? ? ? /proc/sys/fs/file-max
/proc/sys/fs/file-max是系統給出的建議值,
系統會計算資源給出一個和合理值,一般跟內存有關系,內存越大,改值越大,但是僅僅是一個建議值,limits.conf的設定完全可以超過/proc/sys/fs/file-max。
用戶級限制? ? ? ? /etc/security/limits.conf
soft nofile表示軟限制,hard nofile表示硬限制,軟限制要小于等于硬限制。
如果root用戶的軟限制為1000,硬限制為1200,即表示root用戶能打開的最大文件數量為1000,不管它開啟多少個shell。
配置文件 /etc/security/limits.conf ,加入下面兩行
* soft nofile 65536
* hard nofile 65536
shell級限制? ? ? ulimit -n xxx
使用ulimit -a 可以查看當前文件數限制
ulimit -n xxxx 修改的是當期用戶當期環境的限制,重啟和退出用戶就恢復了
如果在limits.conf里沒有設置,則默認值是1024,如果limits.con有設置,則默認值以limits.conf為準
補充說明
1,/proc/sys/fs/file-max限制不了/etc/security/limits.conf
2,只有root用戶才有權限修改/etc/security/limits.conf
3,對于非root用戶, /etc/security/limits.conf會限制ulimit -n,但是限制不了root用戶,ulimit -n只能越設置越小,root用戶則無限制
4,任何用戶對ulimit -n的修改只在當前環境有效,退出后失效,重新登錄新來后,ulimit -n由limits.conf決定
5,如果limits.conf沒有做設定,則默認值是1024,當前環境的用戶所有進程能打開的最大問價數量由ulimit -n決定
```
```
內核優化
net.ipv4.ip_forward = 0? #表示禁止數據包轉發,關閉linux 的轉發功能
net.ipv4.conf.default.rp_filter = 1? #啟用源路由核查功能
net.ipv4.conf.default.accept_source_route = 0? ##禁用所有IP源路由
kernel.sysrq = 0? #使用sysrq組合鍵是了解系統目前運行情況,為安全起見設為0關閉
kernel.core_uses_pid = 1? #控制core文件的文件名是否添加pid作為擴展
# 表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防范少量SYN攻擊,默認為0,表示關閉;什么是SYN
# SYN Cookie是對TCP服務器端的三次握手做一些修改,專門用來防范SYN Flood攻擊的一種手段。它的原理是,在TCP服務器
# 接收到TCP SYN包并返回TCP SYN + ACK包時,不分配一個專門的數據區,而是根據這個SYN包計算出一個cookie值。這個cookie作為將要返回的SYN ACK包的初始序列號。當客戶端返回一個ACK包時,根據包頭信息計算cookie,與返回的確認序列號(初始序列號 + 1)進行對比,如果相同,則是一個正常連接,然后,分配資源,建立連接。
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536? #每個消息隊列的大小(單位:字節)限制, 所有在消息隊列中的消息總和的最大值(msgmnb=64k)
kernel.msgmax = 65536? #指定內核中消息隊列中消息的最大值(msgmax=64k)
# 前方高能!是核心參數中最重要的參數之一,用于定義單個共享內存段的最大值,64位linux系統:可取的最大值為物理內存值-1byte,
# 建議值為多于物理內存的一半,一般取值大于SGA_MAX_SIZE即可,可以取物理內存-1byte。
# 例如,如果為64GB物理內存,可取64*1024*1024*1024-1=68719476735
kernel.shmmax = 68719476735 (使用公式計算)
# 該參數控制可以使用的共享內存的總頁數。Linux共享內存頁大小為4KB,共享內存段的大小都是共享內存頁大小的整數倍。一個
# 共享內存段的最大大小是 16G,那么需要共享內存頁數是16GB/4KB=16777216KB /4KB=4194304(頁),也就是64Bit系統下16GB物理內存,設置kernel.shmall = 4194304才符合要求(幾乎是原來設置2097152的兩倍)
kernel.shmall = 4294967296(使用公式計算)
# 表示系統同時保持TIME_WAIT套接字的最大數量,如果超過這個數字,TIME_WAIT套接字將立刻被清除并打印警告信息。默認為180000。設為較小數值此項參數可以控制TIME_WAIT套接字的最大數量,避免服務器被大量的TIME_WAIT套接字拖死。
net.ipv4.tcp_max_tw_buckets = 6000
# 使 用 Selective ACK﹐它可以用來查找特定的遺失的數據報— 因此有助于快速恢復狀態。該文件表示是否啟用有選擇的應答(Selective Acknowledgment),這可以通過有選擇地應答亂序接收到的報文來提高性能(這樣可以讓發送者只發送丟失的報文段)。(對于廣域網通信來說這個選項應該啟用,但是這會增加對 CPU 的占用。)
net.ipv4.tcp_sack = 1
#打開FACK擁塞避免和快速重傳功能。(注意,當tcp_sack設置為0的時候,這個值即使設置為1也無效)啟用轉發應答(Forward Acknowledgment),這可以進行有選擇應答(SACK)從而減少擁塞情況的發生;這個選項也應該啟用。
net.ipv4.tcp_fack = 1
# 允許TCP發送”兩個完全相同”的SACK。
##一個布爾類型的標志,控制著當有很多的連接請求時內核的行為。啟用的話,如果服務超載,內核將主動地發送RST包。
net.ipv4.tcp_abort_on_overflow = 1
net.ipv4.tcp_dsack = 1
#對于高速網絡該值可能太小,這時候如果啟用了該功能,可以使tcp/ip滑動窗口大小增大數個數量級,從而提高數據傳輸的能力。對普通地百M網絡而言,關閉會降低開銷,所以如果不是高速網絡,可以考慮設置為0
net.ipv4.tcp_window_scaling = 1
# #TCP接收緩沖區
net.ipv4.tcp_rmem = 4096 87380 4194304
# #TCP發送緩沖區
net.ipv4.tcp_wmem = 4096 66384 4194304
# #該文件指定了發送套接字緩沖區大小的缺省值(以字節為單位)。
net.core.wmem_default = 8388608
#該文件指定了發送套接字緩沖區大小的缺省值(以字節為單位)。
net.core.rmem_default = 8388608
# #指定了接收套接字緩沖區大小的最大值(以字節為單位)。
net.core.rmem_max = 16777216
#指定了發送套接字緩沖區大小的最大值(以字節為單位)。
net.core.wmem_max = 16777216
# 該參數決定了, 每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目, 不要設的過大
net.core.netdev_max_backlog = 262144
# 定義了系統中每一個端口最大的監聽隊列的長度, 對于一個經常處理新連接的高負載 web服務環境來說,默認的 128 太小了。
net.core.somaxconn = 262144? 允許等待中的監聽
# 系統所能處理不屬于任何進程的TCP sockets最大數量。假如超過這個數量,那么不屬于任何進程的連接會被立即reset,并同時顯示警告信息。之所以要設定這個限制﹐純粹為了抵御那些簡單的 DoS 攻擊﹐千萬不要依賴這個或是人為的降低這個限制,更應該增加這個值(如果增加了內存之后)。每個孤兒套接字最多能夠吃掉你64K不可交換的內存。
net.ipv4.tcp_max_orphans = 3276800
# 表示SYN隊列的長度,默認為1024,加大隊列長度為8192,可以容納更多等待連接的網絡連接數。
net.ipv4.tcp_max_syn_backlog = 262144
# 時間戳,0關閉, 1開啟,在(請參考RFC 1323)TCP的包頭增加12個字節, 關于該配置對TIME_WAIT的影響及可能引起的問題: http://huoding.com/2012/01/19/142 , Timestamps 用在其它一些東西中﹐可以防范那些偽造的 sequence 號碼。一條1G的寬帶線路或許會重遇到帶 out-of-line數值的舊sequence 號碼(假如它是由于上次產生的)。Timestamp 會讓它知道這是個 ‘舊封包’。(該文件表示是否啟用以一種比超時重發更精確的方法(RFC 1323)來啟用對 RTT 的計算;為了實現更好的性能應該啟用這個選項。)
net.ipv4.tcp_timestamps = 0
# tcp_synack_retries 顯示或設定 Linux 核心在回應 SYN 要求時會嘗試多少次重新發送初始 SYN,ACK 封包后才決定放棄。這是所謂的三段交握 (threeway handshake) 的第二個步驟。即是說系統會嘗試多少次去建立由遠端啟始的 TCP 連線。tcp_synack_retries 的值必須為正整數,并不能超過 255。因為每一次重新發送封包都會耗費約 30 至 40 秒去等待才決定嘗試下一次重新發送或決定放棄。tcp_synack_retries 的缺省值為 5,即每一個連線要在約 180 秒 (3 分鐘) 后才確定逾時.
net.ipv4.tcp_synack_retries = 1
# 對于一個新建連接,內核要發送多少個 SYN 連接請求才決定放棄。不應該大于255,默認值是5,對應于180秒左右時間。(對于大負載而物理通信良好的網絡而言,這個值偏高,可修改為2.這個值僅僅是針對對外的連接,對進來的連接,是由tcp_retries1 決定的)
net.ipv4.tcp_syn_retries = 1
# 放棄回應一個TCP連接請求前﹐需要進行多少次重試。RFC 規定最低的數值是3﹐這也是默認值﹐根據RTO的值大約在3秒 - 8分鐘之間。(注意:這個值同時還決定進入的syn連接)
net.ipv4.tcp_retries1 = 3
# 在丟棄激活(已建立通訊狀況)的TCP連接之前﹐需要進行多少次重試。默認值為15,根據RTO的值來決定,相當于13-30分鐘(RFC1122規定,必須大于100秒).(這個值根據目前的網絡設置,可以適當地改小,我的網絡內修改為了5)
net.ipv4.tcp_retries2 = 15
# 表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉。
net.ipv4.tcp_tw_recycle = 1? tcp連接快速回收
# 表示開啟重用。允許將TIME-WAIT sockets重新用于新的TCP連接,默認為0,表示關閉;
net.ipv4.tcp_tw_reuse = 1 tcp連接重用
net.ipv4.tcp_mem = 94500000 915000000 927000000
# 表示如果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間。
net.ipv4.tcp_fin_timeout = 1
# TCP發送keepalive探測以確定該連接已經斷開的次數。(注意:保持連接僅在SO_KEEPALIVE套接字選項被打開是才發送.次數默認不需要修改,當然根據情形也可以適當地縮短此值.設置為5比較合適)
net.ipv4.tcp_keepalive_probes = 5
# 探測消息發送的頻率,乘以tcp_keepalive_probes就得到對于從開始探測以來沒有響應的連接殺除的時間。默認值為75秒,也就是沒有活動的連接將在大約11分鐘以后將被丟棄。(對于普通應用來說,這個值有一些偏大,可以根據需要改小.特別是web類服務器需要改小該值,15是個比較合適的值)
net.ipv4.tcp_keepalive_intvl = 15
# 表示當keepalive起用的時候,TCP發送keepalive消息的頻度。缺省是2小時。
net.ipv4.tcp_keepalive_time = 30
# 表示用于向外連接的端口范圍。缺省情況下很小:32768到61000,改為1024到65000。
net.ipv4.ip_local_port_range = 1024 65000
# 本端試圖關閉TCP連接之前重試多少次。缺省值是7,相當于50秒~16分鐘(取決于RTO)。如果你的機器是一個重載的WEB服務器,你應該考慮減低這個值,因為這樣的套接字會消耗很多重要的資源。參見tcp_max_orphans.
net.ipv4.tcp_orphan_retries = 3
# 跟蹤的連接超時結束時間,
net.netfilter.nf_conntrack_tcp_timeout_established = 180
在內核內存中netfilter可以同時處理的“任務”(連接跟蹤條目)
net.nf_conntrack_max = 655360
防火墻(建議關掉)防火墻開啟情況下此模塊可能失效
在kernel2.6之前的添加項:
net.ipv4.netfilter.ip_conntrack_max = 655360
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180
kernel2.6之后的添加項:
net.nf_conntrack_max = 655360
net.netfilter.nf_conntrack_tcp_timeout_established = 120
對于帶有超過1G內存的系統,CONNTRACK_MAX的默認值會被限制在65536(但是可以手工設置成更大的值)
這個錯誤可能是你的防火墻沒有開啟或者自動處理可載入的模塊ip_conntrack沒有自動載入,解決辦法有二,一是開啟防火墻,二是自動處理開載入的模塊ip_conntrack
modprobe nf_conntrack
echo "modprobe nf_conntrack">> /etc/rc.local
error: "net.bridge.bridge-nf-call-ip6tables"isan unknown key
error: "net.bridge.bridge-nf-call-iptables"isan unknown key
error: "net.bridge.bridge-nf-call-arptables"isan unknown key
這個錯誤是由于自動處理可載入的模塊bridge沒有自動載入,解決辦法是自動處理開載入的模塊 ip_conntrack
modprobe bridge
echo "modprobe bridge">> /etc/rc.local
```
```
內核優化參考配置? /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476735 (使用公式計算(服務器內存xG,)16G*1024*1024*1024-1)
kernel.shmall = 4294967296 (使用公式計算 服務器內存xG,)16G*1024*1024*1024/4KB(頁))
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1
net.ipv4.tcp_dsack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 66384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144 /(超過10W并發用這個)862144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 262144 /(超過10W并發用這個) 327680
net.ipv4.tcp_max_syn_backlog = 262144 / (超過10W并發用這個)1020000? (根據情況配置)
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_retries1 = 3
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 15/(超過十萬調為)1
net.ipv4.tcp_keepalive_probes = 5/3
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_time = 1200 / (超過十萬調為)30
net.ipv4.ip_local_port_range = 1024 65000
net.nf_conntrack_max = 655360/(超過10W并發用這個)1048576
net.netfilter.nf_conntrack_tcp_timeout_established = 180/(超過10W并發用這個)120
#####網上超過十萬并發參考配置
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_abort_on_overflow = 1
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096? ? ? ? 87380? 4194304
net.ipv4.tcp_wmem = 4096? ? ? ? 66384? 4194304
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.core.optmem_max = 81920
net.core.wmem_default = 8388608
net.core.wmem_max = 16777216
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.ipv4.tcp_max_syn_backlog = 1020000
net.core.netdev_max_backlog = 862144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024? ? 65000
net.netfilter.nf_conntrack_tcp_timeout_established = 180
net.nf_conntrack_max = 1048576
實戰Nginx取代Apache的高性能Web服務器 建議配置
net.ipv4.tcp_max_syn_backlog=65536
net.core.netdev_max_backlog=32768
net.core.somaxconn=32768
net.core.wmen_default=8388608
net.core.rmen_default=8388608
net.core.rmem_max=16777216
net.core.wmen_max=16777216
net.ipv4.tcp_timestamps=0
net.ipv4.top_synack_retrides=2
net.ipv4.tcp_syn_retries=2
net.ipv4.tcp_tw_recycle=1
#net.ipv4.tcp_tw_len=1
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_mem=94500000 915000000 927000000
net.ipv4.tcp_max_orphans=3276800
#net.ipv4.tcp_fin_timeout=30
#net.ipv4.tcp_keepalive_time=120
net.ipv4.ip_local_port_range=1024 65535
```
參考
實戰Nginx取代Apache的高性能Web服務器 - 張宴
http://wushank.blog.51cto.com/3489095/1617874
http://www.linuxidc.com/Linux/2012-11/75151.htm
http://blog.csdn.net/moxiaomomo/article/details/19442737
http://blog.csdn.net/tiantiandjava/article/details/42741021
http://blog.csdn.net/u010419967/article/details/36470431
http://blog.csdn.net/robertsong2004/article/details/41725715
http://www.cnblogs.com/qizhelongdeyang/p/6401275.html
http://blog.csdn.net/largetalk/article/details/16863689
http://www.cnblogs.com/kevingrace/p/6094007.html
http://blog.csdn.net/u011957758/article/details/50959823
http://blog.csdn.net/largetalk/article/details/16863689