[譯] 三種系統監控工具對比:top vs Htop vs Glances
作者 | Mark Litwintschik
譯者 | ma.yao,小大非
在開發軟體或監控執行的系統時,遙測和環境監測都很重要。以便了解系統的執行狀況,本文介紹了 top、Htop、Glances 三個實用工具,以及一種用於監控分散式系統的簡單解決方案。
在開發軟體或監控執行的系統時,遙測和環境監測都很重要。在理解了歷史情境下什麼是正常行為之後,通常兩個最緊迫的問題是:(1)什麼發生了變化?(2)什麼表現出異常?
本文將介紹三個用於臨時監控的流行工具,以及一種用於監控分散式系統的簡單解決方案。
top
在幾乎任何類 UNIX 的現代作業系統中,都可以通過輸入 top 來檢視一些系統性能指標,這些指標每幾秒鐘更新一次。
$ top -b -n2 -d5
top - 09:43:05 up1:08,0 users,load average: 0.52, 0.58, 0.59 Tasks:4 total,1 running,3 sleeping,0 stopped,0 zombie %Cpu0:4.1 us, 22.2 sy,0.0 ni, 72.3 id,0.0 wa,1.4 hi,0.0 si,0.0 st %Cpu1:4.3 us,7.1 sy,0.0 ni, 87.7 id,0.0 wa,0.9 hi,0.0 si,0.0 st %Cpu2:4.4 us,9.0 sy,0.0 ni, 85.3 id,0.0 wa,1.2 hi,0.0 si,0.0 st %Cpu3:3.6 us,6.7 sy,0.0 ni, 88.6 id,0.0 wa,1.0 hi,0.0 si,0.0 st KiB Mem:33431016 total,9521052 used, 23909964 free,34032 buffers KiB Swap: 62455548 total,27064 used, 62428484 free.188576 cached Mem PID USERPRNIVIRTRESSHR S%CPU %MEMTIME+ COMMAND 1 root2008304132104 S0.00.00:00.14 /init ro 3 root20083089656 S0.00.00:00.00 /init ro 4 mark2001785653085192 S0.00.00:00.35 -bash 228 mark2001445216681172 R0.00.00:00.01 top -b -n2 -d5
其二進位制執行過程與 Comcast 公司的 James Warner 編寫的 top 版本最相似。這個版本的 top 是全新的,並且是作為由包括 Lockheed Martin and Heidelberg University 在內的各個組織開發人員的合寫版本的替代品開發而成的。
top.c 原始碼本身相當簡單,在撰寫本文時,總共有 約 4900 行 C 程式碼。目前 top 仍然處於開發過程中,其原始碼可以在 GitLab 的 procps 倉庫(https://gitlab.com/procps-ng/procps)找到。該倉庫中還包含其他工具,包括 kill、ps、sysctl、uptime 和 watch。
其預設佈局一直沒有改變過。但是通過過去幾十年與 UNIX 系統打交道,每次在一臺新機器上使用 top,我都會習慣性地輸入 zc1M。
top 預設採用單色顯示模式,使用 z 將切換至指定顏色模式。數字 1 將顯示單個 CPU 的狀態,並且能夠突出顯示單個 CPU 核的負載。我喜歡輸入 M,以檢視基於記憶體容量使用壓力排序後的各程序資訊。top 總共提供了 49 個供檢視和排序的指標。
預設情況下,命令會截斷顯示,輸入 c 會顯示有關其路徑和引數的更多擴充套件資訊。 我唯一不滿意的是命令和引數被截斷了。如果只保留每條命令和引數的開頭與結尾,以便區分不同程序,會更加實用。
top 配置的更改只會在當前 session 有效。為了解決這個問題,輸入大寫的 W 會預設將當前配置儲存到~/.toprc 中。我對該檔案唯一不滿的地方是,它包含了大於 0x7F 的位元組值,因而不易在 top 之外對其進行更改。
$ hexdump -C ~/.toprc | head
0000000074 6f 70 27 73 20 43 6f6e 66 69 67 20 46 69 6c|top's Config Fil| 0000001065 20 28 4c 69 6e 75 7820 70 72 6f 63 65 73 73|e (Linux process| 0000002065 73 20 77 69 74 68 2077 69 6e 64 6f 77 73 29|es with windows)| 000000300a 49 64 3a 69 2c 20 4d6f 64 65 5f 61 6c 74 73|.Id:i, Mode_alts| 0000004063 72 3d 30 2c 20 4d 6f64 65 5f 69 72 69 78 70|cr=0, Mode_irixp| 0000005073 3d 31 2c 20 44 65 6c61 79 5f 74 69 6d 65 3d|s=1, Delay_time=| 0000006033 2e 30 2c 20 43 75 7277 69 6e 3d 30 0a 44 65|3.0, Curwin=0.De| 0000007066 09 66 69 65 6c 64 7363 75 72 3d a5 a8 b3 b4|f.fieldscur=....| 00000080bb bd c0 c4 b7 ba b9 c526 27 29 2a 2b 2c 2d 2e|........&')*+,-.| 000000902f 30 31 32 35 36 38 3c3e 3f 41 42 43 46 47 48|/012568<>?ABCFGH|
Htop
2004 年,Hisham Muhammad 開始致力於建立一個截然不同的系統遙測監控工具。Htop 關注遙測顯示的重新佈局:使用條形圖展示 CPU 和記憶體的關鍵指標;使用 F5 快捷鍵,使程序資訊在扁平化列表和層次結構之間切換顯示;通過滑鼠點選,可以實現屬性排序;並且支援 7 種不同的顏色模式。
該軟體能夠很好地使您停留在應用當中。如果您想要檢視一個程序使用的檔案,您可以選擇該程序,並只需輸入 l;如果您想要通過 strace 執行該程序,在以授權使用者身份執行 htop 的情況下,只需輸入 s。
在 Ubuntu 16.04.2 LTS 上安裝和執行 htop:
$ sudo apt install htop $ htop
1[0.0%]Tasks: 37, 145 thr; 1 running 2[0.0%]Load average: 0.03 0.05 0.07 3[0.0%]Uptime: 01:31:42 4[0.0%] Mem[||||||||||||||||||||||||||||||||1.03G/3.84G] Swp[0K/4.00G] PID USERPRINIVIRTRESSHR S CPU% MEM%TIME+Command 1 root200 3755656684004 S0.00.10:03.03 /sbin/init noprompt 27884 clickhous200 3716M359M 49184 S0.79.10:24.93 ├─ /usr/bin/clickhouse-server --config=/etc/cli 29668 clickhous200 3716M359M 49184 S0.09.10:00.10 │├─ /usr/bin/clickhouse-server --config=/etc/ 29667 clickhous200 3716M359M 49184 S0.09.10:01.02 │├─ /usr/bin/clickhouse-server --config=/etc/ 29666 clickhous200 3716M359M 49184 S0.09.10:00.08 │├─ /usr/bin/clickhouse-server --config=/etc/ 29665 clickhous200 3716M359M 49184 S0.09.10:00.48 │├─ /usr/bin/clickhouse-server --config=/etc/ 29409 clickhous200 3716M359M 49184 S0.09.10:03.48 │├─ /usr/bin/clickhouse-server --config=/etc/ 29408 clickhous200 3716M359M 49184 S0.09.10:02.15 │├─ /usr/bin/clickhouse-server --config=/etc/
至於配置方面,使用該軟體的過程中,任何配置修改都會預設自動儲存至~/.config/htop/htoprc。該檔案是個文字檔案,但是附有下面的警告:
$ head -n2 ~/.config/htop/htoprc
# Beware! This file is rewritten by htop when settings are changed in the interface. # The parser is also very primitive, and not human-friendly.
鑑於其提供的功能比較簡單,它的原始碼量還是相當小的。在撰寫本文時,它總共有約 12000 行 C 程式碼,同時還包含約 3000 行程式碼的其他檔案。
Glances
Glances (https://nicolargo.github.io/glances/)是一個基於 Python 的系統遙測監控工具。該專案由 Nicolas Hennion 於 2011 年開始建立。Nilcolas 的領英簡介顯示,他在法國南部的 Thales Alenia Space 衛星控制中心部門擔任專案經理。
當啟動 Glances 時,除了常見的 CPU、記憶體和程序列表,還將看到雲虛擬機器型別以及網路、硬碟、和 Docker 容器活動等等。
$ glances
ubuntu (Ubuntu 16.04 64bit / Linux 4.4.0-62-generic)Uptime: 18:55:00 CPU[1.7%]CPU -1.7%nice:0.0%ctx_sw:923MEM -53.1%SWAP -0.1%LOAD4-core MEM[ 53.1%]user:0.8%irq:0.0%inter:587total:3.84Gtotal:4.00G1 min:0.20 SWAP [0.1%]system:0.7%iowait:0.0%sw_int:786used:2.04Gused:3.27M5 min:0.14 idle:98.4%steal:0.0%free:1.80Gfree:3.99G15 min:0.10 NETWORKRx/sTx/sTASKS 203 (349 thr), 1 run, 202 slp, 0 oth sorted automatically by CPU consumption ens33152b3Kb lo59Kb59KbCPU%MEM%VIRTRESPID USERTIME+ THRNI SR/s W/sCommand 2.64.5524M178M16470 mark35:48 10 S0 0/home/mark/. DISK I/OR/sW/s2.30.6372M24.5M14672 mark0:01 10 R0 0/home/mark/. fd0001.023.75.42G 931M21151 root13:00 710 S? ?java -Xmx1G loop0000.79.83.71G 385M27884 clickhous5:29 460 S? ?/usr/bin/cli loop1000.32.83.53G 109M12883 zookeeper1:36 200 S? ?/usr/bin/jav loop2000.30.231.4M 6.80M333 root0:53 10 S? ?/lib/systemd loop3000.30.113.8M 2.68M4353 mark1:07 10 S0 0watch ifconf loop4000.00.3186M9.86M1447 root0:35 20 S? ?/usr/bin/vmt loop5000.00.275.2M 8.11M1470 root0:00 10 S? ?/usr/bin/VGA loop6000.00.290.6M 6.59M4381 root0:00 10 S? ?sshd: mark [ loop7000.00.1269M5.75M595 root0:13 30 S? ?/usr/lib/acc sda078K0.00.136.7M 5.37M1 root0:37 10 S? ?/sbin/init n sda1078K0.00.164.0M 5.31M4246 root0:00 10 S? ?/usr/sbin/ss sda2000.00.144.3M 5.05M3402 mark0:00 10 S0 0/lib/systemd sda5000.00.121.8M 5.04M4403 mark27:23 10 S0 0-bash sr0000.00.121.8M 4.93M21493 mark0:10 10 S0 0/bin/bash sr1000.00.121.7M 4.62M16114 mark0:03 10 S0 0/bin/bash 0.00.121.7M 4.47M21119 mark0:00 10 S0 0/bin/bash FILE SYSUsedTotal0.00.190.6M 4.14M4402 mark0:08 10 S? ?0 / (sda1)2.48G15.6G0.00.1250M3.97M588 syslog0:28 40 S? ?/usr/sbin/rs 0.00.121.8M 3.87M3407 mark0:04 10 S0 0-bash SENSORS0.00.151.5M 3.76M21144 root0:00 10 S? ?sudo nohup / Physical id100C0.00.141.9M 3.64M597 messagebu0:00 10 S? ?/usr/bin/dbu Core 0100C0.00.143.2M 3.45M396 root0:01 10 S? ?/lib/systemd Core 1100C0.00.164.3M 3.21M3377 root0:00 10 S? ?/bin/login - Core 2100C0.00.128.0M 2.91M592 root0:00 10 S? ?/lib/systemd Core 3100C0.00.126.7M 2.86M16113 mark0:06 10 S? ?SCREEN 0.00.115.7M 2.81M774 root0:00 10 S? ?/sbin/dhclie
Glances 由約 1 萬行 Python 程式碼和約 2.5 萬行 JavaScript 程式碼寫成,並依賴於 psutil (https://github.com/giampaolo/psutil/)軟體包以用於遙測資料收集。它還含有大量 外掛,包括支援監控 GPU、Kafka、RAID 設定、資料夾監控以及 WiFi 等等。
除了基於 ncurses 的介面,Glances 也能以 Web 應用的形式執行。當在 Windows 10 上通過 cmd.exe 執行 Glances 的時候,將啟動一個執行在 TCP 埠為 61209 的 Bottle Web 應用。在瀏覽器中開啟 http://127.0.0.1:61209,會看到一個AngularJS 應用程式的歡迎頁面。該頁面模仿了 ncurses 介面。
也可以通過呼叫其暴露的 API 介面,配合其他工具使用:
$ curl http://127.0.0.1:61209/api/3/all \ | python -mjson.tool \ | head -n50 { "alert": [], "amps": [], "batpercent": [], "cloud": {}, "core": { "log": 4, "phys": 4 }, "cpu": { "cpucore": 4, "ctx_switches": 182358, "idle": 82.9, "interrupts": 113134, "soft_interrupts": 0, "syscalls": 215848, "system": 12.5, "time_since_update": 8.532670974731445, "total": 9.8, "user": 3.1 }, "diskio": [ { "disk_name": "PhysicalDrive6", "key": "disk_name", "read_bytes": 0, "read_count": 0, "time_since_update": 8.492774963378906, "write_bytes": 0, "write_count": 0 }, { "disk_name": "PhysicalDrive2", "key": "disk_name", "read_bytes": 0, "read_count": 0, "time_since_update": 8.492774963378906, "write_bytes": 0, "write_count": 0 }, ...
雖然預設的配置檔案(https://github.com/nicolargo/glances/blob/develop/conf/glances.conf)有些冗長,但是使用者編輯起來還算方便。
Glances 還支援將遙測資料匯出到 16 個以上不同的目標檔案中,包括 StatsD、Kafka、RabbitMQ、JSON、SVG、ElasticSearch、CSV 以及自定義 RESTful API。
將 Glances 匯入 Kafka
以下將介紹將遙測資料匯入 CSV 檔案,再匯入 Kafka。我認為本地硬碟通常要比網路連線更靠譜。當網路連接出現問題的時候,我們還可以利用本地檔案再次回填 Kafka。
以下命令執行在新安裝的 Ubuntu 16.04.2 LTS 上:
$ sudo apt update $ sudo apt install \ kafkacat \ python-pip \ python-virtualenv \ screen \ zookeeperd
使用 Apache 映象上的二進位制包,手動安裝 Kafka:
$ sudo mkdir -p /opt/kafka $ wget -c -O kafka.tgz \ http://www-eu.apache.org/dist/kafka/1.1.1/kafka_2.11-1.1.1.tgz $ sudo tar xzvf kafka.tgz \ --directory=/opt/kafka \ --strip 1
為 Kafka 建立日誌檔案,其許可權使用我的 UNIX 賬號:
$ sudo touch /var/log/kafka.log $ sudo chown mark /var/log/kafka.log
ZooKeeper 支援了 Kafka 的大多數分散式功能,以下命令將啟動 ZooKeeper 服務:
$ sudo /etc/init.d/zookeeper start
啟動完 ZooKeeper,啟動 Kafka 伺服器程序:
$ sudo nohup /opt/kafka/bin/kafka-server-start.sh \ /opt/kafka/config/server.properties \ > /var/log/kafka.log 2>&1 &
建立 Python 虛擬環境,並安裝 Glances 以及 CSVKit,以便分析 Glances 的 CSV 檔案輸出:
$ virtualenv ~/.monitoring $ source ~/.monitoring/bin/activate $ pip install \ csvkit \ glances
接著,啟動 screen 會話和 Glances。它將顯示 ncurses 介面,並向~/glances.csv 中寫入 215 條資料:
$ screen $ glances --export csv \ --export-csv-file ~/glances.csv
一旦執行起來,按 CTRL-A,接著按 CTRL-D,返回到常規的 Shell 介面。
如下所示,這裡有大量收集到的遙測資料:
$ csvstat --type ~/glances.csv | tail
206. mem_available: Number 207. mem_used: Number 208. mem_cached: Number 209. mem_percent: Number 210. mem_free: Number 211. mem_inactive: Number 212. mem_active: Number 213. mem_shared: Number 214. mem_total: Number 215. mem_buffers: Number
Kafkacat 是採用 C 語言寫的一個非 JVM 的 Kafka 生產者和消費者。靜態連結的包大小要小於 150KB。使用它,將~/glances.csv 中的內容匯入 Kafka Topic “glances_log”中,並對內容進行 Snappy 壓縮。
$ screen $ tail -F ~/glances.csv \ | kafkacat -b localhost:9092 \ -t glances_log \ -z snappy
接下來,一旦執行起來,按 CTRL-A,然後按 CTRL-D,返回到常規 Shell 介面。
以上這些執行在 screen 會話中的任何命令,都可以方便地新增到 Supervisord。另外,如果這些程序因為任何原因掛了,都能很好地重啟它們。
完成上述操作之後,檢視前 100 條記錄的前三列資料:
$ /opt/kafka/bin/kafka-console-consumer.sh \ --topic glances_log \ --from-beginning \ --zookeeper localhost:2181 \ | head -n100 \ | csvstat --columns 1-3 \ --no-header-row
以下是基於前 100 條記錄,收集到的時間戳、CPU 核數以及一分鐘負載均值的統計資訊:
1. "a" Type of data:DateTime Contains null values:False Unique values:100 Smallest value:2018-10-07 05:53:49 Largest value:2018-10-07 05:58:55 Most common values:2018-10-07 05:53:49 (1x) 2018-10-07 05:53:52 (1x) 2018-10-07 05:53:55 (1x) 2018-10-07 05:53:58 (1x) 2018-10-07 05:54:01 (1x) 2. "b" Type of data:Number Contains null values:False Unique values:1 Smallest value:4 Largest value:4 Sum:400 Mean:4 Median:4 StDev:0 Most common values:4 (100x) 3. "c" Type of data:Number Contains null values:False Unique values:18 Smallest value:0.02 Largest value:0.22 Sum:6.57 Mean:0.066 Median:0.05 StDev:0.045 Most common values:0.04 (15x) 0.02 (14x) 0.03 (13x) 0.06 (9x) 0.05 (9x)
英文原文:http://tech.marksblogg.com/top-htop-glances.html
活動推薦
網際網路的快速發展,導致服務數量呈現了指數級增長,自動化運維雖然提升了效率,但也遇到了新的難題。面對繁多的報警資訊,運維人員應該如何處理?故障發生時,又如何能夠迅速定位問題?
由 InfoQ 主辦的第四屆 CNUTCon 全球運維技術大會,全方位、多角度向參會者闡述智慧運維時代的有哪些變革,Twitter、RIOT Games、BAT、華為等國內外一線大廠有哪些新技術和新實踐。
目前,大會 8 折限時優惠,立減 720 元,團購更優惠!掃描下方二維碼或點選閱讀原文了解,有任何問題歡迎諮詢 Joy 小同學,電話:13269078023(微信同號)。