linux 系統性能

上次簡單介紹了下,linuxcpu,memory,disk i/o; net i/o 性能監控的一些工具;這節就介紹下,這些層面上出現瓶頸時,怎樣調節內核,有那些內核參數可以調節來獲得性能的提升; 下節介紹下:怎麼識別性能瓶頸,當然只是空想了,怎樣識別需要具體問題具體對待了;
   
希望對這些參數的介紹使大家對於linux的內核有一定的認識;

第一節:cpu 性能瓶頸

計算機中,cpu是最重要的一個子系統,負責所有計算任務;基於摩爾定律的發展,cpu是發展最快的一個硬件,所以瓶頸很少出現在cpu上;我們線上環境的cpu都是多核的,並且基於SMP(symmetric multiprocessing)結構的。通過觀察線上機器cpu使用率會發現,使用率很低很低,不到5% 說明我們的資源浪費情況多麼嚴重啊;(但爲什麼不能一臺機器多部署幾個應用呢,後邊我會解釋); 我們線上的cpu一個核支持超級線程,也就是一個核上可以並行運行幾個線程)

1. 通過調整進程優先級調整: nice 命令來調整進程優先級別;可調範圍(-20 19 如: renice 5 pid

2.通過調整cpu的親和度來集中處理某一箇中斷類型:將系統發出的中斷都綁定在一個cpu上,這樣其他cpu繼續執行自己正在執行的線程,不被中斷打擾,從而較少了線程上下文切換時間,增強性能;

注: cpu親和度的概念: 在多核cpu中,linux操作系統搶佔式調度系統,按照cpu時間片/中斷/ 不斷調度進程給cpu去執行的;如果在一個時間片調度線程1cpu1上運行,另外一個時間片調度線程1cpu2上去運行,這樣會造成線程執行速度慢,性能降低。爲什麼呢? 我們知道SMP上多核都是共享L1 ,L2 CPU Cache的。並且各個核的內存空間都是不可共享的,一個線程如果多次時間片上在不同的cpu上運行,會造成cache的不斷失效和寫入;性能會降低; linux的進程調度有個親和度算法可以將盡量將進程每次都調度到同一個cpu上處理;linux調度時當然也有Loadbalance算法保證進程調度的均勻負載的;

例如: echo 03 > /proc/irq/19/smp-affinity (將中斷類型爲19的中斷綁定到第三個cpu上處理)

第二節:內存性能瓶頸

首先,linux的內存管理是聰明和智能的;linux通過(virtual memory manage)來管理內存的; 對於大多數應用,linux是不直接寫到硬盤上去的,而是先寫到 virtual memory manage 管理的文件系統緩存(也在內存中的) .方便應用的後續的讀請求;因爲和磁盤的I/O操作是昂貴的;linux會根據一些算法策略適當的時候同步到硬盤的;這就是爲什麼我們運行linux一段時間後,發現可用內存那麼少的原因,多數被cache+buffer佔用咧;

所以我們提高性能的辦法就是減少寫到磁盤的次數,提高每次寫磁盤時的效率質量;

1. 通過調節緩存的髒數據同步到硬盤的策略:(髒數據表示沒有被當前的線程使用的數據)

例如: echo 10 > /proc/sys/vm/dirty_background_rato (當髒數據佔據物理內存10%時,觸發pdflush同步到硬盤):小心調節,會大幅度的影響性能;

          echo 2000 > /proc/sys/vm/dirty_expire_centisecs (當髒數據在物理內存的逗留時間超過2000ms時被同步到硬盤);

2.通過調節swap參數,來優化linux虛擬內存管理:基於程序的局部性原理,linux通過虛擬內存機制來實現併發運行進程,linux發現物理內存不夠用時,會根據LRU算法將一部分內存swap out到硬盤;當運行被換出的那個線程時,在swap in 到內存裏;

例如: echo 10 > /proc/sys/vm/swappiness(值爲0表示儘量都用物理內存,值爲100表示積極的使用swap分區;)這個參數很重要;小心調節; 一般爲60;

第三節: 磁盤I/O可調性能參數

 linux的子系統VFS(virtural file system)虛擬文件系統;從高層將各種文件系統,以及底層磁盤特性隱藏,對程序員提供:read,write,delete等文件操作;這就是之所以我們可以在linuxmount多種不同格式的文件系統的,而window確不行; 當然基於:虛擬文件系統,文件系統,文件系統驅動程序,硬件特性方面,都能找到性能瓶頸;

1.選擇適合應用的文件系統;

2. 調整進程I/O請求的優先級,分三種級別:1代表 real time ; 2代表best-effort; 3代表idle ;

   如:ionice -c1 -p1113(給進程1113I/O優先級設置爲最高優先級)

3.根據應用類型,適當調整page size block size;

4.升級驅動程序;

第四節 :網絡可調性能參數

對於我們web應用來說,網絡性能調整如此重要,linux的網絡支持是無與倫比的;是作爲網絡服務器的首先;對於web服務來說:除了應用的響應速度外,linux網絡管理子系統,網卡,帶寬都可能成爲性能瓶頸;

1.查看網卡設置是否全雙工傳輸的: echtool  eth0

2. 設置MTU(最大傳輸單元),在帶寬G以上的時候,要考慮將MTU增大,提高傳輸性能;如: ifconfig eth0 mtu 9000 up

3. 增加網絡數據緩存;傳輸數據時linux是將包先放入緩存,填滿緩存後即發送出去;讀操作類似;

sysctl -w net.ipv4.tcp_rmem="4096 87380 8388608" :設置tcp讀緩存:最小緩存,初始化時,最大緩存

sysctl -w net.ipv4.tcp_wmem="4096 87380 8388608" :設置tcp寫緩存:最小緩存,初始化時,最大緩存

4.禁用window_scaling,並且直接設置window_size;(就像我們經常設置jvm的參數:xms = xmx一樣

sysctl -w net.ipv4.tcp_window_scaling=0

5.設置TCP連接可重用性: 對於TIME_OUT狀態的TCP連接可用於下一個TCP重用,這樣減少了三次握手和創建時間,非常提高性能,尤其對於web server

 如: 開啓可重用tcp功能: sysctl -w net.ipv4.tcp_tw_reuse=1  sysctl -w net.ipv4.tcp_tw_recyle=1 

6.禁用掉沒必要的tcp/ip協議功能:比如icmp;broadcast包的接收;

7. linux對於keeplivetcp連接有一個默認的過期時間;可以減小這個時間,讓沒用的連接釋放掉,畢竟tcp連接數是有限的嘛;

 如: sysctl -w net.ipv4.tcp_keepalive_time=1800 (設置過期時間,1800s)

8.設置最大tcp正在連接狀態(還沒ESTABLISHED)隊列長度;避免由於太多的tcp連接過來,導致服務器掛掉;比如DoS***

如:sysctl -w net.ipv4.tcp_max_syn_backlog=4096

9. 綁定tcp類型的中斷到一個cpu上;(讓cpu去親和這個類型中斷,避免頻繁的中斷,影響線程調度性能)


 

總結: 我 們在性能優化一個應用時,首要的是設定優化要達到的目標,然後尋找瓶頸,調整參數,達到優化目的;但是尋找瓶頸時可能是最累的,要從大範圍,通過很多用 例,很多測試報告,不斷的縮小範圍,最終確定瓶頸點;以上這些參數只是個認識,系統性能優化中可能用到,但並不是放之四海而皆準的; 有的參數要邊測試,邊調整的;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章