linux的vm相關引數介紹

edwardking888發表於2010-09-30

linux的vm相關引數介紹


1. 保證linux有足夠的實體記憶體,可以調整vm的如下引數

vm.min_free_kbytes=409600;//預設值是3797,保證實體記憶體有足夠空閒空間,防止突發性換頁


vm.vfs_cache_pressure=200;//預設是100,增大這個引數設定了虛擬記憶體回收directory和i-node緩衝的傾向,這個值越大。越易回收


vm.swappiness=40 //預設60,減少這個引數會使系統儘快通過swapout不使用的程式資源來釋放更多的實體記憶體

一般在rac的配置環境中配置這三個引數,可以防止換頁引起節點短暫無響應,導致節點重啟


2. 改善io系統的效能


overcommit_memory = 0
vm.overcommit_ratio = 10 //預設值是50,用於虛擬記憶體的實體記憶體的百分比


vm.dirty_ratio = 20 //預設值是40,為了保持穩定,持續的寫入,把這個值調整的小一些,經驗值是20


vm.dirty_background_ratio //預設數值是500,也就是5秒,如果系統要求穩定持續的寫,可以適當降低該值,把峰值的寫操作平均多次,也避免當機丟失更多的資料


vm.dirty_expire_centisecs //預設是3000,也就是30秒,如果系統寫操作壓力很大,可以適當減小該值,但也不要太小;建議設定為 1500

vm的相關引數在/proc/sys目錄下

相關命令

sysctl -p  //修改vm引數後,執行這個命令可以立即生效
sysctl -a  //檢視所有的vm引數


與磁碟IO子系統有關的

/proc/sys/vm/dirty_ratio
這個引數控制檔案系統的檔案系統寫緩衝區的大小,單位是百分比,表示系統記憶體的百分比,
表示當寫緩衝使用到系統記憶體多少的時候,開始向磁碟寫出資料。增大之會使用更多系統內
存用於磁碟寫緩衝,也可以極大提高系統的寫效能。但是,當你需要持續、恆定的寫入場合
時,應該降低其數值,一般啟動上預設是 10。下面是增大的方法:

  echo '40' > /proc/sys/vm/dirty_ratio

/proc/sys/vm/dirty_background_ratio
這個引數控制檔案系統的pdflush程式,在何時重新整理磁碟。單位是百分比,表示系統記憶體的百
分比,意思是當寫緩衝使用到系統記憶體多少的時候,pdflush開始向磁碟寫出資料。增大之會
使用更多系統記憶體用於磁碟寫緩衝,也可以極大提高系統的寫效能。但是,當你需要持續、恆
定的寫入場合時,應該降低其數值,一般啟動上預設是 5。下面是增大的方法:

  echo '20' > /proc/sys/vm/dirty_background_ratio

/proc/sys/vm/dirty_writeback_centisecs
這個引數控制核心的髒資料重新整理程式pdflush的執行間隔。單位是 1/100 秒。預設數值是500,
也就是 5 秒。如果你的系統是持續地寫入動作,那麼實際上還是降低這個數值比較好,這樣可
以把尖峰的寫操作削平成多次寫操作。設定方法如下:

  echo "200" > /proc/sys/vm/dirty_writeback_centisecs

如果你的系統是短期地尖峰式的寫操作,並且寫入資料不大(幾十M/次)且記憶體有比較多富裕,那麼應該增大此數值:

 echo "1000" > /proc/sys/vm/dirty_writeback_centisecs


/proc/sys/vm/dirty_expire_centisecs
這個引數宣告Linux核心寫緩衝區裡面的資料多“舊”了之後,pdflush程式就開始考慮寫到磁碟中去。
單位是 1/100秒。預設是 3000,也就是 30 秒的資料就算舊了,將會重新整理磁碟。對於特別過載的寫
操作來說,這個值適當縮小也是好的,但也不能縮小太多,因為縮小太多也會導致IO提高太快。建
議設定為 1500,也就是15秒算舊。

 echo "1500" > /proc/sys/vm/dirty_expire_centisecs


當然,如果你的系統記憶體比較大,並且寫入模式是間歇式的,並且每次寫入的資料不大(比如幾十M),
那麼這個值還是大些的好。

與網路IO子系統有關的


/proc/sys/net/ipv4/tcp_retrans_collapse
這個引數控制TCP雙方Window協商出現錯誤的時候的一些重傳的行為。但是在老的2.6的核
(<2.6.18)裡頭,這個重傳會導致kernel oops,kernel panic,所以,如果出現有
tcp_retrans_*樣子的kernel panic,可以把這個引數給設定成0:

  echo '0' > /proc/sys/net/ipv4/tcp_retrans_collapse

提高Linux應對短連線的負載能力
在存在大量短連線的情況下,Linux的TCP棧一般都會生成大量的 TIME_WAIT 狀態的socket。
你可以用下面的命令看到:

  netstat -ant| grep -i time_wait

有時候,這個數目是驚人的:

  netstat -ant|grep -i time_wait |wc -l


可能會超過三四萬。這個時候,我們需要修改 linux kernel 的 tcp time wait的時間,縮短之,
有個 sysctl 引數貌似可以使用,它是 /proc/sys/net/ipv4/tcp_fin_timeout,預設值是 60,
也就是60秒,很多網上的資料都說將這個數值設定低一些就可以減少netstat 裡面的TIME_WAIT狀態,
但是這個說法是錯誤的。經過認真閱讀Linux的核心原始碼,我們發現這個數值其實是輸出用的,
修改之後並沒有真正的讀回核心中進行使用,而核心中真正管用的是一個巨集定義,在
$KERNEL/include/net/tcp.h裡面,有下面的行:

  #define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAIT
                                    * state, about 60 seconds     */

而這個巨集是真正控制 TCP TIME_WAIT 狀態的超時時間的。如果我們希望減少 TIME_WAIT 狀態的數目
(從而節省一點點核心操作時間),那麼可以把這個數值設定低一些,根據我們的測試,設定為 10
秒比較合適,也就是把上面的修改為:

  #define TCP_TIMEWAIT_LEN (10*HZ) /* how long to wait to destroy TIME-WAIT
                                    * state, about 60 seconds     */

然後重新編譯核心,重啟系統即可發現短連線造成的TIME_WAIT狀態大大減少:

 netstat -ant | grep -i time_wait |wc -l

一般情況都可以至少減少2/3。也能相應提高系統應對短連線的速度。


/proc/irq/{number}/smp_affinity
在多 CPU 的環境中,還有一箇中斷平衡的問題,比如,網路卡中斷會教給哪個 CPU 處理,
這個引數控制哪些 CPU 可以繫結 IRQ 中斷。其中的 {number} 是對應裝置的中斷編號,
可以用下面的命令找出:

 cat /proc/interrupt


比如,一般 eth0 的 IRQ 編號是 16,所以控制 eth0 中斷繫結的 /proc 檔名是
/proc/irq/16/smp_affinity。上面這個命令還可以看到某些中斷對應的CPU處理的次數,
預設的時候肯定是不平衡的。

設定其值的方法很簡單,smp_affinity 自身是一個位掩碼(bitmask),特定的位對應特
定的 CPU,這樣,01 就意味著只有第一個 CPU 可以處理對應的中斷,而 0f(0x1111)
意味著四個 CPU 都會參與中斷處理。

幾乎所有外設都有這個引數設定,可以關注一下。

這個數值的推薦設定,其實在很大程度上,讓專門的CPU處理專門的中斷是效率最高的,比如,
給磁碟IO一個CPU,給網路卡一個CPU,這樣是比較合理的。

 

 

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

相關文章