Collectl: Linux 性能監控的全能冠軍
collectl是一款非常優秀並且有著豐富的命令行功能的實用程序,你可以用它來採集描述當前系統狀態的性能數據。不同於大多數其它的系統監控工具,collectl 並非僅局限於有限的系統度量,相反,它可以收集許多不同類型系統資源的相關信息,如 cpu 、disk、memory 、network 、sockets 、 tcp 、inodes 、infiniband 、 lustre 、memory、nfs、processes、quadrics、slabs和buddyinfo等。
使用 collectl 的另一個好處就是它可以替代那些特定用途的工具如: top、ps、iotop 等等其它工具。那麼 collectl 有什麼特性而使其成為一個有用的工具呢?
經過許多研究後,我總結了 collectl 的命令行功能的一些非常重要的特性。
Collectl 特性
- 可以互動式地運行或作為一個守護進程,或同時二者兼備地運行。
- 可以以多種格式顯示輸出。
- 可以監控幾乎所有的子系統。
- 可以替代許多工具如 ps、top、iotop、vmstat。
- 可以記錄並回放捕獲的數據。
- 可以將數據導出成多種數據格式。(這在你想用外部工具分析數據時非常有用)
- 可以作為一個服務來監控遠程機或者整個伺服器集群。
- 可以在終端顯示數據,寫入數據到文件或者一個套接字。
如何在Linux上安裝collectl
collectl可以在所有的 Linux 發行版上運行,唯一需要的就是 perl 語言,所以在安裝 collectl 之前,一定要確保你的電腦上已經安裝了Perl。
對於Debian/Ubuntu/Linux Mint
下面的命令可以用來在以 Debian 為基礎的設備如 Ubuntu 上安裝 collectl。
$ sudo apt-get install collectl
對於RHEL/CentOS/Fedora
如果你正在使用基於紅帽的發行版,你可以用 yum 命令輕鬆獲取它。
# yum install collectl
一些關於collectl的實例
collectl 工具安裝完成之後,你可以輕鬆地在終端運行它,你甚至不需要指定任何選項。下面的命令將會以簡短易讀的格式顯示cpu、硬碟和網路信息。
# collectl
waiting for 1 second sample...
#
#cpu sys inter ctxsw KBRead Reads KBWrit Writes KBIn PktIn KBOut PktOut
13 5 790 1322 0 0 92 7 4 13 0 5
10 2 719 1186 0 0 0 0 3 9 0 4
12 0 753 1188 0 0 52 3 2 5 0 6
13 2 733 1063 0 0 0 0 1 1 0 1
25 2 834 1375 0 0 0 0 1 1 0 1
28 2 870 1424 0 0 36 7 1 1 0 1
19 3 949 2271 0 0 44 3 1 1 0 1
17 2 809 1384 0 0 0 0 1 6 0 6
16 2 732 1348 0 0 0 0 1 1 0 1
22 4 993 1615 0 0 56 3 1 2 0 3
正如上面終端上所顯示的,我們很容易觀察該命令輸出的系統度量值,因為它每次以一行顯示。
不加任何參數執行 collectl 會顯示下面子系統的信息
- cpu
- 磁碟
- 網路
提示:在這裡,一個子系統就是每一種可以測量的系統資源。
你也可以顯示除slabs以外各個子系統的統計數據,這要結合下面的 -all 選項來實現。
# collectl --all
waiting for 1 second sample...
#
#cpu sys inter ctxsw Cpu0 Cpu1 Free Buff Cach Inac Slab Map Fragments KBRead Reads KBWrit Writes KBIn PktIn KBOut PktOut IP Tcp Udp Icmp Tcp Udp Raw Frag Handle Inodes Reads Writes Meta Comm
16 3 817 1542 430 390 1G 175M 1G 683M 193M 1G nsslkjjebbk 0 0 24 3 1 1 0 1 0 0 0 0 623 0 0 0 8160 240829 0 0 0 0
11 1 745 1324 316 426 1G 175M 1G 683M 193M 1G nsslkjjebbk 0 0 0 0 0 3 0 2 0 0 0 0 622 0 0 0 8160 240828 0 0 0 0
15 2 793 1683 371 424 1G 175M 1G 683M 193M 1G ssslkjjebbk 0 0 0 0 1 1 0 1 0 0 0 0 622 0 0 0 8160 240829 0 0 0 0
16 2 872 1875 427 446 1G 175M 1G 683M 193M 1G ssslkjjebbk 0 0 24 3 1 1 0 1 0 0 0 0 622 0 0 0 8160 240828 0 0 0 0
24 2 842 1383 473 368 1G 175M 1G 683M 193M 1G ssslkjjebbk 0 0 168 6 1 1 0 1 0 0 0 0 622 0 0 0 8160 240828 0 0 0 0
27 3 844 1099 478 365 1G 175M 1G 683M 193M 1G nsslkjjebbk 0 0 0 0 1 6 1 9 0 0 0 0 622 0 0 0 8160 240828 0 0 0 0
26 5 823 1238 396 428 1G 175M 1G 683M 193M 1G ssslkjjebbk 0 0 0 0 2 11 3 9 0 0 0 0 622 0 0 0 8160 240828 0 0 0 0
15 1 753 1276 361 391 1G 175M 1G 683M 193M 1G ssslkjjebbk 0 0 40 3 1 2 0 3 0 0 0 0 623 0 0 0 8160 240829 0 0 0 0
但是,你如何用它來監控 cpu 的使用情況呢? 『-s』 選項可以用來控制哪個子系統的數據需要收集和回放。
例如下面的命令可以用來對cpu使用情況進行一個總結。
# collectl -sc
waiting for 1 second sample...
#
#cpu sys inter ctxsw
15 2 749 1155
16 3 772 1445
14 2 793 1247
27 4 887 1292
24 1 796 1258
16 1 743 1113
15 1 743 1179
14 1 706 1078
15 1 764 1268
當你將這個命令與「scdn」結合時會發生什麼呢?學習命令行工具最好的方式就是多加練習,所以在終端運行下面的命令看看會發生什麼吧。
# collectl -scdn
waiting for 1 second sample...
#
#cpu sys inter ctxsw KBRead Reads KBWrit Writes KBIn PktIn KBOut PktOut
25 4 943 3333 0 0 0 0 1 1 0 2
27 3 825 2910 0 0 0 0 1 1 0 1
27 5 886 2531 0 0 0 0 0 0 0 1
20 4 872 2406 0 0 0 0 1 1 0 1
26 1 854 2091 0 0 20 2 1 1 0 1
39 4 1004 3398 0 0 0 0 2 8 3 6
41 6 955 2464 0 0 40 3 1 2 0 3
25 7 890 1609 0 0 0 0 1 1 0 1
16 2 814 1165 0 0 796 43 2 2 0 2
14 1 779 1383 0 0 48 6 1 1 0 1
11 2 795 1285 0 0 0 0 2 14 1 14
你可以很容易就明白默認選項是「cdn」,它代表cpu、硬碟和網路數據。運行帶這個選項的 collectl 命令的輸出和「collectl -scn」的輸出一樣。
如果你想採集內存的數據,用下面的命令。
# collectl -sm
waiting for 1 second sample...
#
#Free Buff Cach Inac Slab Map
1G 177M 1G 684M 193M 1G
1G 177M 1G 684M 193M 1G
1G 177M 1G 684M 193M 1G
1G 177M 1G 684M 193M 1G
1G 177M 1G 684M 193M 1G
1G 177M 1G 684M 193M 1G
1G 177M 1G 684M 193M 1G
1G 177M 1G 684M 193M 1G
當你想要進一步了解內存使用信息、空閑的內存或者與你系統性能有關的重要資料時,上面的輸出將是非常有用的。
如果想搜集一點兒 tcp 的數據呢?使用下面的命令來實現吧。
# collectl -st
waiting for 1 second sample...
#
# IP Tcp Udp Icmp
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
當你熟練到一定程度時,你就可以很輕鬆地得到你想要的結果了。例如你可以將關於 tcp 的「t」選項和關於 cpu 的「c」選項組合到一起。下面的命令就是如此。
# collectl -stc
waiting for 1 second sample...
#
#cpu sys inter ctxsw IP Tcp Udp Icmp
23 8 961 3136 0 0 0 0
24 5 916 3662 0 0 0 0
21 8 848 2408 0 0 0 0
30 10 916 2674 0 0 0 0
38 3 826 1752 0 0 0 0
31 3 820 1408 0 0 0 0
15 5 781 1335 0 0 0 0
17 3 802 1314 0 0 0 0
17 3 755 1218 0 0 0 0
14 2 788 1321 0 0 0 0
對於我們普通大眾來說記住這些選項很困難,所以在這裡,我整理出了一個列表來總結這個工具支持的選項。
- b – buddy info (內存碎片)
- c – CPU
- d – Disk
- f – NFS V3 Data
- i – Inode and File System
- j – Interrupts
- l – Lustre
- m – Memory
- n – Networks
- s – Sockets
- t – TCP
- x – Interconnect
- y – Slabs (系統對象緩存)
對於一個系統管理員或者一個 Linux 用戶來說很重要的一種數據就是硬碟的使用情況。下面的命令可以幫你監控硬碟使用情況。
# collectl -sd
waiting for 1 second sample...
#
#KBRead Reads KBWrit Writes
0 0 0 0
0 0 0 0
0 0 92 7
0 0 0 0
0 0 36 3
0 0 0 0
0 0 0 0
0 0 100 7
0 0 0 0
你也可以使用「-sD」選項來採集單個硬碟的數據,不過你必須知道這就不會顯示全部硬碟的信息。
# collectl -sD
waiting for 1 second sample...
# DISK STATISTICS (/sec)
# Pct
#Name KBytes Merged IOs Size KBytes Merged IOs Size RWSize QLen Wait SvcTim Util
sda 0 0 0 0 52 11 2 26 26 1 8 8 1
sda 0 0 0 0 0 0 0 0 0 0 0 0 0
sda 0 0 0 0 24 0 2 12 12 0 0 0 0
sda 0 0 0 0 152 0 4 38 38 0 0 0 0
sda 0 0 0 0 192 45 3 64 64 1 20 20 5
sda 0 0 0 0 204 0 2 102 102 0 0 0 0
sda 0 0 0 0 0 0 0 0 0 0 0 0 0
sda 0 0 0 0 116 26 3 39 38 1 16 16 4
sda 0 0 0 0 0 0 0 0 0 0 0 0 0
sda 0 0 0 0 0 0 0 0 0 0 0 0 0
sda 0 0 0 0 32 5 3 11 10 1 16 16 4
sda 0 0 0 0 0 0 0 0 0 0 0 0 0
你也可以使用其它詳細的子系統來採集詳細的數據。下面是詳細子系統的一個列表。
- C – CPU
- D – Disk
- E – Environmental data (fan, power, temp), via ipmitool
- F – NFS Data
- J – Interrupts
- L – Lustre OST detail OR client Filesystem detail
- N – Networks
- T – 65 TCP counters only available in plot format
- X – Interconnect
- Y – Slabs (system object caches)
- Z – Processes
collectl 工具中有許多選項,但是僅用一篇文章來介紹肯定是介紹不過來的。然而如果將它當作 top 和 ps 工具來使用還是值得一提的。
很容易將 collectl 當作 top 來使用,只要在 Linux 系統的終端運行下面的命令你就會看到和 top 工具類似的輸出。
# collectl --top
# TOP PROCESSES sorted by time (counters are /sec) 13:11:02
# PID User PR PPID THRD S VSZ RSS CP SysT UsrT Pct AccuTime RKB WKB MajF MinF Command
^COuch!tecmint 20 1 40 R 1G 626M 0 0.01 0.14 15 28:48.24 0 0 0 109 /usr/lib/firefox/firefox
3403 tecmint 20 1 40 R 1G 626M 1 0.00 0.20 20 28:48.44 0 0 0 600 /usr/lib/firefox/firefox
5851 tecmint 20 4666 0 R 17M 13M 0 0.02 0.06 8 00:01.28 0 0 0 0 /usr/bin/perl
1682 root 20 1666 2 R 211M 55M 1 0.02 0.01 3 03:10.24 0 0 0 95 /usr/bin/X
3454 tecmint 20 3403 8 S 216M 45M 1 0.01 0.02 3 01:23.32 0 0 0 0 /usr/lib/firefox/plugin-container
4658 tecmint 20 4657 3 S 207M 17M 1 0.00 0.02 2 00:08.23 0 0 0 142 gnome-terminal
2890 tecmint 20 2571 3 S 340M 68M 0 0.00 0.01 1 01:19.95 0 0 0 0 compiz
3521 tecmint 20 1 24 S 710M 148M 1 0.01 0.00 1 01:47.84 0 0 0 0 skype
1 root 20 0 0 S 3M 2M 0 0.00 0.00 0 00:02.57 0 0 0 0 /sbin/init
2 root 20 0 0 S 0 0 1 0.00 0.00 0 00:00.00 0 0 0 0 kthreadd
3 root 20 2 0 S 0 0 0 0.00 0.00 0 00:00.60 0 0 0 0 ksoftirqd/0
5 root 0 2 0 S 0 0 0 0.00 0.00 0 00:00.00 0 0 0 0 kworker/0:0H
7 root 0 2 0 S 0 0 0 0.00 0.00 0 00:00.00 0 0 0 0 kworker/u:0H
8 root RT 2 0 S 0 0 0 0.00 0.00 0 00:04.42 0 0 0 0 migration/0
9 root 20 2 0 S 0 0 0 0.00 0.00 0 00:00.00 0 0 0 0 rcu_bh
10 root 20 2 0 R 0 0 0 0.00 0.00 0 00:02.22 0 0 0 0 rcu_sched
11 root RT 2 0 S 0 0 0 0.00 0.00 0 00:00.05 0 0 0 0 watchdog/0
12 root RT 2 0 S 0 0 1 0.00 0.00 0 00:00.07 0 0 0 0 watchdog/1
13 root 20 2 0 S 0 0 1 0.00 0.00 0 00:00.73 0 0 0 0 ksoftirqd/1
14 root RT 2 0 S 0 0 1 0.00 0.00 0 00:01.96 0 0 0 0 migration/1
16 root 0 2 0 S 0 0 1 0.00 0.00 0 00:00.00 0 0 0 0 kworker/1:0H
17 root 0 2 0 S 0 0 1 0.00 0.00 0 00:00.00 0 0 0 0 cpuset
最後,當然不是說這不重要,我們在終端運行下面的命令就可以將 collectl 用作 ps 工具了。 你可以得到關於你系統進程的信息,這和在終端運行「ps」命令是一樣的。
# collectl -c1 -sZ -i:1
waiting for 1 second sample...
### RECORD 1 >>> tecmint-vgn-z13gn <<< (1397979716.001) (Sun Apr 20 13:11:56 2014) ###
# PROCESS SUMMARY (counters are /sec)
# PID User PR PPID THRD S VSZ RSS CP SysT UsrT Pct AccuTime RKB WKB MajF MinF Command
1 root 20 0 0 S 3M 2M 0 0.00 0.00 0 00:02.57 0 0 0 0 /sbin/init
2 root 20 0 0 S 0 0 1 0.00 0.00 0 00:00.00 0 0 0 0 kthreadd
3 root 20 2 0 S 0 0 0 0.00 0.00 0 00:00.60 0 0 0 0 ksoftirqd/0
5 root 0 2 0 S 0 0 0 0.00 0.00 0 00:00.00 0 0 0 0 kworker/0:0H
7 root 0 2 0 S 0 0 0 0.00 0.00 0 00:00.00 0 0 0 0 kworker/u:0H
8 root RT 2 0 S 0 0 0 0.00 0.00 0 00:04.42 0 0 0 0 migration/0
9 root 20 2 0 S 0 0 0 0.00 0.00 0 00:00.00 0 0 0 0 rcu_bh
10 root 20 2 0 S 0 0 0 0.00 0.00 0 00:02.24 0 0 0 0 rcu_sched
11 root RT 2 0 S 0 0 0 0.00 0.00 0 00:00.05 0 0 0 0 watchdog/0
12 root RT 2 0 S 0 0 1 0.00 0.00 0 00:00.07 0 0 0 0 watchdog/1
13 root 20 2 0 S 0 0 1 0.00 0.00 0 00:00.73 0 0 0 0 ksoftirqd/1
14 root RT 2 0 S 0 0 1 0.00 0.00 0 00:01.96 0 0 0 0 migration/1
16 root 0 2 0 S 0 0 1 0.00 0.00 0 00:00.00 0 0 0 0 kworker/1:0H
17 root 0 2 0 S 0 0 1 0.00 0.00 0 00:00.00 0 0 0 0 cpuset
18 root 0 2 0 S 0 0 1 0.00 0.00 0 00:00.00 0 0 0 0 khelper
19 root 20 2 0 S 0 0 0 0.00 0.00 0 00:00.00 0 0 0 0 kdevtmpfs
20 root 0 2 0 S 0 0 0 0.00 0.00 0 00:00.00 0 0 0 0 netns
21 root 20 2 0 S 0 0 0 0.00 0.00 0 00:00.00 0 0 0 0 bdi-default
22 root 0 2 0 S 0 0 0 0.00 0.00 0 00:00.00 0 0 0 0 kintegrityd
我確信許多系統管理員將會喜歡這個工具並且在充分使用它後會感受到它的強大。如果你想增進你對 collectl 的了解,從而達到新的層面,你可以去參閱 collectl 的 man 手冊並勤加練習。
在你的終端鍵入下面的命令開始閱讀吧。
# man collectl
參考鏈接
via: http://www.tecmint.com/linux-performance-monitoring-with-collectl-tool/
譯者:Linchenguang 校對:Caroline
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive