linux 效能調優引數

muxinqing發表於2015-08-07
linux 效能調優引數

1.drop_caches
drop_caches

向/proc/sys/vm/drop_caches檔案中寫入數值可以使核心釋放page cache,dentries和inodes快取所佔的記憶體。

  只釋放pagecache:

      echo 1 > /proc/sys/vm/drop_caches

  只釋放dentries和inodes快取:

      echo 2 > /proc/sys/vm/drop_caches

  釋放pagecache、dentries和inodes快取:

      echo 3 > /proc/sys/vm/drop_caches

  這個操作不是破壞性操作,髒的物件(比如髒頁)不會被釋放,因此要首先執行sync命令。

注:這個只能是手動釋放

2. writeback
有了page cache就有了writeback寫方式。一個寫IO會先寫入page cache,然後等待後臺pdflush把page cache中髒資料刷入磁碟。如果在刷入磁碟之前系統斷電,則page cache的資料丟失。所以對一些可靠性要求高的場景都會把這個寫快取禁掉。writeback寫方式是linux作業系統提供的一種非常通用寫模式。writeback提供了較好的吞吐量,有了快取也縮短了IO響應時間。但它也有缺點:(1)斷電可能丟資料(資料安全性)(2)對於像資料庫這樣自快取的系統來說,多了一層IO快取開銷。因為資料庫已經在應用層做了一層快取。所以對於這樣的應用可以用direct io方式,減少使用者空間和page cache之間資料複製開銷。(3)如果page cache過大,那麼就會快取太多的資料,當需要統一刷入磁碟的時候就會出現一個IO峰值和瓶頸,在這其間對使用者的IO訪問出現明顯影響。如果想削平這個峰值可以把page cache容量設定小一點,讓pdflush一段時間內較為平均的重新整理dirty資料。

3. pdflush
pdflush是linux系統後臺執行的一個執行緒,這個程式負責把page cahce中的dirty狀態的資料定期的輸入磁碟。一個系統中會執行很多這個pdflush。cat /proc/sys/vm/nr_pdflush_threads檢視當前系統執行pdflush數量。當一段時間(一般是1s)沒有任何的pdflush處於工作狀態,系統會remove一個pdflush執行緒。pdflush最大和最小的數量是有配置的,但這些配置一般很少修改。

4. 幾個重要的IO寫相關引數
 1 dirty_writeback_centisecs
cat /proc/sys/vm/dirty_writeback_centisecs檢視這個值,預設一般是500(單位是1/100秒)。這個參數列示5s的時間pdflush就會被喚起去重新整理髒資料。沒有官方文件說明減少這個值就會有更多的pdflush參與刷資料。比如2.6或者更早的核心,linux中mm/page-writeback.c的原始碼中有這樣一段描述“如果pdflush重新整理髒資料的時間超過了這個配置時間,則完成重新整理後pdflush會sleep 1s“。這種擁塞的保護機制描述只是寫在原始碼裡,並沒有寫入官方文件或者形成規範,所以也就意味著這種機制在不同的版本可能有不同的表現。
所以修改dirty_writeback_centisecs並不一定能給你帶來多少效能的提升,相反有可能出現你意想不到的問題。一般建議使用者使用預設值。

 2 dirty_expire_centisecs
cat /proc/sys/vm/dirty_expire_centicecs檢視這個值,預設是3000(單位是1/100秒)。這個值表示page cache中的資料多久之後被標記為髒資料。只有標記為髒的資料在下一個週期到來時pdflush才會刷入到磁碟,這樣就意味著使用者寫的資料在30秒之後才有可能被刷入磁碟,在這期間斷電都是會丟資料的。如果想pdfflush重新整理頻率大寫可以減小這個值,比如:echo 1000 >> /proc/sys/vm/dirty_expire_centicecs 設定為10s一個重新整理週期。

 3 dirty_backgroud_ratio
cat /proc/sys/vm/dirty_backgroud_ratio檢視這個值,預設是10(單位是百分比,不同的核心版本可能有不同的預設值)。很多的描述文件中描述這個值表示最多快取髒資料的空間佔總記憶體的百分比。其實不然,檢視原始碼的描述,它的真實意義是佔(MemFree + Cached - Mapped)的百分比。達到這個上限後會喚醒pdflush把這些髒資料重新整理到磁碟,在把髒資料輸入磁碟之前所有寫IO會被阻塞。所以如果這個值設的過大,則會週期的出現一個寫IO峰值,而且這個峰值持續比較長時間,在這段時間內使用者的寫IO會被阻塞。對於一些業務場景需要把這個值設定的小寫,把峰值寫IO平分為多次小的寫IO。例如:echo 5 >> cat /proc/sys/vm/dirty_backgroud_ratio 把百分比降低到5%。

 4  dirty_ratio
cat /proc/sys/vm/dirty_ratio檢視這個值,預設是20(單位是百分比,不同的核心版本可能有不同的預設值)。表示當髒資料佔用總記憶體的百分比超過20%的時候,核心會把所有的寫操作阻塞掉,等待pdflush把這些髒資料刷入到磁碟後才能恢復正常的IO寫。要注意的是當這個事件發生時,會阻塞掉所有寫操作。這樣會產生一個很大的問題,一個長時間大IO會搶佔更多的IO寫資源,可能把其它的小IO餓死。因為大IO產生的髒資料較多,很快達到這個閥值,此時就會系統會阻塞掉所有的寫IO,從而小寫IO無法進行寫操作。

5.Swappiness


    swap空間是一塊磁碟空間,作業系統使用這塊空間儲存從記憶體中換出的作業系統不常用page資料,這樣可以分配出更多的記憶體做page cache。這樣通常會提升系統的吞吐量和IO效能,但同樣會產生很多問題。頁面頻繁換入換出會產生IO讀寫、作業系統中斷,這些都很影響系統的效能。這個值越大作業系統就會更加積極的使用swap空間。
調節swappniess方法如下:
cat /proc/sys/vm/swappniess檢視這個引數的配置(預設值是60)
echo 0 >> /proc/sys/vm/swappniess 禁止作業系統使用任何的swap空間
echo 100 >> /proc/sys/vm/swappniess 作業系統會盡量使用swap空間
swappniess設定一個適當值對於系統效能也會有明顯的影響。
swappniess很小時,系統能併發的程式或者執行緒就會減少,但每個程式或者執行緒執行的速度較快,cpu利用率較好。
swappniess很大時,系統併發好,但每個程式或者執行緒速度較慢。較多IO讀寫和系統中斷會消耗很多cpu資源,此時系統效率較低。
所以如果希望提高伺服器的併發量,對服務的相應時間要求不很高的場景可以適當的把swappniess調節的高些。對於併發量不大但希望相應時間小的應用場景可以適當的調小這個引數,比如個人電腦可以直接禁掉swap。

網路調優

所有的TCP/IP調優引數都位於/proc/sys/net/目錄。例如, 下面是最重要的一些調優引數,後面是它們的含義:

1、/proc/sys/net/core/rmem_max — 最大的TCP資料接收緩衝
2、/proc/sys/net/core/wmem_max — 最大的TCP資料傳送緩衝
3、/proc/sys/net/ipv4/tcp_timestamps — 時間戳在(請參考RFC 1323)TCP的包頭增加12個位元組
4、/proc/sys/net/ipv4/tcp_sack — 有選擇的應答
5、/proc/sys/net/ipv4/tcp_window_scaling — 支援更大的TCP視窗. 如果TCP視窗最大超過65535(64K), 必須設定該數值為1
6、rmem_default — 預設的接收視窗大小
7、rmem_max — 接收視窗的最大大小
8、wmem_default — 預設的傳送視窗大小
9. wmem_max — 傳送視窗的最大大小

/proc目錄下的所有內容都是臨時性的, 所以重啟動系統後任何修改都會丟失.

建議在系統啟動時自動修改TCP/IP引數:

把下面程式碼增加到/etc/rc.local檔案, 然後儲存檔案, 系統重新引導的時候會自動修改下面的TCP/IP引數:

echo 256960 > /proc/sys/net/core/rmem_default
echo 256960 > /proc/sys/net/core/rmem_max
echo 256960 > /proc/sys/net/core/wmem_default
echo 256960 > /proc/sys/net/core/wmem_max
echo 0 > /proc/sys/net/ipv4/tcp_timestamps
echo 1 > /proc/sys/net/ipv4/tcp_sack
echo 1 > /proc/sys/net/ipv4/tcp_window_scaling

TCP/IP引數都是自解釋的, TCP視窗大小設定為256960, 禁止TCP的時間戳(取消在每個資料包的頭中增加12位元組), 支援更大的TCP視窗和TCP有選擇的應答。

上面數值的設定是根據互連網連線和最大頻寬/延遲率來決定.

注: 上面例項中的數值可以實際應用, 但它只包含了一部分引數.

另外一個方法: 使用 /etc/sysctl.conf 在系統啟動時將引數配置成您所設定的值:

net.core.rmem_default = 256960
net.core.rmem_max = 256960
net.core.wmem_default = 256960
net.core.wmem_max = 256960
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_sack =1
net.ipv4.tcp_window_scaling = 1

該檔案指定了每個套接字所允許的最大緩衝區的大小。

/proc/sys/net/core/rmem_default

該檔案指定了接收套接字緩衝區大小的預設值(以位元組為單位)。

/proc/sys/net/core/rmem_max

該檔案指定了接收套接字緩衝區大小的最大值(以位元組為單位)。

/proc/sys/net/core/wmem_default

該檔案指定了傳送套接字緩衝區大小的預設值(以位元組為單位)。

/proc/sys/net/core/wmem_max

該檔案指定了傳送套接字緩衝區大小的最大值(以位元組為單位)。

/proc/sys/net/ipv4

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29065182/viewspace-1764624/,如需轉載,請註明出處,否則將追究法律責任。

相關文章