使用 nmon 來排查與監控 Linux 系統的性能
nmon 允許您在一個簡潔的界面中來監控系統的各個方面,如 CPU 利用率、內存、磁盤繁忙度、網絡利用率等。這是它的一個主要的好處。假如沒有 nmon,您必須使用專門的監控工具,如 top(監控進程)、iostat(監控磁盤)和 ifstat(監控網絡)來監控各種資源。這其中的每一個呈現數據的方式都是截然不同的。
大約 10 年前,作為 AIX 系統管理員的我第一次使用 nmon。通過使用 nmon,我可以解決一些難以發現的問題,包括最初的那個看起來像似網絡瓶頸的問題。我通過使用 nmon 來同時檢查多個資源,之后發現這是由于打開太多文件導致的一個應用程序問題。
除了為您交互式監控系統外,您還可以在批處理模式下使用 nmon 來收集和存儲性能數據以供分析。有關用于 Linux 的 nmon 的更多信息,請參閱該項目的官方網站。
本文著眼于這個強大的監控工具,從安裝它開始。
安裝 nmon
nmon 在許多 Linux 發行版的默認存儲庫中都是可用的。例如,我們可以在 Fedora35 上使用 DNF 來安裝它:
$ sudo dnf -y install nmon
對于紅帽企業版 Linux 或 CentOS,nmon 在 EPEL(Extra Packages for Enterprise Linux) 的存儲庫中可用。
要安裝 nmon,首先需啟用 EPEL:
$ sudo dnf -y install \
https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
$ sudo dnf repolist
接下來使用 dnf 安裝 nmon:
$ sudo dnf -y install nmon
現在您已經安裝了 nmon,使用它來監控您的系統吧!
以交互的方式使用 nmon
安裝完應用程序后,您可以運行 nmon。之后您會看到一個包含系統信息和一個小幫助菜單的初始屏幕,它顯示了您可以按哪些鍵來切換不同的指標:
$ nmon
┌─16k──[H for help]──Hostname=f35ks01─Refresh= 2secs ─18:04:27────┐
│ │
│------------------------------ │
│ _ __ _ __ ___ ___ _ __ For help type H or ... │
│| '_ \| '_ ` _ \ / _ \| '_ \ nmon -? - hint │
│| | | | | | | | | (_) | | | | nmon -h - full details │
│|_| |_|_| |_| |_|\___/|_| |_| │
│ To stop nmon type q to Quit │
│------------------------------ │
│ │
│Fedora release 35 (Thirty Five) VERSION="35 (Thirty Five)" │
│Vendor=AuthenticAMD Model=AMD EPYC-Milan Processor │
│MHz=1911.004 bogomips=3822.00 lscpu:CPU=4 Little Endian │
│ProcessorChips=4 PhysicalCores=1 Sockets=4 Cores=1 Thrds=1│
│ VirtualCPUs =4 MHz=0 max=0 min=0 │
│ │
│Use these keys to toggle statistics on/off: │
│ c = CPU l = CPU Long-term - = Faster screen updates│
│ C = " WideView U = Utilisation + = Slower screen updates│
│ m = Memory V = Virtual memory j = File Systems │
│ d = Disks n = Network . = only busy disks/procs│
│ r = Resource N = NFS h = more options │
│ k = Kernel t = Top-processes q = Quit │
│─────────────────────────────────────────────────────────────────│
例如,按 C 鍵會切換為 CPU 利用率顯式:
┌─16k──[H for help]──Hostname=f35ks01─Refresh= 2secs ─18:05:58─┐
│ CPU Utilisation ─────────────────────────────────────────────│
│---------------------------+---------------------------------+│
│CPU User% Sys% Wait% Idle|0 |25 |50 |75 100| │
│ 1 3.6 17.2 0.0 79.2|Ussssssss> | │
│ 2 2.1 6.2 0.0 91.7|Usss > | │
│ 3 0.0 1.1 0.0 98.9| > | │
│ 4 6.1 17.2 0.0 0.5|UUUssssssss> | │
│---------------------------+---------------------------------+│
│Avg 3.0 10.3 0.0 86.7|Usssss> | │
│---------------------------+---------------------------------+│
│──────────────────────────────────────────────────────────────│
按 N 鍵會切換為網絡顯示,并自動將其堆疊在 CPU 顯示的下方:
┌─16k──[H for help]──Hostname=f35ks01─Refresh= 2secs ─18:17:01─┐
│ CPU Utilisation ─────────────────────────────────────────────│
│---------------------------+---------------------------------+│
│CPU User% Sys% Wait% Idle|0 |25 |50 |75 100| │
│ 1 2.6 10.3 0.0 87.1|Usssss > | │
│ 2 0.0 2.2 0.0 97.8|s > | │
│ 3 6.5 11.0 0.0 82.5|UUUsssss> | │
│ 4 0.0 0.5 0.0 99.5| > | │
│---------------------------+---------------------------------+│
│Avg 2.4 5.9 0.0 91.6|Uss > | │
│---------------------------+---------------------------------+│
│ Network I/O ─────────────────────────────────────────────────│
│I/F Name Recv=KB/s Trans=KB/s p_in p_out in_sz out_sz Peak->..│
│ lo 0.0 0.0 0.0 0.0 0.0 0.0...│
│ enp1s0 0.0 0.0 0.5 0.0 52.0 0.0...│
│ enp7s0 218.6 5923.4 3335.5 9989.68 67.1 607.2...│
│ Network Error Counters ──────────────────────────────────────│
│I/F Name iErrors iDrop iOverrun iFrame oErrors oDrop oOver..│
│ lo 0 0 0 0 0 0 ...│
│ enp1s0 0 34419 0 0 0 0 ...│
│ enp7s0 0 34419 0 0 0 0 ...│
│──────────────────────────────────────────────────────────────│
繼續按下其他按鍵可在同一個視圖中堆疊其他指標。例如,可使用 D 鍵來顯式磁盤 I/O,可使用 M 鍵來顯式內存信息,可使用 T 鍵來顯式Top 進程。
除了堆疊新顯示外,您還可以按點(.)鍵僅顯示繁忙的 CPU 和磁盤,也可以 + 和 - 鍵來增加或減少屏幕刷新時間。使用 H 鍵顯示幫助。
由于您可以隨時啟用和禁用不同的監視器和指標,所以 nmon 是一個可幫助您了解系統行為的高度靈活的工具。它還可以通過同時顯示不同的指標來幫助解決問題,通過提供系統的整體視圖以提高您理解問題的能力。
完成后,按 Q 鍵退出并結束監控會話。
收集性能數據
除了提供系統的整體交互式視圖外,您還可以在批處理模式下運行 nmon,這樣就可以從系統中收集長時間的性能數據以進行后驗分析。
除了交互模式提供的實時指標外,此功能還允許您了解系統在較長時間內的行為。這是一項強大的功能,可以通過它進行容量規劃,并有機會解決難以實時發現的零星問題。
要在批處理模式下運行 nmon,請在啟動應用程序時使用標志 -f 參數(它必須是提供的第一個參數)。默認情況下,在一天內,nmon 每五分鐘收集一次數據。您可以用參數 -s 來指定收集間隔和參數 -c 來指定快照數量。
例如,開啟 nmon 批處理模式,我們想在一小時內,每分鐘收集數據一次,同時包括捕獲頂級進程 -t,執行以下命令:
$ nmon -f -s60 -c60 -t
您的終端提示符將會立即返回,因為當您執行此命令時應用程序正在后臺運行。您可以接著使用 ps 命令,然后就可以看到它正在運行了:
$ ps -ef | grep nmon
ricardo 1849 1 0 12:27 pts/0 00:00:00 nmon -f -s60 -c60 -t
在批處理模式下,nmon 使用逗號分隔值 (Comma-Separated Value, CSV) 格式將收集的數據保存在當前目錄中,其擴展名為 .nmon:
$ ls -l
total 36
-rw-r--r--. 1 ricardo ricardo 36395 Feb 13 12:28 f35ks01_220213_1227.nmon
由于這是一個 CSV 文件,因此您可以使用其他 Linux 文本操作(命令行)工具對其進行處理,或者使用電子表格軟件將其打開,以進行進一步分析。
$ head f35ks01_220213_1227.nmon
AAA,progname,nmon
AAA,command,nmon -f -s60 -c60 -t
AAA,version,16k
AAA,disks_per_line,150
AAA,max_disks,256,set by -d option
AAA,disks,10,
AAA,host,f35ks01
AAA,user,ricardo
AAA,OS,Linux,5.16.8-200.fc35.x86_64,#1 SMP PREEMPT Tue Feb 8 20:58:59 UTC 2022,x86_64
AAA,runname,f35ks01
除了這些方法之外,nmon 開發團隊還提供了一個腳本,該腳本可將這些數據轉換為 Web 瀏覽器能可視化查看的圖表。接下來我們看看如何做到這一點。
生成圖表
CSV 是一種靈活的格式,它允許您使用電子表格處理軟件等不同的應用程序導出、分析和查看這些數據。為了使這個過程更加容易,nmon 的開發人員創造了 nmonchart。此 shell 腳本使用 Google Charts(JavaScript)將這些數據轉換為 HTML,以使其在圖形環境中可視化數據并與之交互。
若要使用 nmoncart,請從 nmon 主頁下載:
$ curl -LO http://sourceforge.net/projects/nmon/files/nmonchart40.tar
然后使用 tar 來提取包的內容:
$ mkdir nmonchart
$ tar xvf nmonchart40.tar -C nmonchart
nmonchart 需要使用 ksh(Korn SHell),因此要創建圖表,首先應使用 dnf 在您的系統中安裝 ksh:
$ sudo dnf install -y ksh
接下來,使用以下命令轉換 .nmon 文件(該文件是在批處理模式下執行 nmon 時創建的):
$ ./nmonchart/nmonchart f35ks01_220213_1227.nmon
該腳本創建一個與源 .nmon 文件同名的 HTML 文件。或者,您可以將目標文件名作為第二個參數傳遞給 nmonchart。這是一個例子:
$ ls -lg
total 4164
-rw-r--r--. 1 ricardo 113822 Feb 14 18:52 f35ks01_220213_1227.html
-rw-r--r--. 1 ricardo 93436 Feb 13 13:26 f35ks01_220213_1227.nmon
drwx------. 2 ricardo 4096 Aug 28 2020 nmonchart
您的系統圖表現已準備就緒。您的下一步是查看它們。
推薦一個關于 bash shell 腳本的書籍————《Bash shell scripting cheat sheet》
可視化性能圖表
nmonchart 為您提供的每個 .nmon 源文件創建一個 HTML 文件,其中嵌入了所需的圖表 JavaScript 庫。如果本地計算機上有 HTML 文件,請直接在 Web 瀏覽器中查看它。
您還可以使用 Web 服務器提供這些文件。我最喜歡的方法之一是在 Podman 容器中使用 Nginx,正如我在將 20 個單行 Linux 命令添加到您的工具箱中所建議的那樣。
首先,創建一個目錄并將 HTML 文件移到那里:
$ mkdir html
$ mv f35ks01_220213_1227.html html/
然后,在 8080 端口上使用 Podman 去服務來自于 Ngnix 的 html 目錄中的內容:
$ podman run --rm -v ./html:/usr/share/nginx/html:ro,Z -p 8080:80 -d nginx
如果需要的話,請在服務器防火墻上打開 8080 端口以允許流量通過:
$ sudo firewall-cmd --add-port 8080/tcp
然后,為了查看圖標,請將您的瀏覽器指向您的 URL http://<YOUR_SERVER_IP_ADDR>:8080/f35ks01_220213_1227.html:
單擊屏幕頂部的任何按鈕以查看相應的圖表(圖表是交互式的)。您可以放大和縮小以查看更精細的數據,或將鼠標懸停在圖表上以查看給定時間的詳細數據。
總結
nmon 是一款靈活且功能強大的系統監控應用程序,它可幫助您更好地了解系統,并在出現問題時及時地對其進行故障排除。它結合了監控能力、整合來自不同系統資源的實時數據的能力,以及長期性能數據收集和分析的能力。這使其成為您的系統管理員的絕佳工具。