關(guān)閉swap
如果服務(wù)器上有運(yùn)行數(shù)據(jù)庫服務(wù)或消息中間件服務(wù),請(qǐng)關(guān)閉交換分區(qū)
echo "vm.swappiness = 0" >> /etc/sysctl.conf
sysctl -p
OOM Killer
一般我們的linux服務(wù)都是混部服務(wù)的,每個(gè)程序申請(qǐng)的物理內(nèi)存都是共享的;例如物理內(nèi)存只有1g,啟動(dòng)2個(gè)程序各申請(qǐng)1g是可以的,linux通過這種過度分配的方式來達(dá)到內(nèi)存的充分利用,當(dāng)程序?qū)嶋H使用內(nèi)存超出物理內(nèi)存時(shí),會(huì)被系統(tǒng)按照優(yōu)先級(jí),殺掉一部分程序以確保其它程序的正常運(yùn)行;為了避免核心服務(wù)被殺,可以將進(jìn)程文件設(shè)置為最高優(yōu)先級(jí)。
# 數(shù)值越小越不容易被殺
echo -17 > /proc/$pid/oom_score_adj
TCP
因?yàn)槲覀兲峁┑臄?shù)據(jù)庫和一些消息中間件服務(wù)都是內(nèi)網(wǎng)工作的,所以可以針對(duì)內(nèi)網(wǎng)對(duì)TCP參數(shù)進(jìn)行一些優(yōu)化。
默認(rèn)值為6,參考值為2。主機(jī)作為客戶端,對(duì)外發(fā)起TCP連接時(shí),即三次握手的第一步,內(nèi)核發(fā)送SYN報(bào)文的重試次數(shù),超過這個(gè)次數(shù)后放棄連接。內(nèi)網(wǎng)環(huán)境通信良好,因此可以適度降低此值
- net.ipv4.tcp_synack_retries
默認(rèn)值為5,參考值為2。主機(jī)作為服務(wù)端,接受TCP連接時(shí),在三次握手的第二步,向客戶端發(fā)送SYN+ACK報(bào)文的重試次數(shù),超過這個(gè)次數(shù)后放棄連接。內(nèi)網(wǎng)環(huán)境中可適度降低此值
是否開啟時(shí)間戳,開啟后可以更精確地計(jì)算RTT,一些其他特性也依賴時(shí)間戳字段。
默認(rèn)值為0,建議值為1。是否允許將處于TIME_WAIT狀態(tài)的socket用于新的TCP連接。這對(duì)于降低TIME_WAIT數(shù)量很有效。該參數(shù)只有在開啟tcp_timestamps的情況下才會(huì)生效。
是否開啟TIME_WAIT套接字的快速回收,這是比tcp_tw_reuse更激進(jìn)的一種方式,它同樣依賴tcp_timestamps選項(xiàng)。強(qiáng)烈建議不要開啟tcp_tw_recycle,原因有兩點(diǎn),一是TIME_WAIT是十分必要的狀態(tài),避免關(guān)閉中的連接與新建連接之間的數(shù)據(jù)混淆,二是tcp_tw_recycle選項(xiàng)在NAT環(huán)境下會(huì)導(dǎo)致一些新建連接被拒絕,因?yàn)镹AT下每個(gè)主機(jī)存在時(shí)差,這體現(xiàn)在套接字中的時(shí)間戳字段,服務(wù)端會(huì)發(fā)現(xiàn)某個(gè)IP上的本應(yīng)遞增的時(shí)間戳出現(xiàn)降低的情況,時(shí)間戳相對(duì)降低的報(bào)文將被丟棄
默認(rèn)值為128,參考值為2048。定義了系統(tǒng)中每一個(gè)端口上最大的監(jiān)聽隊(duì)列的長(zhǎng)度。當(dāng)服務(wù)端監(jiān)聽了某個(gè)端口時(shí),操作系統(tǒng)內(nèi)部完成對(duì)客戶端連接請(qǐng)求的三次握手。這些已建立的連接存儲(chǔ)在一個(gè)隊(duì)列中,等待accept調(diào)用取走。本選項(xiàng)就是定義這個(gè)隊(duì)列的長(zhǎng)度。調(diào)大該值,可降低高并發(fā)場(chǎng)景下服務(wù)端的reject次數(shù)。
- net.ipv4.tcp_max_syn_backlog
客戶端的請(qǐng)求在服務(wù)端由兩個(gè)隊(duì)列進(jìn)行管理,一種是與客戶端完成連接建立后,等待accept的放到一個(gè)隊(duì)列,這個(gè)隊(duì)列的長(zhǎng)度由somaxconn參數(shù)控制;另一種是正在建立但未完成的連接單獨(dú)存放一個(gè)隊(duì)列,這個(gè)隊(duì)列的長(zhǎng)度由tcp_max_syn_backlog控制;默認(rèn)128,調(diào)到至8192.
- net.ipv4.tcp_max_tw_buckets
默認(rèn)值為4096,參考值為100000。定義系統(tǒng)同時(shí)保持TIME_WAIT套接字的最大數(shù)量,如果超過這個(gè)數(shù),則TIME_WAIT套接字將立刻被清除并打印警告信息。如果系統(tǒng)被TIME_WAIT過多問題困擾,則可以調(diào)節(jié)tcp_max_tw_buckets、tcp_tw_reuse、tcp_timestamps三個(gè)選項(xiàng)來緩解。TIME_WAIT狀態(tài)產(chǎn)生在TCP會(huì)話關(guān)閉時(shí)主動(dòng)關(guān)閉的一端,如果想從根本上解決問題,則讓客戶端主動(dòng)關(guān)閉連接,而非服務(wù)端。
page cache
page cache即系統(tǒng)臟頁,是系統(tǒng)的io緩存,當(dāng)數(shù)據(jù)寫入磁盤前會(huì)先寫入page cache中,然后異步刷入磁盤;寫緩存可以提升IO的訪問速度,但同時(shí)也會(huì)增加丟失數(shù)據(jù)的風(fēng)險(xiǎn)。
從page cache刷到磁盤有以下三種時(shí)機(jī):
- 可用物理內(nèi)存低于特定閾值時(shí),為了給系統(tǒng)騰出空閑內(nèi)存;
- 臟頁駐留時(shí)間超過特定閾值時(shí),為了避免臟頁無限期駐留內(nèi)存;
- 被用戶的sync()或fsync()觸發(fā)。
由系統(tǒng)執(zhí)行的刷盤有兩種寫入策略:
- 異步執(zhí)行刷盤,不阻塞用戶I/O;
- 同步執(zhí)行刷盤,用戶I/O被阻塞,直到臟頁低于某個(gè)閾值。
在一般情況下,系統(tǒng)先執(zhí)行第一種策略,當(dāng)臟頁數(shù)據(jù)量過大,異步執(zhí)行來不及完成刷盤時(shí),切換到同步方式。
我們可以通過內(nèi)核參數(shù)調(diào)整臟數(shù)據(jù)的刷盤閾值:
- vm.dirty_background_ratio,默認(rèn)值為10。該參數(shù)定義了一個(gè)百分比。當(dāng)內(nèi)存中的臟數(shù)據(jù)超過這個(gè)百分比后,系統(tǒng)使用異步方式刷盤。
- vm.dirty_ratio,默認(rèn)值為30。同樣定義了一個(gè)百分比,當(dāng)內(nèi)存中的臟數(shù)據(jù)超過這個(gè)百分比后,系統(tǒng)使用同步方式刷盤,寫請(qǐng)求被阻塞,直到臟數(shù)據(jù)低于dirty_ratio。如果還高于dirty_background_ratio,則切換到異步方式刷盤。因此 dirty_ratio 應(yīng)高于dirty_background_ratio。
除了通過百分比控制,還可以指定過期時(shí)間:vm.dirty_expire_centisecs,默認(rèn)值為3000(30秒),單位為百分之1秒,超過這個(gè)時(shí)間后,臟數(shù)據(jù)被異步刷盤。
可以通過下面的命令查看系統(tǒng)當(dāng)前的臟頁數(shù)量:
cat /proc/vmstat |egrep "dirty|writeback"
nr_dirty 951
nr_writeback 0
nr_writeback_temp 0
#輸出顯示有951個(gè)臟頁等待寫到磁盤。默認(rèn)情況下每頁大小為4KB。另外,也可以在/proc/meminfo文件中看到這些信息。
如果數(shù)據(jù)安全性要求沒有那么高,想要多“cache”一些數(shù)據(jù),讓讀取更容易命中cache,則可以增加臟數(shù)據(jù)占比和過期時(shí)間:
vm.dirty_background_ratio = 30
vm.dirty_ratio = 60
vm.dirty_expire_centisecs = 6000
同理,如果不希望因?yàn)樗⒈P導(dǎo)致io被阻,可適當(dāng)減少異步刷盤的數(shù)值,這樣可以讓io更加平滑:
vm.dirty_background_ratio = 5
vm.dirty_ratio = 60
以上就是Linux 系統(tǒng)優(yōu)化的一些建議(內(nèi)核優(yōu)化)的詳細(xì)內(nèi)容,更多關(guān)于Linux 系統(tǒng)優(yōu)化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!