新聞中心
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)如何進(jìn)行Linux內(nèi)核參數(shù)優(yōu)化,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
Linux內(nèi)核參數(shù)優(yōu)化
我的內(nèi)核心參數(shù)調(diào)整原則是,哪個(gè)遇到瓶頸調(diào)哪個(gè),謹(jǐn)慎使用,不能憑想象亂調(diào)一氣??聪旅胬?,其中default是我們公司定做的系統(tǒng)默認(rèn)的一些參數(shù)值。add
by yangjian2并非全部都要調(diào)整,我只挑幾個(gè)比較重要的參數(shù)說(shuō)明一下,更多TCP方面的調(diào)優(yōu)請(qǐng)參見(jiàn) man 7 tcp 。
#++++++++++++++++++default++++++++++++++++++++++++++++++
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_tw_buckets = 180000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
#++++++++++++++++++add by yangjian2++++++++++++++++++++++
net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 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
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++
maxfd: 對(duì)于系統(tǒng)所能打開(kāi)的較大文件描述符fd,可以通過(guò)以root啟動(dòng)程序,setrlimit()設(shè)置maxfd后,再通過(guò)setuid()轉(zhuǎn)為普通用戶(hù)提供服務(wù),我用的 int set_max_fds(int maxfds); 函數(shù)是zhongying提供的。這比用ulimit來(lái)的方便的多,不曉得為什么那么多開(kāi)源軟件都沒(méi)這樣用。
net.ipv4.tcp_max_syn_backlog = 65536 : 這個(gè)參數(shù)可以肯定是必須要修改的,默認(rèn)值1024,我google了一下,幾乎是人云亦云,沒(méi)有說(shuō)的明白的。 要講明白得從man listen說(shuō)起,int listen(int sockfd, int backlog); 早期的網(wǎng)絡(luò)編程都中描述,int backlog 代表未完成隊(duì)列SYN_RECV狀態(tài)+已完成隊(duì)列ESTABLISHED的和。但是這個(gè)意義在Linux 2.2以后的實(shí)現(xiàn)中已經(jīng)被改變了,int
backlog只代表已完成隊(duì)列ESTABLISHED的長(zhǎng)度,在AF_INET協(xié)議族中(我們廣泛使用的就是這個(gè)),當(dāng)int backlog大于SOMAXCONN (128 in Linux 2.0
& 2.2)的時(shí)候,會(huì)被調(diào)整為常量SOMAXCONN大小。這個(gè)常量可以通過(guò)net.core.somaxconn來(lái)修改。而未完成隊(duì)列大小可以通過(guò)net.ipv4.tcp_max_syn_backlog來(lái)調(diào)整,一般遭受syn flood攻擊的網(wǎng)站,都存在大量SYN_RECV狀態(tài),所以調(diào)大tcp_max_syn_backlog值能增加抵抗syn攻擊的能力。
net.ipv4.tcp_syncookies = 1 : 當(dāng)出現(xiàn)syn等候隊(duì)列出現(xiàn)溢出時(shí)象對(duì)方發(fā)送syncookies。目的是為了防止syn flood攻擊 , 默認(rèn)值是 0。 不過(guò)man listen說(shuō)當(dāng)啟用syncookies時(shí)候,tcp_max_syn_backlog的sysctl調(diào)整將失效,和這個(gè)描述不是很符合。參見(jiàn)下面兩個(gè)描述分別是man listen和man 7 tcp:
When syncookies are enabled there is no logical maximum length and this tcp_max_syn_backlog sysctl setting is ignored.
Send out syncookies when the syn backlog queue of a socket overflows.
但我可以肯定的說(shuō)這個(gè)選項(xiàng)對(duì)你的性能不會(huì)有提高,而且它嚴(yán)重的違背TCP協(xié)議,不允許使用TCP擴(kuò)展,除非遭受攻擊,否則不推薦使用。
net.ipv4.tcp_synack_retries = 2 : 對(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ù)目。如果你的網(wǎng)站SYN_RECV狀態(tài)確實(shí)挺多,為了避免syn攻擊,那么可以調(diào)節(jié)重發(fā)的次數(shù)。
net.ipv4.tcp_syn_retries = 2 : 對(duì)于一個(gè)新建連接,內(nèi)核要發(fā)送多少個(gè) SYN 連接請(qǐng)求才決定放棄。不應(yīng)該大于255,默認(rèn)值是5,對(duì)應(yīng)于180秒左右。這個(gè)對(duì)防止syn攻擊其實(shí)是沒(méi)有用處的,也沒(méi)必要調(diào)節(jié)。
net.ipv4.tcp_max_orphans = 3276800 : 這個(gè)好不要修改,因?yàn)槊吭黾?,將消耗~64k內(nèi)存。即使報(bào)錯(cuò) TCP: too many of orphaned sockets 也有可能是由于你的net.ipv4.tcp_mem過(guò)小,導(dǎo)致的Out of socket memory,繼而引發(fā)的。
net.ipv4.tcp_wmem = 4096 16384 4194304 : 為自動(dòng)調(diào)優(yōu)定義每個(gè)socket使用的內(nèi)存。第一個(gè)值是為socket的發(fā)送緩沖區(qū)分配的最少字節(jié)數(shù)。第二個(gè)值是默認(rèn)值(該值會(huì)被 wmem_default覆蓋),緩沖區(qū)在系統(tǒng)負(fù)載不重的情況下可以增長(zhǎng)到這個(gè)值。第三個(gè)值是發(fā)送緩沖區(qū)空間的較大字節(jié)數(shù)(該值會(huì)被wmem_max覆蓋)。
net.ipv4.tcp_rmem = 4096 87380 4194304 : 接收緩沖區(qū),原理同上。
net.ipv4.tcp_mem = 94500000 915000000 927000000 :
low:當(dāng)TCP使用了低于該值的內(nèi)存頁(yè)面數(shù)時(shí),TCP不會(huì)考慮釋放內(nèi)存。
pressure:當(dāng)TCP使用了超過(guò)該值的內(nèi)存頁(yè)面數(shù)量時(shí),TCP試圖穩(wěn)定其內(nèi)存使用,進(jìn)入pressure模式,當(dāng)內(nèi)存消耗低于low值時(shí)則退出pressure狀態(tài)。
high:允許所有tcp sockets用于排隊(duì)緩沖數(shù)據(jù)報(bào)的內(nèi)存頁(yè)數(shù)。
一般情況下這個(gè)值是在系統(tǒng)啟動(dòng)時(shí)根據(jù)系統(tǒng)內(nèi)存數(shù)量計(jì)算得到的,如果你的dmesg報(bào) Out of socket memory,你可以試著修改這個(gè)參數(shù),順便介紹3個(gè)修改方法:
1, echo “94500000 915000000 927000000″ > /proc/sys/net/ipv4/tcp_wmem2, sysctl -w "
net.ipv4.tcp_mem = 94500000 915000000 927000000"
3, net.ipv4.tcp_mem = 94500000 915000000 927000000 (vi /etc/sysctl.conf
然后 sysctl -p生效)
下面命令也許能提供些信息,在你修改tcp參數(shù)時(shí)做個(gè)參考:
[sports@xk-6-244-a8 nbahttpd_beta4.0]$ cat /proc/net/sockstat
sockets: used 1195
TCP: inuse 1177 orphan 30 tw 199 alloc 1181 mem 216
UDP: inuse 0 mem 0
RAW: inuse 0
FRAG: inuse 0 memory 0
其他我就不多說(shuō)了,知道這些基本就能解決絕大部分問(wèn)題了。
上述就是小編為大家分享的如何進(jìn)行Linux內(nèi)核參數(shù)優(yōu)化了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
當(dāng)前名稱(chēng):如何進(jìn)行Linux內(nèi)核參數(shù)優(yōu)化-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://biofuelwatch.net/article/csjjhi.html