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,這樣是比較合理的。