對(duì)于新部署的機(jī)器,需要做一些基本的調(diào)優(yōu)操作,以更改一些默認(rèn)配置帶來(lái)的性能問題
1 修改打開文件數(shù)
root@mysql:/data/tools/db# vim /etc/security/limits.conf
* soft nofile 65535
* soft nproc 65535
* hard nofile 65535
* hard nproc 65535
root@mysql:/data/tools/db# cd /etc/security/limits.d/
root@mysql:/etc/security/limits.d# vim 90-nofile.conf
* soft nofile 65535
* hard nofile 65535
root soft nofile unlimited
2 內(nèi)核方面的調(diào)優(yōu)
root@mysql:~# cat /etc/sysctl.conf
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 32768
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_wmem = 8192 131072 16777216
net.ipv4.tcp_rmem = 32768 131072 16777216
net.ipv4.tcp_mem = 786432 1048576 1572864
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.ip_conntrack_max = 65536
net.ipv4.netfilter.ip_conntrack_max=65536
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=180
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
vm.swappiness=10
修改完畢后,重啟新機(jī)器即可。
對(duì)參數(shù)的解析
下列文件所在目錄:/proc/sys/net/ipv4/
名稱 |
默認(rèn)值 |
建議值 |
描述 |
tcp_syn_retries |
5 |
1 |
對(duì)于一個(gè)新建連接,內(nèi)核要發(fā)送多少個(gè) SYN 連接請(qǐng)求才決定放棄。不應(yīng)該大于255,默認(rèn)值是5,對(duì)應(yīng)于180秒左右時(shí)間。。(對(duì)于大負(fù)載而物理通信良好的網(wǎng)絡(luò)而言,這個(gè)值偏高,可修改為2.這個(gè)值僅僅是針對(duì)對(duì)外的連接,對(duì)進(jìn)來(lái)的連接,是由tcp_retries1決定的) |
tcp_synack_retries |
5 |
1 |
對(duì)于遠(yuǎn)端的連接請(qǐng)求SYN,內(nèi)核會(huì)發(fā)送SYN + ACK數(shù)據(jù)報(bào),以確認(rèn)收到上一個(gè) SYN連接請(qǐng)求包。這是所謂的三次握手( threeway handshake)機(jī)制的第二個(gè)步驟。這里決定內(nèi)核在放棄連接之前所送出的 SYN+ACK 數(shù)目。不應(yīng)該大于255,默認(rèn)值是5,對(duì)應(yīng)于180秒左右時(shí)間。 |
tcp_keepalive_time |
7200 |
600 |
TCP發(fā)送keepalive探測(cè)消息的間隔時(shí)間(秒),用于確認(rèn)TCP連接是否有效。 防止兩邊建立連接但不發(fā)送數(shù)據(jù)的攻擊。 |
tcp_keepalive_probes |
9 |
3 |
TCP發(fā)送keepalive探測(cè)消息的間隔時(shí)間(秒),用于確認(rèn)TCP連接是否有效。 |
tcp_keepalive_intvl |
75 |
15 |
探測(cè)消息未獲得響應(yīng)時(shí),重發(fā)該消息的間隔時(shí)間(秒)。默認(rèn)值為75秒。 (對(duì)于普通應(yīng)用來(lái)說,這個(gè)值有一些偏大,可以根據(jù)需要改小.特別是web類服務(wù)器需要改小該值,15是個(gè)比較合適的值) |
tcp_retries1 |
3 |
3 |
放棄回應(yīng)一個(gè)TCP連接請(qǐng)求前﹐需要進(jìn)行多少次重試。RFC規(guī)定最低的數(shù)值是3 |
tcp_retries2 |
15 |
5 |
在丟棄激活(已建立通訊狀況)的TCP連接之前﹐需要進(jìn)行多少次重試。默認(rèn)值為15,根據(jù)RTO的值來(lái)決定,相當(dāng)于13-30分鐘(RFC1122規(guī)定,必須大于100秒).(這個(gè)值根據(jù)目前的網(wǎng)絡(luò)設(shè)置,可以適當(dāng)?shù)馗男?我的網(wǎng)絡(luò)內(nèi)修改為了5) |
tcp_orphan_retries |
7 |
3 |
在近端丟棄TCP連接之前﹐要進(jìn)行多少次重試。默認(rèn)值是7個(gè)﹐相當(dāng)于 50秒 - 16分鐘﹐視 RTO 而定。如果您的系統(tǒng)是負(fù)載很大的web服務(wù)器﹐那么也許需要降低該值﹐這類 sockets 可能會(huì)耗費(fèi)大量的資源。另外參的考tcp_max_orphans。(事實(shí)上做NAT的時(shí)候,降低該值也是好處顯著的,我本人的網(wǎng)絡(luò)環(huán)境中降低該值為3) |
tcp_fin_timeout |
60 |
2 |
對(duì)于本端斷開的socket連接,TCP保持在FIN-WAIT-2狀態(tài)的時(shí)間。對(duì)方可能會(huì)斷開連接或一直不結(jié)束連接或不可預(yù)料的進(jìn)程死亡。默認(rèn)值為 60 秒。 |
tcp_max_tw_buckets |
180000 |
36000 |
系統(tǒng)在同時(shí)所處理的最大 timewait sockets 數(shù)目。如果超過此數(shù)的話﹐time-wait socket 會(huì)被立即砍除并且顯示警告信息。之所以要設(shè)定這個(gè)限制﹐純粹為了抵御那些簡(jiǎn)單的 DoS 攻擊﹐不過﹐如果網(wǎng)絡(luò)條件需要比默認(rèn)值更多﹐則可以提高它(或許還要增加內(nèi)存)。(事實(shí)上做NAT的時(shí)候最好可以適當(dāng)?shù)卦黾釉撝? |
tcp_tw_recycle |
0 |
1 |
打開快速 TIME-WAIT sockets 回收。除非得到技術(shù)專家的建議或要求﹐請(qǐng)不要隨意修改這個(gè)值。(做NAT的時(shí)候,建議打開它) |
tcp_tw_reuse |
0 |
1 |
表示是否允許重新應(yīng)用處于TIME-WAIT狀態(tài)的socket用于新的TCP連接(這個(gè)對(duì)快速重啟動(dòng)某些服務(wù),而啟動(dòng)后提示端口已經(jīng)被使用的情形非常有幫助) |
tcp_max_orphans |
8192 |
32768 |
系統(tǒng)所能處理不屬于任何進(jìn)程的TCP sockets最大數(shù)量。假如超過這個(gè)數(shù)量﹐那么不屬于任何進(jìn)程的連接會(huì)被立即reset,并同時(shí)顯示警告信息。之所以要設(shè)定這個(gè)限制﹐純粹為了抵御那些簡(jiǎn)單的 DoS 攻擊﹐千萬(wàn)不要依賴這個(gè)或是人為的降低這個(gè)限制。如果內(nèi)存大更應(yīng)該增加這個(gè)值。(這個(gè)值Redhat AS版本中設(shè)置為32768,但是很多防火墻修改的時(shí)候,建議該值修改為2000) |
tcp_abort_on_overflow |
0 |
0 |
當(dāng)守護(hù)進(jìn)程太忙而不能接受新的連接,就象對(duì)方發(fā)送reset消息,默認(rèn)值是false。這意味著當(dāng)溢出的原因是因?yàn)橐粋€(gè)偶然的猝發(fā),那么連接將恢復(fù)狀態(tài)。只有在你確信守護(hù)進(jìn)程真的不能完成連接請(qǐng)求時(shí)才打開該選項(xiàng),該選項(xiàng)會(huì)影響客戶的使用。(對(duì)待已經(jīng)滿載的sendmail,apache這類服務(wù)的時(shí)候,這個(gè)可以很快讓客戶端終止連接,可以給予服務(wù)程序處理已有連接的緩沖機(jī)會(huì),所以很多防火墻上推薦打開它) |
tcp_syncookies |
0 |
1 |
只有在內(nèi)核編譯時(shí)選擇了CONFIG_SYNCOOKIES時(shí)才會(huì)發(fā)生作用。當(dāng)出現(xiàn)syn等候隊(duì)列出現(xiàn)溢出時(shí)象對(duì)方發(fā)送syncookies。目的是為了防止syn flood攻擊。 |
tcp_stdurg |
0 |
0 |
使用 TCP urg pointer 字段中的主機(jī)請(qǐng)求解釋功能。大部份的主機(jī)都使用老舊的 BSD解釋,因此如果您在 Linux打開它﹐或會(huì)導(dǎo)致不能和它們正確溝通。 |
tcp_max_syn_backlog |
1024 |
16384 |
對(duì)于那些依然還未獲得客戶端確認(rèn)的連接請(qǐng)求﹐需要保存在隊(duì)列中最大數(shù)目。對(duì)于超過 128Mb 內(nèi)存的系統(tǒng)﹐默認(rèn)值是 1024 ﹐低于 128Mb 的則為 128。如果服務(wù)器經(jīng)常出現(xiàn)過載﹐可以嘗試增加這個(gè)數(shù)字。警告﹗假如您將此值設(shè)為大于 1024﹐最好修改include/net/tcp.h里面的TCP_SYNQ_HSIZE﹐以保持TCP_SYNQ_HSIZE*16(SYN Flood攻擊利用TCP協(xié)議散布握手的缺陷,偽造虛假源IP地址發(fā)送大量TCP-SYN半打開連接到目標(biāo)系統(tǒng),最終導(dǎo)致目標(biāo)系統(tǒng)Socket隊(duì)列資源耗盡而無(wú)法接受新的連接。為了應(yīng)付這種攻擊,現(xiàn)代Unix系統(tǒng)中普遍采用多連接隊(duì)列處理的方式來(lái)緩沖(而不是解決)這種攻擊,是用一個(gè)基本隊(duì)列處理正常的完全連接應(yīng)用(Connect()和Accept() ),是用另一個(gè)隊(duì)列單獨(dú)存放半打開連接。這種雙隊(duì)列處理方式和其他一些系統(tǒng)內(nèi)核措施(例如Syn-Cookies/Caches)聯(lián)合應(yīng)用時(shí),能夠比較有效的緩解小規(guī)模的SYN Flood攻擊(事實(shí)證明) |
tcp_window_scaling |
1 |
1 |
該文件表示設(shè)置tcp/ip會(huì)話的滑動(dòng)窗口大小是否可變。參數(shù)值為布爾值,為1時(shí)表示可變,為0時(shí)表示不可變。tcp/ip通常使用的窗口最大可達(dá)到 65535 字節(jié),對(duì)于高速網(wǎng)絡(luò),該值可能太小,這時(shí)候如果啟用了該功能,可以使tcp/ip滑動(dòng)窗口大小增大數(shù)個(gè)數(shù)量級(jí),從而提高數(shù)據(jù)傳輸?shù)哪芰?RFC 1323)。(對(duì)普通地百M(fèi)網(wǎng)絡(luò)而言,關(guān)閉會(huì)降低開銷,所以如果不是高速網(wǎng)絡(luò),可以考慮設(shè)置為0) |
tcp_timestamps |
1 |
1 |
Timestamps 用在其它一些東西中﹐可以防范那些偽造的sequence 號(hào)碼。一條1G的寬帶線路或許會(huì)重遇到帶 out-of-line數(shù)值的舊sequence 號(hào)碼(假如它是由于上次產(chǎn)生的)。Timestamp 會(huì)讓它知道這是個(gè) '舊封包'。(該文件表示是否啟用以一種比超時(shí)重發(fā)更精確的方法(RFC 1323)來(lái)啟用對(duì) RTT 的計(jì)算;為了實(shí)現(xiàn)更好的性能應(yīng)該啟用這個(gè)選項(xiàng)。) |
tcp_sack |
1 |
1 |
使用 Selective ACK﹐它可以用來(lái)查找特定的遺失的數(shù)據(jù)報(bào)--- 因此有助于快速恢復(fù)狀態(tài)。該文件表示是否啟用有選擇的應(yīng)答(Selective Acknowledgment),這可以通過有選擇地應(yīng)答亂序接收到的報(bào)文來(lái)提高性能(這樣可以讓發(fā)送者只發(fā)送丟失的報(bào)文段)。(對(duì)于廣域網(wǎng)通信來(lái)說這個(gè)選項(xiàng)應(yīng)該啟用,但是這會(huì)增加對(duì) CPU 的占用。) |
tcp_fack |
1 |
1 |
打開FACK擁塞避免和快速重傳功能。(注意,當(dāng)tcp_sack設(shè)置為0的時(shí)候,這個(gè)值即使設(shè)置為1也無(wú)效)[這個(gè)是TCP連接靠譜的核心功能] |
tcp_dsack |
1 |
1 |
允許TCP發(fā)送"兩個(gè)完全相同"的SACK。 |
tcp_ecn |
0 |
0 |
TCP的直接擁塞通告功能。 |
tcp_reordering |
3 |
6 |
TCP流中重排序的數(shù)據(jù)報(bào)最大數(shù)量。 (一般有看到推薦把這個(gè)數(shù)值略微調(diào)整大一些,比如5) |
tcp_retrans_collapse |
1 |
0 |
對(duì)于某些有bug的打印機(jī)提供針對(duì)其bug的兼容性。(一般不需要這個(gè)支持,可以關(guān)閉它) |
tcp_wmem:mindefaultmax |
4096 16384 131072 |
8192 131072 16777216 |
發(fā)送緩存設(shè)置 min:為TCP socket預(yù)留用于發(fā)送緩沖的內(nèi)存最小值。每個(gè)tcp socket都可以在建議以后都可以使用它。默認(rèn)值為4096(4K)。 default:為TCP socket預(yù)留用于發(fā)送緩沖的內(nèi)存數(shù)量,默認(rèn)情況下該值會(huì)影響其它協(xié)議使用的net.core.wmem_default 值,一般要低于net.core.wmem_default的值。默認(rèn)值為16384(16K)。 max: 用于TCP socket發(fā)送緩沖的內(nèi)存最大值。該值不會(huì)影響net.core.wmem_max,"靜態(tài)"選擇參數(shù)SO_SNDBUF則不受該值影響。默認(rèn)值為131072(128K)。(對(duì)于服務(wù)器而言,增加這個(gè)參數(shù)的值對(duì)于發(fā)送數(shù)據(jù)很有幫助,在我的網(wǎng)絡(luò)環(huán)境中,修改為了51200 131072 204800) |
tcp_rmem:mindefaultmax |
4096 87380 174760 |
32768 131072 16777216 |
接收緩存設(shè)置 同tcp_wmem |
tcp_mem:mindefaultmax |
根據(jù)內(nèi)存計(jì)算 |
786432 1048576 1572864 |
low:當(dāng)TCP使用了低于該值的內(nèi)存頁(yè)面數(shù)時(shí),TCP不會(huì)考慮釋放內(nèi)存。即低于此值沒有內(nèi)存壓力。(理想情況下,這個(gè)值應(yīng)與指定給 tcp_wmem 的第 2 個(gè)值相匹配 - 這第 2 個(gè)值表明,最大頁(yè)面大小乘以最大并發(fā)請(qǐng)求數(shù)除以頁(yè)大小 (131072 * 300 / 4096)。 ) pressure:當(dāng)TCP使用了超過該值的內(nèi)存頁(yè)面數(shù)量時(shí),TCP試圖穩(wěn)定其內(nèi)存使用,進(jìn)入pressure模式,當(dāng)內(nèi)存消耗低于low值時(shí)則退出pressure狀態(tài)。(理想情況下這個(gè)值應(yīng)該是 TCP 可以使用的總緩沖區(qū)大小的最大值 (204800 * 300 / 4096)。 ) high:允許所有tcp sockets用于排隊(duì)緩沖數(shù)據(jù)報(bào)的頁(yè)面量。(如果超過這個(gè)值,TCP 連接將被拒絕,這就是為什么不要令其過于保守 (512000 * 300 / 4096) 的原因了。 在這種情況下,提供的價(jià)值很大,它能處理很多連接,是所預(yù)期的 2.5 倍;或者使現(xiàn)有連接能夠傳輸 2.5 倍的數(shù)據(jù)。 我的網(wǎng)絡(luò)里為192000 300000 732000) 一般情況下這些值是在系統(tǒng)啟動(dòng)時(shí)根據(jù)系統(tǒng)內(nèi)存數(shù)量計(jì)算得到的。 |
tcp_app_win |
31 |
31 |
保留max(window/2^tcp_app_win, mss)數(shù)量的窗口由于應(yīng)用緩沖。當(dāng)為0時(shí)表示不需要緩沖。 |
tcp_adv_win_scale |
2 |
2 |
計(jì)算緩沖開銷bytes/2^tcp_adv_win_scale(如果tcp_adv_win_scale > 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale BOOLEAN>0) |
tcp_low_latency |
0 |
0 |
允許 TCP/IP 棧適應(yīng)在高吞吐量情況下低延時(shí)的情況;這個(gè)選項(xiàng)一般情形是的禁用。(但在構(gòu)建Beowulf 集群的時(shí)候,打開它很有幫助) |
tcp_westwood |
0 |
0 |
啟用發(fā)送者端的擁塞控制算法,它可以維護(hù)對(duì)吞吐量的評(píng)估,并試圖對(duì)帶寬的整體利用情況進(jìn)行優(yōu)化;對(duì)于 WAN通信來(lái)說應(yīng)該啟用這個(gè)選項(xiàng)。 |
tcp_bic |
0 |
0 |
為快速長(zhǎng)距離網(wǎng)絡(luò)啟用 Binary Increase Congestion;這樣可以更好地利用以 GB 速度進(jìn)行操作的鏈接;對(duì)于WAN 通信應(yīng)該啟用這個(gè)選項(xiàng)。 |
ip_forward |
0 |
- |
NAT必須開啟IP轉(zhuǎn)發(fā)支持,把該值寫1 |
ip_local_port_range:minmax |
32768 61000 |
1024 65000 |
表示用于向外連接的端口范圍,默認(rèn)比較小,這個(gè)范圍同樣會(huì)間接用于NAT表規(guī)模。 |
ip_conntrack_max |
65535 |
65535 |
系統(tǒng)支持的最大ipv4連接數(shù),默認(rèn)65536(事實(shí)上這也是理論最大值),同時(shí)這個(gè)值和你的內(nèi)存大小有關(guān),如果內(nèi)存128M,這個(gè)值最大8192,1G以上內(nèi)存這個(gè)值都是默認(rèn)65536 |
所處目錄/proc/sys/net/ipv4/netfilter/
文件需要打開防火墻才會(huì)存在
名稱 |
默認(rèn)值 |
建議值 |
描述 |
ip_conntrack_max |
65536 |
65536 |
系統(tǒng)支持的最大ipv4連接數(shù),默認(rèn)65536(事實(shí)上這也是理論最大值),同時(shí)這個(gè)值和你的內(nèi)存大小有關(guān),如果內(nèi)存128M,這個(gè)值最大8192,1G以上內(nèi)存這個(gè)值都是默認(rèn)65536,這個(gè)值受/proc/sys/net/ipv4/ip_conntrack_max限制
|
ip_conntrack_tcp_timeout_established |
432000 |
180 |
已建立的tcp連接的超時(shí)時(shí)間,默認(rèn)432000,也就是5天。影響:這個(gè)值過大將導(dǎo)致一些可能已經(jīng)不用的連接常駐于內(nèi)存中,占用大量鏈接資源,從而可能導(dǎo)致NAT ip_conntrack: table full的問題。建議:對(duì)于NAT負(fù)載相對(duì)本機(jī)的 NAT表大小很緊張的時(shí)候,可能需要考慮縮小這個(gè)值,以盡早清除連接,保證有可用的連接資源;如果不緊張,不必修改 |
ip_conntrack_tcp_timeout_time_wait |
120 |
120 |
time_wait狀態(tài)超時(shí)時(shí)間,超過該時(shí)間就清除該連接 |
ip_conntrack_tcp_timeout_close_wait |
60 |
60 |
close_wait狀態(tài)超時(shí)時(shí)間,超過該時(shí)間就清除該連接 |
ip_conntrack_tcp_timeout_fin_wait |
120 |
120 |
fin_wait狀態(tài)超時(shí)時(shí)間,超過該時(shí)間就清除該連接 |
文件所處目錄/proc/sys/net/core/
名稱 |
默認(rèn)值 |
建議值 |
描述 |
netdev_max_backlog
|
1024 |
16384 |
每個(gè)網(wǎng)絡(luò)接口接收數(shù)據(jù)包的速率比內(nèi)核處理這些包的速率快時(shí),允許送到隊(duì)列的數(shù)據(jù)包的最大數(shù)目,對(duì)重負(fù)載服務(wù)器而言,該值需要調(diào)高一點(diǎn)。 |
somaxconn
|
128 |
16384 |
用來(lái)限制監(jiān)聽(LISTEN)隊(duì)列最大數(shù)據(jù)包的數(shù)量,超過這個(gè)數(shù)量就會(huì)導(dǎo)致鏈接超時(shí)或者觸發(fā)重傳機(jī)制。 web應(yīng)用中l(wèi)isten函數(shù)的backlog默認(rèn)會(huì)給我們內(nèi)核參數(shù)的net.core.somaxconn限制到128,而nginx定義的NGX_LISTEN_BACKLOG默認(rèn)為511,所以有必要調(diào)整這個(gè)值。對(duì)繁忙的服務(wù)器,增加該值有助于網(wǎng)絡(luò)性能 |
wmem_default
|
129024 |
129024 |
默認(rèn)的發(fā)送窗口大小(以字節(jié)為單位) |
rmem_default
|
129024 |
129024 |
默認(rèn)的接收窗口大?。ㄒ宰止?jié)為單位) |
rmem_max
|
129024 |
873200 |
最大的TCP數(shù)據(jù)接收緩沖 |
wmem_max |
129024 |
873200 |
最大的TCP數(shù)據(jù)發(fā)送緩沖 |
參考文獻(xiàn)