Linux进程(2)

pstree:display a tree of processes

   

Note:可能需要安装 psmisc

   

pstree [-p] [-s] [-u] [-a] [pid , user]

   

-p :显示进程的 PID

-s :显示指定 PID 或 USER 的父进程及子进程

-u :每当进程的uid与其父进程的uid不同时,新的uid就会在进程名后面的括号中显示

-a:显示进程的命令行

   

ps :report a snapshot of the current processes

   

ps 命令查看当前这一刻的进程信息,注意查看的是静态进程信息,要查看随时刷新的动态进程信息(如windows的进程管理器那样,

每秒刷新一次),使用top或htop命令

   

这个命令的man文档及其复杂,它同时支持3种类型的选项:GUN/BSD/UNIX,不同类型的选项其展示的信息格式不一样。

有些加了"-"的是 UNIX 风格 的选项,不加"-"的是BSD选项,加不加"-"它们的意义是不一样的,例如ps aux 和ps -aux是不同的

   

其实只需掌握少数几个选项即可,关键的是要了解ps显示出的进程信息中每一列代表什么属性

   

   

  • ps [options]

       

    -p pidlist :显示指定 pid 列表的基本信息

    --no-header

       

    • 常用组合:aux

      u :以用户为中心组织进程状态信息显示

      a :与终端相关的进程

      x :与终端无关的进程

         

      [root@xiao ~]# ps aux

      USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

         

      %CPU :该进程使用掉的 CPU 资源百分比,百分比的计算方式是"进程占用cpu时间/cpu总时间"

      %MEM :该进程所占用的物理内存百分比

      VSZ :使用掉的虚拟内存量 ( KB )

      RSS :常驻内存集 ( KB )

      TTY:表示属于哪个终端的进程,"?"表示不依赖于终端的进程

      STAT :该进程目前的状态 ( 中括号内的进程是内核进程 )

      R :running

      S :interruptable sleep

      D :uninterruptable sleep

      T :stopped

      Z :zombie

      s :表示该进程是session leader,即进程组的首进程。例如管道左边的进程,

      shell脚本中的shell进程

      + :前台进程

      l (小L):表示该进程是一个线程

      N :低优先级进程

      < :高优先级进程

      START :该进程触发启动的时间

      TIME :该进程实际使用 CPU 运行的时间

      COMMAND:表示进程的命令行。如果是内核线程,则使用方括号"[]"包围

         

    • 常用组合:-eFH ,-ef

      -e :显示所有进程,与 -A 有相同的效果

      -F :显示完整格式的进程信息,与 -f 有相同效果

      -H :以进程层级格式显示进程相关信息

         

      [root@node2 ~]# ps -ef | head

      UID PID PPID C STIME TTY TIME CMD

         

      [root@node2 ~]# ps -eFH

      UID PID PPID C SZ RSS PSR STIME TTY TIME CMD

         

      PSR:运行于哪颗CPU之上

         

    • 常用组合:-eo , axo

      -eo format

      axo format

         

      -o format :在 -o 后面指定要显示的进程信息

      %cpu (%CPU):该进程使用掉的 CPU 资源百分比,百分比的计算方式是"进程占用cpu时间/cpu总时间"

      cputime (TIME):累积CPU时间, 格式"[DD-]hh:mm:ss"

      psr (PSR):当前分配给进程的处理器

      %mem (%MEM):该进程所占用的物理内存百分比

      args (COMMAND):表示进程的命令行。如果是内核线程,则使用方括号"[]"包围

      start (STARTED):进程启动的时间

      c (C):处理器利用率。目前,这是进程生命周期内使用百分比的整数值

      class (CLS):进程的调度类

      - not reported

      TS SCHED_OTHER

      FF SCHED_FIFO

      RR SCHED_RR

      B SCHED_BATCH

      ISO SCHED_ISO

      IDL SCHED_IDLE

      DLN SCHED_DEADLINE

      ? unknown value

      f (F):与进程关联的标志

      4 :标识进程的权限为 root

      1 :此子进程仅执行 (fock) 而没有实际执行 (exec)

      0 :此子进程仅执行 (fock) 后执行 (exec)

      s (S):表示进程当前的状态

      R:当前正在运行(RUNNING)

      S:睡眠(SLEEP)

      D:不可中断

      T:停止(STOP)

      Z:僵尸进程(ZOMBIE)

      pri:优先级;范围:0~139;其中实时进程:40~139;非实时进程:0~39;值越大优先级越高

      ni:nice值,值为-20到19,影响优先级的方式是PRI(new)=PRI(old)-NI,所以NI为负数的时候,越小

      将导致进程优先级越高

      pid (PID)

      ppid (PPID)

      rtprio:表示实时优先级;范围:1~99,值越大优先级越高

      rss (RSS):常驻内存集大小 ( KB ),任务使用的非交换物理内存

      vsz (VSZ):使用掉的虚拟内存量 ( KB )

      wchan (WCHAN):进程处于睡眠状态的内核函数的名称,如果进程正在运行,用"-"表示,如果进程

      是多线程的,而ps不显示线程,用"*"表示

      user (USER)

      gid (GID)

      uid (UID)

      unit (UNIT):显示一个进程所属的单元(支持systemd)

      tty (TT)

      sz (SZ):进程的核心映像的物理页面的大小。这包括文本、数据和堆栈空间

      stat (STAT) :该进程目前的状态 ( 中括号内的进程是内核进程 )

      R :running

      S :interruptable sleep

      D :uninterruptable sleep

      T :stopped

      Z :zombie

      s :表示该进程是session leader,即进程组的首进程。例如管道左边的进程,

      shell脚本中的shell进程

      + :前台进程

      l (小L):表示该进程是一个线程

      N :低优先级进程

      < :高优先级进程

      priority:优先级;范围:-100~39;其中实时进程:-100~-1;非实时进程:0~39;值越小优先级越高

      ni:nice值,值为-20到19,影响优先级的方式是PRI(new)=PRI(old)+NI,所以NI为负数的时候,越小

      将导致进程优先级越高

         

    • 常用选项:-l

      -l (小L):仅显示当前 shell 相关的进程

         

      [root@xiao ~]# ps -l

      F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

      4 S 0 21985 21981 0 80 0 - 29143 do_wai pts/1 00:00:00 bash

      0 R 0 22773 21985 0 80 0 - 37235 - pts/1 00:00:00 ps

         

      F :表示进程旗标 (process flags),标识进程所拥有的权限 ,常见号码有:

      4 :标识进程的权限为 root

      1 :此子进程仅执行 (fock) 而没有实际执行 (exec)

      0 :此子进程仅执行 (fock) 后执行 (exec)

      S:表示进程当前的状态

      R:当前正在运行(RUNNING)

      S:睡眠(SLEEP)

      D:不可中断

      T:停止(STOP)

      Z:僵尸进程(ZOMBIE)

      UID:拥有该进程用户的用户ID

      PID:进程号

      PPID:该进程父进程的进程好

      C:该进程使用掉的 CPU 资源百分比,百分比的计算方式是"进程占用cpu时间/cpu总时间"

      PRI :该进程执行的优先级,值越小,优先级越高,越早被调度类选中运行

      范围为:-40~99 :其中非实时进程:60~99 ;实时进程:-40~59

      NI:nice 值,值为-20到19,影响优先级的方式是PRI(new)=PRI(old)+NI,所以NI为负数的时候,越小将

      导致进程优先级越高

      ADDR :kernel function,指该进程在内存的那个部分,如果是 running,一般会显示 " - "

      SZ :该进程占用的内存空间

      WCHAN :当前进程是否正在运行," - " 表示运行

      TTY:表示属于哪个终端的进程

      TIME :使用 CPU 时间,注意,此进程花费 CPU 运行进程的时间,而不是系统时间

      CMD:表示进程的命令行。如果是内核线程,则使用方括号"[]"包围

   

ps后grep问题:

   

在ps后加上grep筛选目标进程时,总会发现grep自身进程也被显示出来

   

[root@node2 1]# ps aux | grep "crond"

root 77700 0.0 0.1 126276 1020 ? Ss Nov10 0:00 /usr/sbin/crond -n

root 100534 0.0 0.0 112712 960 pts/0 R+ 22:03 0:00 grep --color=auto crond

   

先解释下为何会如此。管道是bash创建的,bash创建管道后fork两个子进程,然后两子进程各自exec加载ps程序和grep程序,

exec之后这两个子进程就称为ps进程和grep进程,所以ps和grep进程几乎可以认为是同时出现的,尽管ps进程作为管道的首

进程(进程组首进程)它是先出现的,但是在ps出现之前确实两个进程都已经fork完成了。也就是说,管道左右两端的进程是同时

被创建的(不考虑父进程创建进程消耗的那点时间),但数据传输是有先后顺序的,左边先传,右边后收

   

要将grep自身进程排除在结果之外,方法有二:

   

[root@node2 1]# ps aux | grep "crond" | grep -v "grep"

root 77700 0.0 0.1 126276 1020 ? Ss Nov10 0:00 /usr/sbin/crond -n

   

[root@node2 1]# ps aux | grep "cron[d]"

root 77700 0.0 0.1 126276 1020 ? Ss Nov10 0:00 /usr/sbin/crond -n

   

pidof :find the process ID of a running program

   

pidof [-x] program [program..]

-x :这导致程序也返回运行命名脚本的shell的进 pid

   

uptime:Tell how long the system has been running

   

使用 uptime 命令查看系统的运行时间,uptime 命令会读取 /proc/uptime 文件中的数据

[root@shy ~]# cat /proc/uptime

11420393.23 10802695.23

第一列输出的是,系统启动到现在的时间(以秒为单位),这里简记为num1;

第二列输出的是,系统空闲的时间(以秒为单位),这里简记为num2

   

Note:

很多很多人都知道第二个是系统空闲的时间,但是可能你不知道是,在SMP系统里,系统空闲的时间有时会是系统运行时间

的几倍,这是怎么回事呢?

因为系统空闲时间的计算,是把SMP算进去的,就是所你有几个逻辑的CPU(包括超线程)

   

系统的空闲率(%) = num2/(num1*N) 其中N是SMP系统中的CPU个数

   

[root@node2 1]# uptime

22:08:07 up 4 days, 9:12, 2 users, load average: 0.00, 0.02, 0.05

   

当前时间为 22:08:07,启动了 4 天9小时12分钟,当前有2个用户登陆,以及3个平均负载值

   

所谓负载率(load),即特定时间长度内,cpu运行队列中的平均进程数(包括线程),一般平均每分钟每核的进程数小于3都认为正常,

大于5时负载已经非常高。在UNIX系统中,运行队列包括cpu正在执行的进程和等待cpu的进程(即所谓的可运行runable)。

在Linux系统中,还包括不可中断睡眠态(IO等待)的进程。运行队列中每出现一个进程,load就加1,进程每退出运行队列,

Load就减1。如果是多核cpu,则还要除以核数

   

  • 例如,单核cpu上的负载值为"1.73 0.60 7.98"时,表示:

       

    最近1分钟:1.73表示平均可运行的进程数,这一分钟要一直不断地执行这1.73个进程。0.73个进程等待该核cpu

    最近5分钟:平均进程数还不足1,表示该核cpu在过去5分钟空闲了40%的时间

    最近15分钟:7.98表示平均可运行的进程数

       

    如果是多核cpu,则还要将结果除以核数。例如4核时,某个最近一分钟的负载值为3.73,则意味着有3.73个进程在运行队列中,

    这些进程可被调度至4核中的任何一个核上运行。最近1分钟的负载值为1.6,表示这一分钟内每核cpu都空闲(1-1.6/4)=60%的时间

    所以,load的理想值是正好等于CPU的核数,小于核数的时候表示cpu有空闲,超出核数的时候表示有进程在等待cpu,

    即系统资源不足

       

top :display Linux processes

   

  • top [option]

       

    -p pid……:只监视具有指定 pid的进程;可以提供一个逗号分隔的列表,其中包含最多20个 pid

    -n number :显示刷新多少次退出 top

    -d secs :指定刷新时间间隔,默认为 3 秒

    -b :以批处理模式启动top,这对于将 top 的输出发送到其他程序或文件非常有用

    -u user :只显示具有与给定匹配的用户id或用户名的进程

       

[root@node2 1]# top -b -n 1

top - 22:27:54 up 4 days, 9:32, 2 users, load average: 0.02, 0.04, 0.05

Tasks: 107 total, 1 running, 106 sleeping, 0 stopped, 0 zombie

%Cpu(s): 5.9 us, 5.9 sy, 0.0 ni, 88.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

KiB Mem : 999696 total, 422580 free, 104028 used, 473088 buff/cache

KiB Swap: 2097148 total, 2044072 free, 53076 used. 705648 avail Mem

   

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

100569 root 20 0 157672 2068 1508 R 6.2 0.2 0:00.01 top

1 root 20 0 125352 2756 1576 S 0.0 0.3 0:26.37 systemd

   

us :用户进程占用 CPU 时间(用户空间)

sy :内核进程占用 CPU 时间(内核空间)

ni :low priority user mode (nice)(用户空间中低优先级进程的cpu占用百分比)

id :CPU 内核空闲时间

wa :等待 I/O 完成的时间

hi :用于服务硬件中断的时间;servicing IRQs(不可中断睡眠,hard interruptible)

si :用于服务软件中断的时间;servicing soft IRQs(可中断睡眠,soft interruptible)

st :steal (time given to other DomU instances)(被偷走的cpu时间,一般被虚拟化软件偷走)

   

PR :该进程执行的优先级,值越小,优先级越高,越早被调度类选中运行

和 ps axo priority,rtprio 和 ps -l 相同

NI:nice 值,值为-20到19,影响优先级的方式是PRI(new)=PRI(old)+NI,所以NI为负数的时候,越小将

导致进程优先级越高

VIRT :虚拟内存集

RES :常驻内存集

SHR :共享内存集

S :进程状态

R :running

S :interruptable sleep

D :uninterruptable sleep

T :stopped

Z :zombie

s :表示该进程是session leader,即进程组的首进程。例如管道左边的进程,

shell脚本中的shell进程

+ :前台进程

l (小L):表示该进程是一个线程

N :低优先级进程

< :高优先级进程

TIME+ :进程占用的cpu的累积时间(若开启了时间累积模式,则此处显示的是累积时间)

   

  • top 的内部命令:

    P :以占据的 CPU 百分比排序

    M :以占据的内存百分比排序

    N:以PID 来排序

    T :以累积占据 CPU 时长排序

    r :给予某个 PID 重新定制一个 nice 值

    l(小 L) :隐藏或显示 top 第一行的信息,系统运行时间,几个用户登录,CPU 1 ,5,15 分钟的使用情况

    t :改变 task 及 CPU 信息显示格式

    1 :CPU 分别显示,将多颗cpu 或多核 cup 分别显示

    m :改变 memory 信息显示格式

    q :退出 top

    d | s :修改刷新时间间隔

    k :终止指定的进程

    c:表示是否要展开进程的命令行

    x,y:x高亮排序的列,y表示高亮running进程

    u:仅显示指定用户的进程

    n:设置要显示最大的进程数量

    ?| h

    E :切换 内存 容量的单位

    H:表示是否要显示线程,默认不显示

    S:表示显示的cpu时间是否是累积模式,cpu累积模式下已死去的子进程cpu时间会累积到父进程中

       

htop :interactive process viewer

   

需要安装,EPEL 中有此命令的程序

   

  • htop [-dut]

       

    -p pid……:只监视具有指定 pid的进程;可以提供一个逗号分隔的列表,其中包含最多20个 pid

    -t :以树状图的形式显示进程

    -u USER :仅显示属于给定用户的进程

    -d DELAY:指定刷新时间间隔

       

  • htop 内部命令:

    Space :标记或取消标记进程。可以在多个进程上操作的命令,比如"kill"

    U:取消所有进程的标记(删除所有用空格键添加的标记)

    P :以占据的 CPU 百分比排序

    M :以占据的内存百分比排序

    T :以累积占据 CPU 时长排序

    PgUp, PgDn:向上或向下滚动一个窗口的进程列表

    Home:滚动到流程列表的顶部并选择第一个流程

    end:滚动到流程列表的底部并选择最后一个流程

    Numbers :输入 PID,选中的高亮显示将被移动到它

    Ctrl + L :刷新:重新绘制屏幕和重新计算值

    p :显示进程的完整路径

    s :跟踪进程系统调用:如果安装了strace,按下此键将把它附加到当前选择的进程,显示进程发出的系统

    调用的实时更新

    l(下 L):显示进程打开的文件:如果安装了lsof,按下此键将显示进程打开的文件描述符列表

       

    F3, /:递增地搜索所有显示进程的命令行

    F4, :增量进程过滤:在进程命令行中键入部分内容,只显示名称匹配的进程

    F5, t:树形视图:通过父母关系组织过程,并将它们之间的关系布置成树形;选择排序视图将退出树视图

    F6:在已排序视图中,选择用于排序的字段,也可以通过 '<' 和 '>' 进行访问。当前排序字段由标题中的高亮

    显示指示。在树视图中,展开或折叠当前子树。树节点中的"+"指示符表示它已折叠

    F7, ]:增加所选进程的优先级(减少 'nice'值)。这只能由超级用户来完成

    F8, [:降低所选进程的优先级(增加"nice"值)

    F9, k:"kill"进程:将在菜单中选择的信号发送给一个或一组进程。如果进程被标记,则向所有标记的进程

    发送信号。如果没有标记,则发送到当前选择的进程

    F10, q:退出 htop

       

    I:逆向排序

    +, - :在树视图模式下,展开或折叠子树。当一个子树被折叠时,一个"+"符号显示在进程名的左边

    a :设置CPU关联性:标记一个进程可以使用哪个CPU

    u:只显示指定用户拥有的进程

    F:"跟随"进程:如果排序顺序导致当前选择的进程在列表中移动,则使选择栏跟随它

    K:隐藏内核线程:防止属于内核的线程显示在进程列表中

    H:隐藏用户线程

    Arrows:上下选择进程行

    F1 ,h ,?:显示帮助信息

   

分析系统负载(system load average):

   

根据前文uptime中对系统负载(system load)的描述,分析一下这个top的结果

   

   

上图中,系统负载非常之高,最近一分钟的负载量高达383.19,这表示这一分钟有383.19个进程正在运行或等待调度,如果是单核

CPU,表示这一分钟要毫不停留地执行这么多进程,如果是8核CPU,表示这一分钟内平均每核心CPU要执行大概50个进程

   

从load average上看,确实是非常繁忙的场景。但是看CPU的idle值为98.8,说明CPU非常闲。为什么系统负载如此高,

CPU却如此闲?

   

前面解释system load average的时候,已经说明过可运行的(就绪态,即就绪队列的长度)、正在运行的(运行态)和不可中断睡眠

(如IO等待)的进程任务都会计算到负载中。现在负载高、CPU空闲,说明当前正在执行的任务基本不消耗CPU资源,大量的负载

进程都在IO等待中

   

可以从ps的进程状态中获取哪些进程是正在运行或运行队列中的(状态为R),哪些进程是在不可中断睡眠中的(状态为D)

   

[root@node2 ~]# ps -eo stat,pid,ppid,comm --no-header |grep -E "^(D|R)"

R 9 2 rcu_sched

Rsl 662 1 vmtoolsd

R+ 101157 100877 ps

   

vmstat:Report virtual memory statistics

   

Note:vmstat 是从 /proc/vmstat 文件中提取的信息

   

vmstat [options] [delay [count]]

   

-s :显示各种事件计数器和内存统计信息的表

-f:统计自开机起fork的次数。包括fork、clone、vfork的次数。但不包括exec次数

-d:显示磁盘统计信息

-S character:1000 (k), 1024 (K), 1000000 (m), or 1048576 (M) bytes

   

delay:刷新时间间隔,若不指定,则只统计一次信息就退出vmstat

count:总共要统计的次数

   

[root@node2 ~]# vmstat

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----

r b swpd free buff cache si so bi bo in cs us sy id wa st

2 0 53076 399964 680 493560 0 0 26 8 101 46 0 0 100 0 0

   

procs:

r: 等待队列中的进程数

b: 不可中断睡眠的进程数

   

memory:

swpd: 虚拟内存使用总量

free: 空闲内存量

buff: buffer占用的内存量(buffer用于缓冲)

cache: cache占用的内存量(cache用于缓存)

   

swap:

si:从内存加载到swap分区的数据流量,单位为"kb/s"

so: 从swap分区写到内存的数据流量,单位为"kb/s"

   

io:

bi: 从块设备读取到数据的速率,单位为blocks/s

bo: 写数据到块设备的速率,单位为blocks/s

   

System:

in: 每秒中断数,包括时钟中断数量

cs: 每秒上下文切换次数

   

CPU:统计的是cpu时间百分比,具体信息和top的cpu统计列一样

us :用户进程占用 CPU 时间(用户空间)

sy :内核进程占用 CPU 时间(内核空间)

id :CPU 内核空闲时间

wa :等待 I/O 完成的时间

st :steal (time given to other DomU instances)(被偷走的cpu时间,一般被虚拟化软件偷走)

   

[root@node2 ~]# vmstat -d

disk- ------------reads------------ ------------writes----------- -----IO------

total merged sectors ms total merged sectors ms cur sec

sda 36566 2620 4430686 764940 66105 41780 6092197 534416 0 505

sr0 79225 0 15665252 234960 0 0 0 0 0 165

dm-0 33979 0 4383391 752477 73328 0 5807531 705149 0 482

dm-1 3075 0 28304 93538 34171 0 273368 5601228 0 19

dm-2 110 0 2419 317 337 0 6822 8136 0 4

   

reads :

total : 成功读取的总大小

merged : 分组读取的次数( 即一次 I/O )

sectors : 成功读取的扇区数

ms : 读取消耗的时间

Writes

total : 成功写入磁盘的总大小

merged : 分组写入磁盘的次数 ( 即一次 I/O )

sectors : 成功写入扇区的数量

ms : 写入磁盘消耗的时间

IO:

cur:正在进行的 I/O

sec:I/O 花费的秒数

   

iostat:Report Central Processing Unit (CPU) statistics and input/output statistics for devices and partitions.

   

Note:可能需要安装 sysstat

   

iostat主要统计磁盘或分区的整体使用情况。也可以输出cpu信息,甚至是NFS网络文件系统的信息。同vmstat/sar一样,

第一次统计的都是自系统开机起的平均统计信息

   

iostat [ -c ] [ -d ] [ -n -h ][ -k | -m ] [ -p [device][,...] ] [ interval [ count ] ]

   

-c:统计cpu信息

-d:统计磁盘信息

-n:统计NFS文件系统信息

-h:使NFS统计信息更人类可读化

-k:指定以kb/s为单位显示

-m:指定以mb/s为单位显示

-p:指定要统计的设备名称

-y:指定不显示第一次统计信息,即不显示自开机起的统计信息。

interval:刷新时间间隔

count:总统计次数

   

[root@node2 ~]# iostat

Linux 3.10.0-693.el7.x86_64 (node2.song.com)         11/12/2019         _x86_64_        (1 CPU)

   

avg-cpu: %user %nice %system %iowait %steal %idle

0.14 0.00 0.25 0.08 0.00 99.53

   

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn

sda 0.26 5.67 7.77 2215231 3039144

scd0 0.20 20.04 0.00 7832626 0

dm-0 0.27 5.61 7.41 2191583 2896811

dm-1 0.10 0.04 0.35 14152 136684

dm-2 0.00 0.00 0.01 1209 3411

   

avg-cpu:

%user:CPU处在用户模式下的时间百分比

%nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比

%system:CPU处在系统模式下的时间百分比

%iowait:CPU等待输入输出完成时间的百分比

%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比

%idle:CPU空闲时间百分比

   

tps:每秒transfer速率(transfers per second),一次对物理设备的IO请求为一个transfer,但多个逻辑请求可能只

组成一个transfer

Blk_read/s:每秒读取的block数量

Blk_wrtn/s:每秒写入的block总数

Blk_read:读取的总block数量

Blk_wrtn:写入的总block数量

   

sar:Collect, report, or save system activity information

   

Note:可能需要安装 sysstat

   

sar是一个非常强大的性能分析工具,它可以获取系统的cpu/等待队列/磁盘IO/内存/网络等性能指标

   

功能多的必然结果是选项多,应用复杂,但只要知道一些常用的选项足以

   

sar [options] [-o filename] [delay [count] ]

   

-A:显示系统所有资源运行状况

-B:查看内存分页信息

-b:显示磁盘IO和tranfer速率信息,和iostat的信息一样,是总体IO统计信息

-d:显示磁盘在刷新时间间隔内的活跃情况,可以指定一个或多个设备,和-b不同的是,它显示的是单设备的IO、transfer

信息;建议配合-p使用显示友好的设备名,否则默认显示带主次设备号的设备名

-P:显示指定的某颗或某几颗cpu的使用情况。指定方式为,-P 0,1,2,3或ALL

-u:显示每颗cpu整体平均使用情况。-u和-P的区别通过下面的示例很容易区分

-r:显示内存在刷新时间间隔内的使用情况

-n:显示网络运行状态。后可接DEV/NFS/NFSD/ALL等多种参数

:DEV表示显示网路接口信息,NFS和NFSD分别表示显示NFS客户端和服务端的流量信息,ALL表示显示所有信息

-q:显示等待队列大小

-o filename:将结果存入到文件中

delay:状态刷新时间间隔

count:总共刷新几次

   

统计网络流量:

   

/proc/net/dev 文件保存了网络流量的数据信息

   

  • 第一种方法是查看 /proc/net/dev:

       

[root@node2 ~]# cat /proc/net/dev

Inter-| Receive | Transmit

face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed

ens37: 296178912 425890 0 6 0 0 0 0 36129103 178334 0 0 0 0 0 0

lo: 116280 1396 0 0 0 0 0 0 116280 1396 0 0 0 0 0 0

ens33: 2200550 27661 0 6 0 0 0 0 0 0 0 0 0 0 0 0

   

关注列:receive和transmit分别表示收包和发包,关注每个网卡的bytes即可获得网卡的情况。写一个脚本计算每秒的差值即为网络流量

   

  • 第二种方法是使用 sar -n DEV :

       

[root@node2 ~]# sar -n DEV

Linux 3.10.0-693.el7.x86_64 (node2.song.com)         11/12/2019         _x86_64_        (1 CPU)

   

02:50:02 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s

03:00:01 PM ens37 0.38 0.11 0.03 0.02 0.00 0.00 0.00

03:00:01 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00

03:00:01 PM ens33 0.02 0.00 0.00 0.00 0.00 0.00 0.00

Average: ens37 0.38 0.11 0.03 0.02 0.00 0.00 0.00

Average: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00

Average: ens33 0.02 0.00 0.00 0.00 0.00 0.00 0.00

   

rxpck/s:每秒收到的包数量

txpck/s:每秒发送的包数量

rxkB/s:每秒收到的数据,单位为kb

txkB/s:每秒发送的数据,单位为kb

rxcmp/s:每秒收到的压缩后的包数量

txcmp/s:每秒发送的压缩后的包数量

rxmcst/s:每秒收到的多播包数量

   

内存和交换空间监控:

   

可以直接查看 /proc/meminfo 文件,获取内存和交换空间的数据

   

[root@node2 ~]# sar -r 3 2

Linux 3.10.0-693.el7.x86_64 (node2.song.com)         11/12/2019         _x86_64_        (1 CPU)

   

03:22:36 PM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty

03:22:39 PM 393000 606696 60.69 680 421684 285648 9.22 293328 156936 0

03:22:42 PM 393000 606696 60.69 680 421684 285648 9.22 293328 156936 0

Average: 393000 606696 60.69 680 421684 285648 9.22 293328 156936 0

   

kbmemfree:这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间

kbmemused:这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间

%memused:这个值是kbmemused和内存总量(不包括swap)的一个百分比

kbbuffers和kbcached:这两个值就是free命令中的buffer和cache

kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap)

%commit:这个值是kbcommit与内存总量(包括swap)的一个百分比

kbdirty:表示内存中脏页的大小,即内存中还有多少应该刷新到磁盘的数据

   

内存分页监控:

   

[root@node2 ~]# sar -B 3 2

Linux 3.10.0-693.el7.x86_64 (node2.song.com)         11/12/2019         _x86_64_        (1 CPU)

   

03:26:25 PM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff

03:26:28 PM 0.00 0.00 23.83 0.00 10.74 0.00 0.00 0.00 0.00

03:26:31 PM 0.00 0.00 9.06 0.00 8.72 0.00 0.00 0.00 0.00

Average: 0.00 0.00 16.44 0.00 9.73 0.00 0.00 0.00 0.00

   

pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB)

pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB)

fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)

majflt/s:每秒钟产生的主缺页数

pgfree/s:每秒被放入空闲队列中的页个数

pgscank/s:每秒被kswapd扫描的页个数

pgscand/s:每秒直接被扫描的页个数

pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数

%vmeff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比

   

进程队列长度和平均负载状态监控:

   

[root@node2 ~]# sar -q 3 2

Linux 3.10.0-693.el7.x86_64 (node2.song.com)         11/12/2019         _x86_64_        (1 CPU)

   

03:27:53 PM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked

03:27:56 PM 2 126 0.00 0.01 0.05 0

03:27:59 PM 2 126 0.00 0.01 0.05 0

Average: 2 126 0.00 0.01 0.05 0

   

runq-sz:等待队列的长度,不包括正在运行的进程

plist-sz:任务列表中的进程数量,即总任务数

ldavg-N:过去1分钟、5分钟、15分钟内系统的平均哎

blocked:当前因为IO等待被阻塞的任务数量

   

I/O和传送速率监控:

   

[root@node2 ~]# sar -b 3 2

Linux 3.10.0-693.el7.x86_64 (node2.song.com)         11/12/2019         _x86_64_        (1 CPU)

   

03:28:51 PM tps rtps wtps bread/s bwrtn/s

03:28:54 PM 0.00 0.00 0.00 0.00 0.00

03:28:57 PM 0.00 0.00 0.00 0.00 0.00

Average: 0.00 0.00 0.00 0.00 0.00

   

tps:每秒钟物理设备的 I/O 传输总量

rtps:每秒钟从物理设备读入的数据总量

wtps:每秒钟向物理设备写入的数据总量

bread/s:每秒钟从物理设备读入的数据量,单位为 块/s

bwrtn/s:每秒钟向物理设备写入的数据量,单位为 块/s

   

系统交换活动信息监控:

   

[root@node2 ~]# sar -W 3 2

Linux 3.10.0-693.el7.x86_64 (node2.song.com)         11/12/2019         _x86_64_        (1 CPU)

   

03:29:54 PM pswpin/s pswpout/s

03:29:57 PM 0.00 0.00

03:30:00 PM 0.00 0.00

Average: 0.00 0.00

   

pswpin/s:每秒系统换入的交换页面(swap page)数量

pswpout/s:每秒系统换出的交换页面(swap page)数量

   

设备使用情况监控:

   

[root@node2 ~]# sar -d 3 1 -p

Linux 3.10.0-693.el7.x86_64 (node2.song.com)         11/12/2019         _x86_64_        (1 CPU)

   

03:33:58 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util

03:34:01 PM sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

03:34:01 PM sr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

03:34:01 PM centos-root 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

03:34:01 PM centos-swap 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

03:34:01 PM centos-home 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

   

Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util

Average: sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

Average: sr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

Average: centos-root 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

Average: centos-swap 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

Average: centos-home 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

   

tps:transfer per second,每秒的transfer速率,一次物理IO请求算一次transfer,但多次逻辑IO请求可能组合起来才算

一次transfer

rd_sec/s:每秒读取的扇区数,扇区大小为512字节

wr_sec/s:每秒写入的扇区数

avgrq-sz:请求写入设备的平均大小,单位为扇区。(The average size (in sectors) of the requests that were issued to

the device)

avgqu-sz:请求写入设备的平均队列长度。(The average queue length of the requests that were issued to the device.)

await:写入设备的IO请求的平均(消耗)时间,单位微秒(The average time for I/O requests issued to the device

to be served.)

svctm:不可信的列,该列未来将被移除,所以不用管

%util:最重要的一列,显示的是设备的带宽情况。该列若接近100%,说明磁盘速率饱和了

   

dstat:用于生成系统资源统计的工具

   

Note:可能需要安装 dstat

   

dstat [-afv] [options..] [delay [count]]

   

-c :启用cpu统计信息(系统、用户、空闲、等待、硬件中断、软件中断)

-C 0,3,total

-d :启用磁盘状态(读、写)

-D :total,sda1

-g :启用页面状态(page in,page out)

-i :启用中断数据

-I 5,10(大 i )

-l (小 L):启用负载平均状态

-m :启用内存统计(使用、缓冲区、缓存、空闲)

-n :启用网络统计信息(接收、发送)

-N eth1,total

-p :启用进程状态(可运行、不可中断、新建)

-r :启用I/O请求统计(读、写请求)

-s :启用交换状态(已使用,空闲)

-S swap1,total

-y :启用系统状态(中断、上下文切换)

--aio :启用aio stats(异步I/O)

--fs :启用文件系统统计信息(打开文件、inode)

--ipc :启用ipc统计信息(消息队列、信号量、共享内存)

--lock :启用文件锁定状态(posix、flock、read、write)

--tcp , --udp , --unix , --raw , --socket

--top-io :显示最占用 io 的进程

--top-cpu :显示最占用 cpu 的进程

--top-mem :显示最占用 memory 的进程

--top-lantency :显示延迟最大的进程

   

glances :一个跨平台的基于 curses 的系统监控工具

   

Note:可能需要安装 glances

   

glances [OPTIONS]

   

-C CONF_FILE, --config CONF_FILE:指定配置文件

-b:以Byte为单位显示网上数据速率

-d :启用调试模式 ( 日志文件为 /tmp/glances.log )

-t TIME :设置刷新的时间 ( 默认为 3 秒 )

--hide-kernel-threads :在进程列表中隐藏内核线程

--tree :进程以数的形式显示

--fs-free-space:显示系统空闲空间而不是已使用空间

--process-short-name:强制进程使用短名称

-f PROCESS_FILTER, --process-filter PROCESS_FILTER:设置进程模式匹配(正则表达式)

-q, --quiet

--enable-history:启动 history 模式(需要 python-matplotlib 库)

   

服务器端

-s :在服务器模式下运行 glances

-B BIND_ADDRESS :将服务器绑定到给定的 IPv4/IPv6 地址或主机名

--password :定义 client/server 密码

-p PORT, --port PORT : 定义 client/server TCP 端口 [默认为: 61208]

   

客户端

-c IPADDR:客户端模式运行 glances

--password :输入 client/server 密码

-p PORT, --port PORT : 指定 client/server TCP 端口 [默认为: 61208]

   

web端

-w, --webserver:run Glances in web server mode (依赖 python2-bottle)

-B BIND_ADDRESS :将服务器绑定到给定的 IPv4/IPv6 地址或主机名

--password :输入 client/server 密码

-p PORT, --port PORT : 指定 client/server TCP 端口 [默认为: 61208]

   

glances 内部操作命令:

   

ENTER: Edit the process filter pattern

   

c:根据CPU使用率对进程进行排序

i:按照进程的 I/O 速率排序

m:依据进程对内存的使用率排序

p:按照进程名称排序

u :按照 USER 排序进程

t:按进程使用CPU时间排序 (TIME+)

a:进程列表自动排序

   

1:在全局CPU和每个CPU状态之间切换

g:生成当前历史记录的图表

   

b:网络I/O在bit/s或Byte/s之间进行切换

d:显示或隐藏磁盘 I/O 状态

f:显示或隐藏文件系统状态

F:在使用的文件系统和空闲空间之间进行切换

h

l(小L):显示或隐藏日志信息

n:显示或隐藏网络状态

q

r:重置历史

U:查看累计网络I/O

w:删除已完成的警告日志消息

x:删除已完成的警告和关键日志消息

0:Task的cpu使用量将除以cpu的总数

/:Switch between short name/command line (processes name)

   

pmap:report memory map of a process

   

pmap [options] pid [...]

   

-x:显示详细格式的信息

   

另一种查看方式:cat /proc/PID/maps

   

   

   

   

   

原文地址:https://www.cnblogs.com/xiaosongblog/p/13681638.html