一、影響 Linux 性能的各種因素
1、系統硬件資源
(1)CPU
如何判斷多核 CPU 與超線程
消耗 CPU 的業務:動態 web 服務、mail 服務
(2)內存
- 物理內存與 swap 的取舍
- 選擇 64 位 Linux 操作系統
消耗內存的業務:內存數據庫(redis/hbase/mongodb)
(3)磁盤 IO
- RAID 技術(RAID0/1/5/01/10)
- SSD 磁盤
消耗磁盤的業務:數據庫服務器
(4)網絡帶寬
- 網卡/交換機的選擇
- 操作系統雙網卡綁定
消耗帶寬的業務:hadoop 平台、視頻業務平台
2、操作系統相關資源
(1)系統安裝優化
磁盤分區、RAID 設置、swap 設置
(2)內核參數優化
ulimit -n(最大打開文件數)
ulimit -u(最大用戶數)
(3)文件系統優化
- ext2:Linux 下標准文件系統,無日志記錄(inode)功能。
- ext3:在ext2 基礎上增加了日志記錄功能(inode),僅支持 32000 個子目錄。
- ex4:ext3 的后續版本,Linux2.6.28 內核開始支持。無限子目錄支持,快速 fsck。
- xfs:高性能文件系統,Linux3.10 內核開始默認支持。
建議:
讀操作頻繁,同時小文件眾多的應用:首選 ext4 文件系統,接下來依次是 xfs、ext3
寫操作頻繁的應用,首選是 xfs,接下來依次是 ext4 和 ext3
對性能要求丌高、數據安全要求丌高的業務,ext3 是比較好的選擇。
3、程序問題
此類問題需要開發人員查看代碼,介入處理。但作為運維人員需要給出程序問題的有力證據。
二、Linux 性能優化工具
1、CPU 性能評估工具
(1)vmstat(系統默認自帶)
利用 vmstat 命令可以對操作系統的內存信息、進程狀態、CPU活勱等進行監視。
常用方式:vmstat 2 3
表示每 3 秒更新一次輸出信息,統計 5 次后停止輸出。
下面是 vmstat 命令在某個系統的輸出結果:

對上面每項的輸出解釋如下:
- procs
- r 列表示運行和等待 cpu 時間片的進程數, 這個值如果長期大於系統CPU 的個數,說明 CPU 不足,需要增加 CPU。
- b 列表示在等待資源的進程數,比如正在等待 I/O、或者內存交換等。
- memory
- swpd 列表示切換到內存交換區的內存數量(以 k為單位) 。如果 swpd 的值不為0,或者比較大,只要 si、so 的值長期為 0,這種情況下一般不用擔心,不會影響系統性能。
- free列表示當前空閑的物理內存數量(以 k為單位)
- buff 列表示 buffers cache的內存數量,一般對塊設備的讀寫才需要緩沖。
- cache列表示 page cached 的內存數量,一般作為文件系統 cached,頻繁訪問的文件都會被 cached,如果 cache 值較大,說明 cached 的文件數較多,如果此時 IO 中 bi比較小,說明文件系統效率比較好。
- swap
- si列表示由磁盤調入內存,也就是內存進入內存交換區的數量。
- so 列表示由內存調入磁盤,也就是內存交換區進入內存的數量。
一般情況下, si、 so 的值都為 0, 如果 si、 so 的值長期不為 0, 則表示系統內存不足。需要增加系統內存。
- IO 項顯示磁盤讀寫狀況
- Bi列表示從塊設備讀入數據的總量(即讀磁盤) (每秒 kb) 。
- Bo 列表示寫入到塊設備的數據總量(即寫磁盤) (每秒 kb)。
這里我們設置的 bi+bo 參考值為 1000,如果超過 1000,而且 wa值較大,則表示系統磁盤 IO 有問題,應該考慮提高磁盤的讀寫性能。
- system 顯示采集間隔內發生的中斷數
- in 列表示在某一時間間隔中觀測到的每秒設備中斷數。
- cs 列表示每秒產生的上下文切換次數。
上面這 2 個值越大,會看到由內核消耗的 CPU 時間會越多。
- CPU 項顯示了 CPU 的使用狀態,此列是我們關注的重點。
- us 列顯示了用戶進程消耗的 CPU 時間百分比。us 的值比較高時,說明用戶進程消耗的 cpu 時間多,但是如果長期大於 50%,就需要考慮優化程序或算法。
- sy列顯示了內核進程消耗的 CPU 時間百分比。Sy的值較高時,說明內核消耗的CPU 資源很多。
根據經驗, us+sy的參考值為 80%, 如果 us+sy大於 80%說明可能存在 CPU 資源不足。
- id 列顯示了 CPU 處在空閑狀態的時間百分比。
- wa 列顯示了 IO 等待所占用的 CPU 時間百分比。wa 值越高,說明 IO 等待越嚴重,根據經驗,wa 的參考值為 20%,如果 wa 超過 20%,說明 IO 等待嚴重,引起 IO 等待的原因可能是磁盤大量隨機讀寫造成的, 也可能是磁盤或者磁盤控制器的帶寬瓶頸造成的(主要是塊操作) 。
綜上所述, 在對 CPU 的評估中, 需要重點注意的是procs 項 r 列的值和 CPU 項中 us、sy和 id 列的值。
(2)iostat(需要安裝 sysstat 工具包)
iostat 是 I/O statistics(輸入/輸出統計)的縮寫,主要的功能是對系統的磁盤 I/O 操作進行監視。
常用方式:iostat -c 3 5
其中,-c 表示顯示CPU 的使用情況,-d:顯示磁盤的使用情況。
(3)uptime 命令
uptime 是監控系統性能最常用的一個命令,主要用來統計系統當前的運行狀況,輸出的信息依次為:系統現在的時間、 系統從上次開機到現在運行了多長時間、 系統目前有多少登陸用戶、系統在一分鍾內、五分鍾內、十五分鍾內的平均負載。
2、內存性能評估
(1)free 命令
free 命令是監控 linux 內存使用狀況最常用的指令
常見用法:free –m
看下面的一個輸出:

“free –m”表示以 M為單位查看內存使用情況,在這個輸出中,我們重點關注的應該是 free 列與 cached 列的輸出值,由輸出可知,此系統共 8G 內存,系統空閑內存還有925M,其中,Buffer Cache 占用了 243M,Page Cache 占用了 6299M,由此可知系統緩存了很多的文件和目錄,而對於應用程序來說,可以使用的內存還有 7468M,當然這個 7468M 包含了 Buffer Cache 和 Page Cache 的值。在 swap 項可以看出,交換分區還未使用。所以從應用的角度來說,此系統內存資源還非常充足。
一般有這樣一個經驗公式:應用程序可用內存/系統物理內存>70%時,表示系統內存資源非常充足,不影響系統性能,應用程序可用內存/系統物理內存<20%時,表示系統內存資源緊缺,需要增加系統內存,20%<應用程序可用內存/系統物理內存<70%時,表示系統內存資源基本能滿足應用需求,暫時不影響系統性能。
(2)sar/pidstat
此兩個命令主要用於監控全部或指定進程占用系統資源的情況,如 CPU,內存、設備IO。
三個公用參數:-u(獲取 CPU 狀態) 、-r(獲取內存狀態) 、-d(獲取磁盤)
常用組合:
sar -u 3 獲取 cpu 3 秒內的狀態
pidstat -r –p 1 3 獲取內存 3 秒內的狀態
看看以上兩個命令的差別?
請看下面的一個輸出:

其中:
Kbmemfree 表示空閑物理內存大小,kbmemused 表示已使用的物理內存空間大小,%memused 表示已使用內存占總內存大小的百分比,kbbuffers 和 kbcached 分別表示Buffer Cache 和 Page Cache 的大小,kbcommit 和%commit 分別表示應用程序當前使用的內存大小和使用百分比。
可以看出 sar 的輸出其實與 free的輸出完全對應,不過 sar 更加人性化,不但給出了內存使用量,還給出了內存使用的百分比以及統計的平均值。從%commit 項可知,此系統目前內存資源充足。
3、磁盤性能評估
(1)iostat –d 組合
iostat –d 2 3
通過“iostat –d”命令組合也可以查看系統磁盤的使用狀況,請看如下輸出:

對上面每項的輸出解釋如下:
- Blk_read/s 表示每秒讀取的數據塊數。
- Blk_wrtn/s 表示每秒寫入的數據塊數。
- Blk_read 表示讀取的所有塊數。
- Blk_wrtn 表示寫入的所有塊數。
(2)pidstat -d -p 31887 3
(3)sar -d 2 3
通過“sar –d”組合,可以對系統的磁盤 IO 做一個基本的統計,請看下面的一個輸出:

對上面每項的輸出解釋如下:
- DEV 表示磁盤設備名稱。
- tps 表示每秒到物理磁盤的傳送數,也就是每秒的 I/O 流量。一個傳送就是一個 I/O 請求,多個邏輯請求可以被合並為一個物理 I/O 請求。
- rd_sec/s 表示每秒從設備讀取的扇區數(1 扇區=512 字節)。
- wr_sec/s 表示每秒寫入設備的扇區數目。
- avgrq-sz 表示平均每次設備 I/O 操作的數據大小(以扇區為單位) 。
- avgqu-sz 表示平均 I/O 隊列長度。
- await 表示平均每次設備 I/O 操作的等待時間(以毫秒為單位) 。
- svctm表示平均每次設備 I/O 操作的服務時間(以毫秒為單位) 。
- %util表示一秒中有百分之幾的時間用於 I/O 操作。
Linux 中 I/O 請求系統與現實生活中超市購物排隊系統有很多類似的地方,通過對超市購物排隊系統的理解,可以很快掌握 linux 中 I/O 運行機制。比如:
- avgrq-sz 類似於超市排隊中每人所買東西的多少。
- avgqu-sz 類似於超市排隊中單位時間內平均排隊的人數。
- await 類似於超市排隊中每人的等待時間。
- svctm類似於超市排隊中收銀員的收款速度。
- %util類似於超市收銀台前有人排隊的時間比例。
對於磁盤 IO 性能,一般有如下評判標准:
正常情況下 svctm 應該是小於 await 值的,而 svctm 的大小和磁盤性能有關,CPU、內存的負荷也會對 svctm值造成影響,過多的請求也會間接的導致 svctm值的增加。
await 值的大小一般取決於 svctm 的值和 I/O 隊列長度以及 I/O 請求模式,如果 svctm的值與 await 很接近,表示幾乎沒有 I/O 等待,磁盤性能很好,如果 await 的值遠高於 svctm的值,則表示 I/O 隊列等待太長,系統上運行的應用程序將變慢,此時可以通過更換更快的硬盤來解決問題。
%util 項的值也是衡量磁盤 I/O 的一個重要指標,如果%util 接近 100%,表示磁盤產生的 I/O 請求太多,I/O 系統已經滿負荷的在工作,該磁盤可能存在瓶頸。長期下去,勢必影響系統的性能,可以通過優化程序或者通過更換更高、更快的磁盤來解決此問題。
4、網絡性能評估
(1)ping 命令
請看下面的一個輸出:

在這個輸出中,time值顯示了兩台主機之間的網絡延時情況,如果此值很大,則表示網絡的延時很大,單位為毫秒。在這個輸出的最后,是對上面輸出信息的一個總結,packet loss 表示網絡的丟包率,此值越小,表示網絡的質量越高。
(2)netstat 命令
netstat –i (查看路由情況)
netstat –r(查看網絡接口狀態)
(3)mtr/traceroute 命令
跟蹤網絡路由狀態,推薦使用 mtr,動態跟蹤網絡路由,用於排除網絡問題非常方便。
三、系統性能分析標准

