三種系統監控工具對比:top vs Htop vs Glances

 

首先啓用 EPEL Repository:html

yum -y install epel-release

啓用 EPEL Repository 後, 能夠用 yum 直接安裝 Htop:java

yum -y install htop

安裝好 Htop 後, 啟動只需執行 「htop」 指令:python

htop

 

https://mp.weixin.qq.com/s/_YdwciFT6qu5_kUIyylR2glinux

 

做者 | Mark Litwintschik譯者 | ma.yao,小大非在開發軟件或監控運行的系統時,遙測和環境監測都很重要。以便了解系統的運行情況,本文介紹了 top、Htop、Glances 三個實用工具,以及一種用於監控分佈式系統的簡單解決方案。git

在開發軟件或監控運行的系統時,遙測和環境監測都很重要。在理解了歷史情境下什麼是正常行爲以後,一般兩個最緊迫的問題是:(1)什麼發生了變化?(2)什麼表現出異常?github

本文將介紹三個用於臨時監控的流行工具,以及一種用於監控分佈式系統的簡單解決方案。sql

    top    shell

在幾乎任何類 UNIX 的現代操做系統中,均可以經過輸入 top 來查看一些系統性能指標,這些指標每幾秒鐘更新一次。apache

$ top -b -n2 -d5
top - 09:43:05 up  1: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 USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    1 root      20   0    8304    132    104 S   0.0  0.0   0:00.14 /init ro
    3 root      20   0    8308     96     56 S   0.0  0.0   0:00.00 /init ro
    4 mark      20   0   17856   5308   5192 S   0.0  0.0   0:00.35 -bash
  228 mark      20   0   14452   1668   1172 R   0.0  0.0   0:00.01 top -b -n2 -d5

其二進制執行過程與 Comcast 公司的 James Warner 編寫的 top 版本最類似。這個版本的 top 是全新的,而且是做爲由包括 Lockheed Martin and Heidelberg University 在內的各個組織開發人員的合寫版本的替代品開發而成的。json

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
00000000  74 6f 70 27 73 20 43 6f  6e 66 69 67 20 46 69 6c  |top's Config Fil|
00000010  65 20 28 4c 69 6e 75 78  20 70 72 6f 63 65 73 73  |e (Linux process|
00000020  65 73 20 77 69 74 68 20  77 69 6e 64 6f 77 73 29  |es with windows)|
00000030  0a 49 64 3a 69 2c 20 4d  6f 64 65 5f 61 6c 74 73  |.Id:i, Mode_alts|
00000040  63 72 3d 30 2c 20 4d 6f  64 65 5f 69 72 69 78 70  |cr=0, Mode_irixp|
00000050  73 3d 31 2c 20 44 65 6c  61 79 5f 74 69 6d 65 3d  |s=1, Delay_time=|
00000060  33 2e 30 2c 20 43 75 72  77 69 6e 3d 30 0a 44 65  |3.0, Curwin=0.De|
00000070  66 09 66 69 65 6c 64 73  63 75 72 3d a5 a8 b3 b4  |f.fieldscur=....|
00000080  bb bd c0 c4 b7 ba b9 c5  26 27 29 2a 2b 2c 2d 2e  |........&')*+,-.|
00000090  2f 30 31 32 35 36 38 3c  3e 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 USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
    1 root       20   0 37556  5668  4004 S  0.0  0.1  0:03.03 /sbin/init noprompt
27884 clickhous  20   0 3716M  359M 49184 S  0.7  9.1  0:24.93 ├─ /usr/bin/clickhouse-server --config=/etc/cli
29668 clickhous  20   0 3716M  359M 49184 S  0.0  9.1  0:00.10 │  ├─ /usr/bin/clickhouse-server --config=/etc/
29667 clickhous  20   0 3716M  359M 49184 S  0.0  9.1  0:01.02 │  ├─ /usr/bin/clickhouse-server --config=/etc/
29666 clickhous  20   0 3716M  359M 49184 S  0.0  9.1  0:00.08 │  ├─ /usr/bin/clickhouse-server --config=/etc/
29665 clickhous  20   0 3716M  359M 49184 S  0.0  9.1  0:00.48 │  ├─ /usr/bin/clickhouse-server --config=/etc/
29409 clickhous  20   0 3716M  359M 49184 S  0.0  9.1  0:03.48 │  ├─ /usr/bin/clickhouse-server --config=/etc/
29408 clickhous  20   0 3716M  359M 49184 S  0.0  9.1  0: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:   923   MEM -   53.1%   SWAP -    0.1%   LOAD    4-core
MEM  [ 53.1%]   user:     0.8%  irq:      0.0%  inter:    587   total:  3.84G   total:   4.00G   1 min:    0.20
SWAP [  0.1%]   system:   0.7%  iowait:   0.0%  sw_int:   786   used:   2.04G   used:    3.27M   5 min:    0.14
                idle:    98.4%  steal:    0.0%                  free:   1.80G   free:    3.99G   15 min:   0.10

NETWORK       Rx/s   Tx/s   TASKS 203 (349 thr), 1 run, 202 slp, 0 oth sorted automatically by CPU consumption
ens33         152b    3Kb
lo            59Kb   59Kb   CPU%   MEM%  VIRT  RES      PID USER          TIME+ THR  NI S  R/s W/s  Command
                            2.6    4.5   524M  178M   16470 mark          35:48 1     0 S    0 0    /home/mark/.
DISK I/O       R/s    W/s   2.3    0.6   372M  24.5M  14672 mark           0:01 1     0 R    0 0    /home/mark/.
fd0              0      0   1.0    23.7  5.42G 931M   21151 root          13:00 71    0 S    ? ?    java -Xmx1G
loop0            0      0   0.7    9.8   3.71G 385M   27884 clickhous      5:29 46    0 S    ? ?    /usr/bin/cli
loop1            0      0   0.3    2.8   3.53G 109M   12883 zookeeper      1:36 20    0 S    ? ?    /usr/bin/jav
loop2            0      0   0.3    0.2   31.4M 6.80M    333 root           0:53 1     0 S    ? ?    /lib/systemd
loop3            0      0   0.3    0.1   13.8M 2.68M   4353 mark           1:07 1     0 S    0 0    watch ifconf
loop4            0      0   0.0    0.3   186M  9.86M   1447 root           0:35 2     0 S    ? ?    /usr/bin/vmt
loop5            0      0   0.0    0.2   75.2M 8.11M   1470 root           0:00 1     0 S    ? ?    /usr/bin/VGA
loop6            0      0   0.0    0.2   90.6M 6.59M   4381 root           0:00 1     0 S    ? ?    sshd: mark [
loop7            0      0   0.0    0.1   269M  5.75M    595 root           0:13 3     0 S    ? ?    /usr/lib/acc
sda              0    78K   0.0    0.1   36.7M 5.37M      1 root           0:37 1     0 S    ? ?    /sbin/init n
sda1             0    78K   0.0    0.1   64.0M 5.31M   4246 root           0:00 1     0 S    ? ?    /usr/sbin/ss
sda2             0      0   0.0    0.1   44.3M 5.05M   3402 mark           0:00 1     0 S    0 0    /lib/systemd
sda5             0      0   0.0    0.1   21.8M 5.04M   4403 mark          27:23 1     0 S    0 0    -bash
sr0              0      0   0.0    0.1   21.8M 4.93M  21493 mark           0:10 1     0 S    0 0    /bin/bash
sr1              0      0   0.0    0.1   21.7M 4.62M  16114 mark           0:03 1     0 S    0 0    /bin/bash
                            0.0    0.1   21.7M 4.47M  21119 mark           0:00 1     0 S    0 0    /bin/bash
FILE SYS      Used  Total   0.0    0.1   90.6M 4.14M   4402 mark           0:08 1     0 S    ? ?    0
/ (sda1)     2.48G  15.6G   0.0    0.1   250M  3.97M    588 syslog         0:28 4     0 S    ? ?    /usr/sbin/rs
                            0.0    0.1   21.8M 3.87M   3407 mark           0:04 1     0 S    0 0    -bash
SENSORS                     0.0    0.1   51.5M 3.76M  21144 root           0:00 1     0 S    ? ?    sudo nohup /
Physical id          100C   0.0    0.1   41.9M 3.64M    597 messagebu      0:00 1     0 S    ? ?    /usr/bin/dbu
Core 0               100C   0.0    0.1   43.2M 3.45M    396 root           0:01 1     0 S    ? ?    /lib/systemd
Core 1               100C   0.0    0.1   64.3M 3.21M   3377 root           0:00 1     0 S    ? ?    /bin/login -
Core 2               100C   0.0    0.1   28.0M 2.91M    592 root           0:00 1     0 S    ? ?    /lib/systemd
Core 3               100C   0.0    0.1   26.7M 2.86M  16113 mark           0:06 1     0 S    ? ?    SCREEN
                            0.0    0.1   15.7M 2.81M    774 root           0:00 1     0 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

 

 

https://aniyo.iteye.com/blog/1454524 

名稱:top 
  
  使用權限:全部使用者 
  
  使用方式:top [-] [d delay] [q] [c] [S] [s] [i] [n] [b] 
  
  說明:實時顯示 process 的動態 
  
  參數: 
  
  d : 改變顯示的更新速度,或是在交談式指令列( interactive command)按 s 
  q : 沒有任何延遲的顯示速度,若是使用者是有 superuser 的權限,則 top 將會以最高的優先序執行 
  c : 切換顯示模式,共有兩種模式,一是隻顯示執行檔的名稱,另外一種是顯示完整的路徑與名稱S : 累積模式,會將己完成或消失的子行程 ( dead child process ) 的 CPU time 累積起來 
  s : 安全模式,將交談式指令取消, 避免潛在的危機 
  i : 不顯示任何閒置 (idle) 或無用 (zombie) 的行程 
  n : 更新的次數,完成後將會退出 top 
  b : 批次檔模式,搭配 "n" 參數一塊兒使用,能夠用來將 top 的結果輸出到檔案內 
  
  範例: 
  顯示更新十次後退出 ; 
   top -n 10 
   
  使用者將不能利用交談式指令來對行程下命令 : 
   top -s 
   
  將更新顯示二次的結果輸入到名稱爲 top.log 的檔案裏 : 
   top -n 2 -b < top.log

 

高效的使用 top 已翻譯 100%

lateron 投遞於 2013/04/08

對桌面用戶來講,監視系統資源使用是一項重要的工做。經過這項工做,咱們能夠找到系統瓶頸所在,針對性的進行系統優化,識別內存泄露等。問題是,咱們應該用什麼軟件,以及若是針對咱們的需求使用它。

在衆多備選的監測工具中,多數人使用「top」(procps 包的一部分)。Top 提供了幾乎能夠說是全部的咱們所須要的系統資源使用監測,就在這一個軟件中。本文中的全部信息都是基於運行在 Linux 2.6.x 內核上的版本號爲3.2.5的 procps 包。

在這裏,咱們假定 procps 已經安裝並運行在你的 Linux 系統中。這裏無需你對 top 的使用經驗,但若是你嘗試去用一下,將更有利。

 

下面是一些挑戰:

A.交互仍是批處理模式?

默認狀況下,Top 被調用時使用交互模式。在此模式下,Top 無限期運行,並能夠經過按鍵從新定義 Top 的運行方式。可是,有時你須要對 Top 的輸出進行後續處理,但這在此模式下難以實現。解決方法?使用批處理模式。

$ top -b
你將得到相似下面的輸出: 
top - 15:22:45 up  4:19,  5 users,  load average: 0.00, 0.03, 0.00 Tasks: 60 total, 1 running, 59 sleeping, 0 stopped, 0 zombie Cpu(s): 3.8% us, 2.9% sy, 0.0% ni, 89.6% id, 3.3% wa, 0.4% hi, 0.0% si Mem: 515896k total, 495572k used, 20324k free, 13936k buffers Swap: 909676k total, 4k used, 909672k free, 377608k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 16 0 1544 476 404 S 0.0 0.1 0:01.35 init 2 root 34 19 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/0 3 root 10 -5 0 0 0 S 0.0 0.0 0:00.11 events/0 
哈,等等,它是不斷重複運行的,同交互模式同樣。不用擔憂,你可使用 -n 限制重複數量。因此,若是你但願得到一次性結果,鍵入: 
$ top -b -n 1
這一模式的真正優點在於你能夠很容易的與 at 或 cron 命令結合。它們的結合,使得 Top 能夠在特定時間對資源使用狀態進行快照。例如,使用 at ,咱們能夠設定 top 在一分鐘以後運行。
$ cat ./test.at TERM=linux top -b -n 1 >/tmp/top-report.txt $ at -f ./test.at now+1minutes
細心的讀者可能會問「在建立新任務時,爲何我須要在調用 Top 以前設置環境變量 TERM?」。答案是,Top 運行時須要此變量,但「at」在定時調用時並不會保留它。同上面那樣簡單的設置能夠確保 Top 正常運行。

 

K6F
K6F
翻譯於 2013/04/10 14:00
 頂
4
 
 

B.如何監控制定進程?

有時,咱們只對幾個進程感興趣,可能只是所有進程中的4個或5個。例如,若是你想要監測進程標識(PID)爲4360和4358的進程,你須要鍵入:

$ top -p 4360,4358
$ top -p 4360 -p 4358

看起來很簡單,只須要使用 -p 列出全部須要的 PID,並使用逗號間隔或簡單的屢次使用 -p便可。
另外一種多是監測擁有特定用戶標識(UID)的進程。應對此需求,你可使用 -u 或 -U 選項。假設用戶「johndoe」的 UID 爲500,鍵入:

$ top -u johndoe
OR
$ top -u 500
$ top -U johndoe

結論是,你既能夠純使用用戶名,也可以使用數字 UID。「-u,-U?這二者不一樣?」是的。同多數其它 GNU 工具同樣,選項是大小寫敏感的。-U 意味着 Top 將會搜索有效的、真實的、被保存的以及文件系統的 UID 進行匹配,而 -u 僅匹配有效的用戶id。要知道,每個 *nix 進程在運行時都是用有效用戶標識(effective UID),而其中有些並不等同真實用戶標識。多數狀況是,對相似文件系統權限或操做系統功能這項的有效用戶標識感興趣的人將會檢查它,而不是 UID。 
不一樣於 -p 僅用於命令行選項,-U 和 -u 均可以在交互模式中使用。同你猜想的同樣,鍵入‘U’或‘u’能夠依據用戶名過濾進程。一樣的規則依然適用,‘u’爲有效用戶標識,‘U’爲 真實/有效/保存/文件系統用戶名。你將被要求鍵入用戶名或數字 UID。

K6F
K6F
翻譯於 2013/04/10 14:25
 頂
3
 
 

C.快熟仍是緩慢更新?

在回答這個問題以前,讓咱們先簡單介紹一下,Top 是如何運行的。這裏,Strace 可以幫助你:

$ strace -o /tmp/trace.txt top -b -n 1

使用你偏心的文本編輯器打開 /tmp/trace.txt。你怎麼想?一次調用有太多的活要作了,反正我是這麼想的。Top 在每次遍歷中必作的工做之一就是打開不少文件,並解析其內容,能夠看看次數:

$ grep open( /tmp/hasil.txt | wc -l

舉例而言,個人 Linux 中,這個數量是304.仔細觀察就會發現,Top 遍歷 /proc 文件夾,以收集進程信息。/proc 自己是一個虛擬文件系統,意味着它並不是存在於真實硬盤之中,而是由 Linux 內核憑空建立,保存在內存中的。在文件夾中,如/proc/2097(2097爲 PID),Linux 內核將與之關聯的信息打印到此文件中,而這裏就是 Top 的消息來源。

同時試一下:

$ time top -b -n 1

這樣你就能瞭解到 Top 單輪工做有多快了。在個人系統中,大約爲0.5-0.6秒。看「real」字段,不是「user」或「system」字段,由於「real」字段反應了 Top 工做須要的總時間。

K6F
K6F
翻譯於 2013/04/10 14:42
 頂
3
 
 

因此,有了這個認知以後,使用適度的更新間隔是明智的。基於文件系統訪問內存也是須要時間的。經驗法則是,對於多數用戶來講,1到3秒的間隔就足夠了。在命令行中使用-d,或在交互模式下按下「s」以設置。你可使用相似2.5,4.1這樣的小樹。

何時咱們須要快於1秒的更新?

  • 時間段內須要更多的樣本。應對這點要求,最好使用批處理模式,並將標準輸出重定向到文件中,以便更好的分析。
  • 你並不在乎 Top 消耗的額外CPU負荷。是的,雖然它很小,它依然須要負荷。若是你的 Linux 系統相對比較空閒,隨意使用短間隔,若是不是,最好爲重要的任務保留你的 CPU 時間。

一個減小 Top 工做的辦法是隻監測特定的幾個 PID。這樣,Top 無需遍歷 /proc 下全部的子文件夾。用戶名過濾呢?並不會變得更好。用戶名過濾會給Top帶來額外工做量,所以將其與短間隔聯合將會增長 CPU 負荷。

固然,當你須要強制更新時,按下 Space 鍵,Top 將會刷新統計。

K6F
K6F
翻譯於 2013/04/10 14:55
 頂
3
 
 

D.咱們須要的字段

默認時,Top 啓動後會顯示下面的任務屬性:

字段 描述
PID : 進程 ID
USER : 有效用戶 ID
PR : 動態優先值
NI : 良好值,也被稱爲基本優先級
VIRT : 任務虛擬大小。包括進程的可執行二進制文件大小,數據區大小以及全部已加載的共享庫的大小。
RES : 目前任務內存消耗。存入交換分區的部分並不包含。
SHR : 一些內存區域可能由兩個或多個任務分享,此字段反應這些共享區域。例如共享庫以及 Sysv 共享內存。
S : 任務狀態
%CPU : Top 屏幕更新時專用於運行任務的CPU 時間百分比。
%MEM : 任務當前內存消耗的百分比
TIME+ : 在任務啓動後消耗的總CPU時間。"+" sign means it is displayed with hundreth of a second granularity. 默認時,TIME/TIME+ 不會計入已經關閉的任務子進程。
COMMAND : 顯示程序名。
K6F
K6F
翻譯於 2013/04/10 15:19
 頂
3
 
 
不止這些。下面我介紹一些你可能會用到的列:
描述
nFLT ('u'鍵)

進程啓動以來重大頁面錯誤(page fault)的個數。準確地說,頁面錯誤是因爲進程訪問它的地址空間內不存在的頁面引發的。「重大」的頁面錯誤是指內核須要訪問磁盤來使得該頁面有效。相反,小型頁面錯誤是指內核只須要在內存中分配頁面而不用讀磁盤。

例如,假設程序ABC的大小爲8KB,頁面大小爲4KB。當程序讀進內存的時候,發生了兩次重大的頁面錯誤(2*4KB)。程序自己分配了8KB空間看成臨時數據。所以,還會有兩次小型頁面錯誤。

nFLT太高可能意味着:

  1. 進程從磁盤讀取大量資源。The task is aggressively load some portions of its executable or library from the disk.
  2. 進程訪問了一個已經交換到磁盤的頁面。

當進程第一次運行時,看到大量重大頁面錯誤很正常。下次運行的時候,因爲緩存已經分配好了,你極可能看到"0"次或者很小的 nFLT。可是,若是一個程序頻繁地觸發重大頁面錯誤,頗有多是你目前安裝的內存不夠那個程序使用。

nDRT ('v'鍵)

上次頁面寫入磁盤以來,髒頁面的數目。

什麼是髒頁面?先看一點背景知識。你們都知道,Linux使用了緩存系統,因此從磁盤讀取的數據也會被緩存到內存中。這樣作的優勢是,後續的對這個磁盤塊的讀操做能夠直接從內存中取數據,於是速度更快。

但這也是有代價的。若是緩衝區的內容被修改了,那麼就須要進行同步。所以,被更改的緩衝區(髒頁面)必需寫回到磁盤中。同步失敗則可能致使磁盤上的數據不一致。

在負載不重的系統中,nDRT 一般小於10(大約估計)或者爲0。若是你的系統一般大於10,則有可能:

  1. 進程正在往磁盤寫入大量數據。磁盤I/O常常跟不上緩衝區的速度。
  2. 磁盤I/O擁塞,所以即便進程修改了很小部分文件,也必需等待一段時間才能完成同步。擁塞出如今不少進程同時訪問磁盤而緩存命中率低的狀況下(譯者注:FTP服務的典型狀況)。

如今的話,(1) 不太可能出現,由於I/O速度愈來愈快,須要更少的CPU(DMA技術的出現)。因此 (2) 出現的機率更高。

注意:在 2.6.x 內核中, 不知道爲何,這個列的值老是0。

P ('j'鍵)

上次使用的CPU。這個列只在SMP環境中有意義。這裏的SMP指超線程,多核或者多CPU架構。若是你只有一個CPU(不是多核,沒有超線程),這個列老是顯示0。

在SMP系統中,即便這個列有幾回改變,也不要吃驚。這意味着,Linux 內核嘗試將你的進程移到另外一個負載更少的CPU。

CODE ('r'鍵) 和 DATA ('s'鍵)

CODE 只是反映了你程序代碼的大小,DATA反映了你數據段(棧,堆,變量,不包含共享庫) 的大小。單位都是KB。

DATA能夠顯示你的程序分配了多少內存。有時,也能夠用來協助分析內存泄漏。固然,你須要更好的工具,如使用 valgrind 來查看每次的內存分配。若是DATA不斷增加,則頗有可能出現了內存泄漏。

注意:DATA, CODE, SHR, SWAP, VIRT, RES 都是使用頁面大小(Intel架構上爲4KB)來衡量。只讀數據段也包含在CODE的大小中,於是有時候CODE比實現的段要大。

SWAP ('p'鍵)

已經進行交換的進程內存映像大小。這個列有時很讓人疑惑:

邏輯上,你可能指望這個列顯示你的程序其實是徹底進行交換,仍是部分交換了,交換了多少。可是事實上不是。即便"Swap used" 列顯示爲0,你仍然能夠很吃驚地發現全部進程的SWAP列都大於0。究竟是爲何呢?

這是因爲 top 命令使用以下的計算公式:

                VIRT = SWAP + RES or equal
                SWAP = VIRT - RES

前面說過,VIRT 包含了進程的地址空間裏面的全部東西:內存中的,已經進行交換的,還沒有從磁盤讀取的。RES 表明了進程佔用的所有內存大小。因此,這裏的SWAP表明了已經進行交換的所有數據,以及還沒有從磁盤讀取的數據。不要被SWAP這個名字迷惑了,它表明的不僅是已經交換的數據。

 

daxiaoming
daxiaoming
翻譯於 2013/04/10 20:33
 頂
3
 
 

要顯示以上的列,在交互模式下按 'f' 鍵,而後再按相應的鍵。按一下顯示指定的列,再按一下隱藏該列。要肯定當前顯示的是哪些列,只需看第一行的字母(在"Current Fields"的右邊)。大寫字母表示顯示了該列,小寫表示隱藏。你選好之後,按回車便可。

排序使用了相似的方法。按 'O' (大寫),而後再按相應的鍵。即便記不住那些按鍵也不要緊,top 會顯示出來。新的排序鍵將標上星號,相應的字母會變成大寫,很直觀。選好之後,記得按回車。

daxiaoming
daxiaoming
翻譯於 2013/04/10 20:41
 頂
3
 
 

E.多視圖比單個視圖更好嗎?

在不一樣的狀況下,有時候咱們想監視不一樣的系統屬性。例如,你想同時監控CPU的百分比和CPU被全部任務消耗的時間。在另外一段時間,你想監控常駐內存和全部任務的總頁面故障。快速按‘F’鍵而後切換界面?我想這也太不明智了吧。

爲何不試試多視圖窗口模式呢?按‘A’(大寫)切換到多窗口界面。默認的,你將會看到4個不一樣的系列的字段組。每一個字段組有默認的標籤/名稱:

第一字段組: Def

第二字段組: Job

第三字段組: Mem

第四字段組: Usr

第一字段組就是你在單一視圖窗口所常見的組,而其他的組會被隱藏。內置多視圖窗口模式,全部可用的窗口經過按‘a’或者‘w’循環。注意,切換到其餘窗口時會改變活動窗口(也稱爲當前窗口)。假如你不肯定哪個是活動窗口的話,只須要看一下top展現的第一行(在當前時間字段的左邊)。另外一個改變活動窗口的方法是經過按‘G’緊跟着輸入數字(1到4)。

活動窗口是針對用戶輸入的,所以在開始幹活以前肯定選好了你偏好的界面。而後,你能夠在單一窗口模式下愛幹嗎幹嗎。在這種狀況你通常想自定義字段展現,那麼你只須要按‘f’而後開始自定義。

假如你認爲第四字段組太多的話,你只須要切換到字段組而後按‘-’隱藏。請注意,即便你隱藏了當前的字段組,那並不以意味着你同時改變了活動組。再次按‘-’的話,當前組就可見了。

若是你想操做多視圖窗口模式,再次按‘A’鍵。那樣也將使得活動組成爲了單一視圖窗口模式的新的字段組。

開源中國駐聯合國理事
開源中國駐聯合國理事
翻譯於 2013/04/11 22:53
 頂
4
 
 

F. "個人Linux主機上怎麼會只有不多的空閒內存?"

有一樣的問題? 無論你在主板上增長多少內存,你都會很快發現空閒內存減小的很是迅速. 空閒內存算錯了? 不!

在回答這個以前, 先查看一下top命令頂部顯示的內存概要 (有可能你須要按 'm'來顯示出來). 在這裏,你能夠看到兩個區域: 緩衝(buffers)和緩存(cached)。 "緩衝(Buffers)" 表明有多少內存用來緩存磁盤塊 "緩存(Cached)" 有一點相似 "緩衝(Buffers)", 只是僅僅從文件讀取緩存頁面. 想透徹瞭解這部分,建議讀一下Linux內核的書好比Robert M.Love寫的《Linux Kernel Development》。

這足夠了解緩衝(buffers)和緩存(cached)表明系統緩存. 他們會根據linux內核機制動態增長或減小。

除去被緩存的消耗,程序和代碼一樣要佔據RAM. 因此,最終空閒內存顯示的是RAM中不被緩存和程序/代碼佔用的部分 通常來講,你也能夠考慮緩存區域爲另外一部分「空閒」RAM,若是程序須要更多內存它會減小

從進程的角度來看,你可能想知道哪一個區域表明真實的內存消耗,VIRT(virtual memory usage )區域? 固然不是! 回顧一下,這個區域表明了進程地址空間裏一切,包括相關的庫。閱讀top命令的源代碼和proc.txt (在內核代碼樹中的Documentation/filesystem 文件夾內), 個人結論是RSS字段是進程內存消耗的最好的描述.我說「最好的」是由於你能夠考慮它是近似而不是全部時間100%準確。

 

 

G.使用數個保存的配置

但願保存多個不一樣的配置文件,以便於輕鬆的切換預配置視圖?只須要建立一個 Top 二進制文件的軟鏈接到你喜歡的名字:

# ln -s /usr/bin/top /usr/bin/top-a

而後運行新的「top-a」。調整完畢後鍵入‘W’保存配置,它將被保存到 ~/.top-arc(格式爲你的 Top 別名+rc)。

這樣,運行原來的 Top 可使用以前的視圖,而 top-a 則使用第二個,依次類推。

K6F
K6F
翻譯於 2013/04/10 15:26
 頂
2
 
 

H.總結

有不少竅門使用top會更加高效。關鍵是知道你真正須要的是什麼和可能的對Linux低級別原理的通常理解。統計並不老是正確,但至少有助於整體衡量。全部這些數字收集自 /proc,所以首先確保它已掛載!

參考:

  • Understanding The Linux Kernel,第二版。
  • 內核源代碼樹裏的/filesystems/proc.txt文檔。
  • Linux 內核源代碼。
相關文章
相關標籤/搜索