三种系统监控工具对比: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 内核源代码。
相关文章
相关标签/搜索