在向大家詳細介紹Linux核心之前,首先讓大家瞭解下系統的pdflush進程,然後全面介紹Linux核心,希望對大家有用。與磁碟IO子系統有關Linux核心的編輯◆ /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秒。預設是30000,也就是 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 可以處理對應的中斷,而 0f0x1111)意味著四個 CPU 都會參與中斷處理。
Linux核心幾乎所有外設都有這個參數設定,可以關注一下。
這個數值的推薦設定,其實在很大程度上,讓專門的CPU處理專門的中斷是效率最高的,比如,給磁碟IO一個CPU,給網卡一個CPU,這樣是比較合理的。
- 闡述Linux核心裡面的APIC編程
- 分析linux核心的idle的知識
- 透明瞭解Linux核心結構
- 詳解linux核心配置
- linux核心對S3C2410睡眠模式的支援