1. 程式人生 > 其它 >Linux 系統性能優化思路和優化方法

Linux 系統性能優化思路和優化方法

一、影響 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,動態跟蹤網路路由,用於排除網路問題非常方便。

三、系統性能分析標準