上次簡單介紹了下,linux的cpu,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去執行的;如果在乙個時間片排程執行緒1在cpu1上執行,另外乙個時間片排程執行緒1在cpu2上去執行,這樣會造成執行緒執行速度慢,效能降低。為什麼呢? 我們知道smp上多核都是共享l1 ,l2 cpu cache的。並且各個核的記憶體空間都是不可共享的,乙個執行緒如果多次時間片上在不同的cpu上執行,會造成cache的不斷失效和寫入;效能會降低; 而linux的程序排程有個親和度演算法可以將盡量將程序每次都排程到同乙個cpu上處理;linux排程時當然也有loadbalance演算法保證程序排程的均勻負載的;
例如: echo 03 > /proc/irq/19/smp-affinity (將中斷型別為19的中斷繫結到第三個cpu上處理)
第二節:記憶體效能瓶頸
linux的子系統vfs(virtural file system)虛擬檔案系統;從高層將各種檔案系統,以及底層磁碟特性隱藏,對程式設計師提供:read,write,delete等檔案操作;這就是之所以我們可以在linux上mount多種不同格式的檔案系統的,而window確不行; 當然基於:虛擬檔案系統,檔案系統,檔案系統驅動程式,硬體特性方面,都能找到效能瓶頸;
1.選擇適合應用的檔案系統;
2. 調整程序i/o請求的優先順序,分三種級別:1代表 real time ; 2代表best-effort; 3代表idle ;
如:ionice -c1 -p1113(給程序1113的i/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對於keeplive的tcp連線有乙個預設的過期時間;可以減小這個時間,讓沒用的連線釋放掉,畢竟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去親和這個型別中斷,避免頻繁的中斷,影響執行緒排程效能)
總結: 我們在效能優化乙個應用時,首要的是設定優化要達到的目標,然後尋找瓶頸,調整引數,達到優化目的;但是尋找瓶頸時可能是最累的,要從大範圍,通過很多用例,很多測試報告,不斷的縮小範圍,最終確定瓶頸點;以上這些引數只是個認識,系統效能優化中可能用到,但並不是放之四海而皆準的; 有的引數要邊測試,邊調整的;
Linux記憶體管理 邏輯層面分析
記憶體管理,是指軟體執行時對計算機記憶體資源的分配和使用的技術。其最主要的目的是如何高效,快速的分配,並且在適當的時候釋放和 記憶體資源。說到linux記憶體管理,就不得不借用乙個程序記憶體分布圖來進行說明。上圖是程序的使用者空間記憶體分布說明。關於這個圖,我們重點注意兩點。第一,虛擬位址 第二,堆...
Linux程序崩潰原除錯
簡介 每個開發服務主程的同學可能都有程序崩潰的經歷,這時候就要了解點linux下程序除錯方法了。以下資訊都有助於除錯 除錯程序崩潰的方法有很多,可以根據具體需求使用。除錯一般的除錯流程,先從容易獲取的資訊入手,直到找到原因為止。程序日誌 core檔案 demsg 1892837.939243 out...
Linux可重入函式
1 可重入函式 可重入函式指的是可以被中斷的函式。也就是說,可以在這個函式執行的任何時刻中斷它,轉入os排程下去執行另外一段 而返回控制時不會出現什麼錯誤 而不可重入的函式由於使用了一些系統資源,比如全域性變數區,中斷向量表等,所以它如果被中斷的話,可能會出現問題,這類函式是不能執行在多工環境下的。...