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