Nginx系統優化篇

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容