1

[TOC]

综合状态

top 命令

显示进程详细信息

top [选项]

选项
    -p <pid>        只查看指定进程号的信息
    -u, -U <user>    只查看属于指定用户的进程信息
    -d <sec>        设置自动刷新延迟时间, 默认是每3秒自动刷新

    -b                批量操作模式, 常用于脚本. 一般与 -n 指定输出次数, -d 指定间隔时间
    -n                top 最大输出次数

运行界面可执行的命令
    展示数据
    1        详细展示每个逻辑cpu的使用情况.
    c        展示详细的 Command 列
    
    m        切换内存信息展示(在具体数值和百分比之间切换)
    
    E        切换内存(Mem 和 Swap行)的单位
    e        切换内存(VIRT, RES, SHR)的单位(byte, m, g, t, p)

    
    排序
    M        CPU使用从大到小
    P        内存使用从大到小
    
    交互
    s <刷新延迟>    自定义刷新延迟时间, 默认是每3秒自动刷新.
字段解释

第一行
    top - 22:39:55         up 7:07,         2 users, load average: 1.39, 1.22, 1.16
                      距本次开机已运行时长           平均负载       1分钟 5分钟  15分钟
                      
第二行(当前显示的进程数量及运行状态)
    Tasks: 202 total,        3 running,          199 sleeping,    0 stopped,    0 zombie
          当前共202个进程        有3个处于运行状态    199个处于休眠状态

第三行(cpu使用情况)
    %CPU(s): 18.3 us,                29.0 sy,            0.0 ni,     52.1 id,    0.2 wa,        0.0 hi,    0.4 si,    0.0 st
            cpu用于用户计算的比例     用于进程状态交互的比例            空闲比例    IO等待比例

第四行(内存状态)
    KiB Mem:    1361956 total,    145060 free,    689800 used,    527096 buff/cache
                总内存量         未被使用的内存    已使用的内存        用于读写缓存的内存
                
第五行(交换分区状态)
    Kib Swap:    2097148 total,    2077948 free,    19200 used.             386368 avail Mem
                交换分区大小                        已使用的交换分区        可用内存数量.

第六行
    PID    USER    PR                    NI                VIRT    RES    SHR     S      %CPU    %MEM    TIME+            COMMAND
                由内核控制(受NI影响)    进程优先级(NICE)                    状态                     进程实际运行时间
                                                            

平均负载: 衡量系统的繁忙程度
        理想状态:每个cpu上都有一个活跃进程,即平均负载数等于cpu数
        过载经验值:平均负载高于cpu数量70%的时候
        
第六行的
    RES: 常驻内存, 即虚拟内存实际映射到物理内存的大小.
    SHR: 占用的内存中属于共享内存的大小. 比如一些外部动态库仅会在内存中加载一份, 多个进程在其虚拟内存空间中这部分地址实际就映射到同一块物理内存地址. 
         也就是要计算单独某个进程占用的内存大小, 应该用 RES - SHR
          这部分可参考: https://www.orchome.com/298
          若是将共享内存占用的内存大小平摊给依赖它的进程, 此时各个进程占用内存 PSS = RES + SHR/共享进程数量
          可以安装 smem 以方便查看进程的 PSS 值.
     

    S: 进程的状态, 其可能的取值如下
            T        stopped 状态
            R        running 状态
            S        sleeping 状态

ps 命令

ps(process status)

查看当前运行的进程的一个快照

ps [选项]

常用示例
    ps -ef        
    ps -eLf        查看所有线程信息(会包括LWP和NLWP列)
    
列解释
    UID        有效用户id
    PID        进程号
    PPID    父进程号
    C
    STIME    
    TTY        执行该进程的终端. pts 是虚拟终端, tty 是字符终端(init 3).
    TIME    进程运行时间(该值不具有参考价值)
    
    LWP        轻量级进程(线程)
    NLWP
    
选项
    基本参数
    -A, -e            显示所有进程(默认只能查看到当前终端下的进程. 要理解, 进程是树形结构的.)
    -a                显示归属在终端下的所有进程
    -p <进程号>      只显示指定进程号的相关信息
    -C <进程名>          
    
    过滤
    -U <user>        # 根据创建进程的用户来筛选
    -u <user>        # 根据进程所属用户来筛选(和 -U 是有区别的)
    -C <command>    # 根据进程执行的命令(不包含参数)来精确匹配
    -L <pid>        # 查看特定进程的所有线程
    
    输出格式
    -f                # 详细输出
    -F                # 更详细输出
    -o                # 自定义字段, 可使用的字段如下
                    # pid,user,args, cmd, tty, comm, command, fname, ucmd, ucomm, lstart, bsdstart, start 等
    u                # 面向用户的字段, 包含 %CPU, %MEM 等信息
    
    排序
    --sort [-+]<item>    # + 表示从小到大排序(默认)
                        # - 表示从大到小排序
                        # 以下可以混合使用, 比如 --sort -pcpu,+pmem
                        # pcpu        按 cpu 使用排序
                        # pmem        按内容使用率排序
    
常用
    标准语法 - 查看所有进程信息
    ps -e        # 简略信息
    ps -ef        # 详细信息
    ps -eF        # 完整信息(包含内存占用等)
    ps -e u        # 面向用户的信息(包含内存占用, CPU使用等)
    
    BSD语法 - 查看所有进程信息
    ps ax        # 简略信息
    ps aux        # 完整信息
    
    显示进程的树形结构
    ps -ejH
    ps axjf

    
输出列字段
    PID        进程ID
    TTY        所在终端
    TIME    命令所占用的 CPU 处理时间
    CMD        进程所运行的命令
参考: https://blog.csdn.net/baidu_3...

sar 命令

查看系统综合状态

sar [选项] [<interval>  <count>]
            采样间隔    采样次数

示例
    sar -u 1 10
    sar -r 1 10
    sar -b 1 10
    sar -dp 1 10        # 查看所有块设备的读写情况, 每秒采样1次, 共采样10次.

选项
    文件
    -f <file>    # 从指定文件(二进制格式)获取数据来源(若未指定采样间隔, 默认是当天的统计信息)
                # -f /var/log/sysstat/sa02
                # -f /var/log/sa/sa02            # Centos 6
    -o <file>    # 指定采样间隔后, 将采样数据写入指定文件(二进制格式)
    
    时间过滤
    -s <hh:mm:ss>    # 指定天的开始时间(不包含, 因此默认需往前推10分钟)
    -e <hh:mm:ss>    # 指定天的结束时间

    资源
    -u              # 报告CPU利用率情况, 可用 ALL 参数来输出更多字段
    -q             # 报告任务队列长度和平均负载(1,5,15)
    -r             # 输出内存和交换空间的统计信息
    -b             # 总体IO
    -d             # 通常配合 -p. 报告每一个块设备的活动状态.
    
    
    显示格式
    -p             # 通常配合 -d. 打印出块设备名, 而非默认的 "device m-n" 格式.

系统默认保存最近28天的日志, 默认位置 /var/log/sa/

  • sa 二进制数据(使用 sar -f 读取数据)
  • sar 文本数据

image-20200401135833150

image-20200401135826683

sar -n DEV 输出结果说明

IFACE:LAN接口
rxpck/s:每秒钟接收的数据包
txpck/s:每秒钟发送的数据包
rxbyt/s:每秒钟接收的字节数
txbyt/s:每秒钟发送的字节数
rxcmp/s:每秒钟接收的压缩数据包
txcmp/s:每秒钟发送的压缩数据包
rxmcst/s:每秒钟接收的多播数据包
rxerr/s:每秒钟接收的坏数据包
txerr/s:每秒钟发送的坏数据包
coll/s:每秒冲突数
rxdrop/s:因为缓冲充满,每秒钟丢弃的已接收数据包数
txdrop/s:因为缓冲充满,每秒钟丢弃的已发送数据包数
txcarr/s:发送数据包时,每秒载波错误数
rxfram/s:每秒接收数据包的帧对齐错误数
rxfifo/s:接收的数据包每秒FIFO过速的错误数
txfifo/s:发送的数据包每秒FIFO过速的错误数

配置 /etc/sysconfig/sysstat

# 保存的历史文件(单位是天), 超过28天的则会分目录存放
HISTORY=28

详解

怀疑CPU存在瓶颈,可用 sar -usar -q 等来查看

怀疑内存存在瓶颈,可用 sar -Bsar -rsar -W 等来查看

怀疑I/O存在瓶颈,可用 sar -bsar -usar -d 等来查看

CPU 使用情况 -u
# sar -u

09:50:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
10:00:01 AM     all      1.56      0.00      0.75      0.04      0.00     97.65
10:10:01 AM     all     10.66      0.00      5.20      0.09      0.00     84.05
10:20:01 AM     all     55.09      0.00     25.19      0.07      0.00     19.65
10:30:01 AM     all     49.52      0.00     22.84      0.09      0.00     27.55
10:40:01 AM     all     43.41      0.00     20.48      0.11      0.00     36.00
10:50:01 AM     all     39.49      0.00     19.01      0.12      0.00     41.38
Average:        all     33.19      0.00     15.53      0.09      0.00     51.20
  • %user: 用户空间的CPU使用
  • %nice: 改变过优先级的进程的CPU使用率
  • %system: 内核空间的CPU使用率
  • %iowait: CPU等待IO的百分比
  • %steal: 虚拟机的虚拟机CPU使用的CPU
  • %idle: 空闲的CPU

情景:

  • %iowait 太高, 则表示 I/O 存在瓶颈
  • %idle 太低, 则表示 CPU 使用率高
队列长度与平均负载 -q
# sar -q

09:50:01 AM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
10:00:01 AM         5       338      0.24      0.14      0.12         0
10:10:01 AM        11       416      3.90      1.54      0.71         0
10:20:01 AM        15       473     11.36     11.03      6.26         1
10:30:01 AM         7       474      8.14      9.77      8.00         0
10:40:01 AM        12       473      6.39      7.26      7.53         0
10:50:01 AM        15       453      4.53      5.88      6.94         0
Average:           11       438      5.76      5.94      4.93         0

输出内容详解:

  • runq-sz:运行队列的长度(等待运行的进程数);
  • plist-sz:进程列表中进程(processes)和线程(threads)的数量;
  • ldavg-1:最后1分钟的系统平均负载;
  • ldavg-5:过去5分钟的系统平均负载;
  • ldavg-15:过去15分钟的系统平均负载;
  • blocked:当前阻塞的进程数量,在等待IO完成;
输出内存和交换空间 -r
# sar -r

09:50:01 AM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
10:00:01 AM   8902892  23876908     72.84      2080  12331564   7143804     21.79   7354428   7190496       224
10:10:01 AM   8496696  24283104     74.08      2080  12394360   7846800     23.94   7685000   7169248      1980
10:20:01 AM   7986260  24793540     75.64      2080  12430912   8486280     25.89   7984868   7146152      2120
10:30:01 AM   7804560  24975240     76.19      2080  12488140   8087856     24.67   7975640   7158088      1592
10:40:01 AM   7588988  25190812     76.85      2080  12588572   8190552     24.99   7976948   7214956      1388
10:50:01 AM   7534756  25245044     77.01      2080  12639652   7722896     23.56   7879740   7228132      1176
Average:      8052359  24727441     75.43      2080  12478867   7913031     24.14   7809437   7184512      1413

输出内容详解:

  • kbmemfree:这个值和free命令中的free值基本一致,所以它不包括buffercache的空间;
  • kbmemused:这个值和free命令中的used值基本一致,所以它包括buffercache的空间;
  • %memused:这个值是kbmemused和内存总量(不包括swap)的一个百分比;
  • kbbuffers:这两个值就是free命令中的buffer
  • kbcached:这两个值就是free命令中的cache
  • kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM + swap);
  • %commit:这个值是kbcommit与内存总量(包括swap)的一个百分比;
  • kbactive:活动内存量(以千字节计算)(最近使用的内存,通常不会被收回,除非绝对必要);
  • kbinact:不活动内存量(以千字节计算的内存(最近使用的内存),更有资格被用于其他目的);
  • kbdirty:以KB为单位的内存量等待写入磁盘;

pidstat 命令

磁盘 IO

建议排查顺序

  1. 查看设备总体利用率情况

    iostat -xt 1
  2. 查看是哪个进程在占用磁盘 IO

    iotop

iostat 命令

快速查看磁盘设备的当前使用繁忙程度

查看 CPU 及设备/分区的使用情况

iostat [ options ] [ <interval> [ <count> ] ]


iostat -xcdmt 1

选项
    -x: 显示扩展状态(包含 -c, -d, -k)
    -t: 显示每个报告产生时的时间
    
    -m: 以兆字节每秒为单位,而不使用块每秒
    -k: 以千字节每秒为单位,而不使用块每秒
    -c: 显示CPU使用情况
    -d: 显示设备利用率

重点关注如下指标:

标示说明
%iowaitCPU等待IO时间占用CPU总时间的百分比
Device监测设备名称
rMB/s每秒实际读取的大小,单位为KB
wMB/s每秒实际写入的大小,单位为KB
avgrq-sz需求的平均大小区段
avgqu-szIO请求的平均队列长度
awaitIO请求平均响应时间(队列排队时间+IO处理时间),一般系统 I/O 响应时间应该低于 5ms,如果大于 10ms 就比较大了
svctmIO处理时间,即寻道 + 旋转延迟时间;
%util磁盘繁忙程度。 例如,如果统计间隔 1 秒,该设备有 0.8 秒在处理 I/O,而 0.2 秒闲置,那么该设备的 %util = 0.8/1 = 80%;

iotop 命令

快速查看各个进程对于磁盘 IO 的读写情况

iotop

选项 
    -d SEC, --delay=SEC        #设置显示的间隔秒数,支持非整数值    
    -p PID, --pid=PID        #只显示指定PID的信息
    -u USER, --user=USER    #显示指定的用户的进程的信息

    -o, --only                #显示进程或者线程实际上正在做的I/O,而不是全部的,可以随时切换按o
    -a, --accumulated        #显示从iotop启动后每个线程完成了的IO总数
    
    # 非交互模式
    -b, --batch            #运行在非交互式的模式
    -t, --time            # batch模式, 在每一行前添加一个当前的时间
    -n NUM, --iter=NUM        #在非交互式模式下,设置显示的次数,

    # 比较少用的选项
    --version            #显示版本号
    -h, --help            #显示帮助信息
    -P, --processes        # 只显示进程(默认会展示所有的线程)  (建议以默认的查看所有线程的方式, 否则会有遗漏)
    -k, --kilobytes        #以千字节显示(默认是按照 human 方式)
    -q, --quiet            #suppress some lines of header (implies --batch). This option can be specified up to three times to remove header lines.
    -q     column names are only printed on the first iteration,
    -qq    column names are never printed,
    -qqq   the I/O summary is never printed.


操作按键
    a: 显示累积使用量 (--accumulated)
    o: 只显示有io的进程/线程 (--only)
    p: 进程/线程显示切换 PID/TID, 默认是 TID (--processes)    
    i:改变线程的优先级
    r:反向排序
    使用left和right改变排序
    q:退出 

网络

建议排查顺序

  1. 查看网络总体使用情况

    nload -u h eth0
  2. 查看是哪个进程占用网络

    nethogs
  3. 查看是哪个 ip:port 在占用网络

    iftop -i eth0 -nNPB

    需要根据端口号来判断.

nload 命令

查看总体带宽使用情况

nload [选项] [<device>]

说明
    不指定 <device> 时会显示所有网络设备

选项
    -t <interval>                # 刷新间隔(毫秒), 默认是 500毫秒, 设置小于100毫秒时会不精确.
    -u h|H|b|B|k|K|m|M|g|G        # 每秒的流量单位, 默认是 k.
                                # h     auto, human readable
                                # b        Bit/s                                
                                # k        kBit/s
                                # m        MBit/s
                                # g        GBit/s
                                # 大写的 bkmg 是用 Byte 为单位, 而非 Bit.
    
    -U h|H|b|B|k|K|m|M|g|G        # 累计流量单位, 默认是 M.

nethogs

按照进程统计流量

nethogs [选项] [device [device ...]]

运行时交互
    m        # 修改单位
    r         # 按流量排序
    s         # 按发送流量排序
    q         # 退出命令提示符

选项|参数
    -v <mode>    # 切换显示单位,默认是默认是KB/s(0表示 KB/s,1表示KB,2表示B,3表示MB)    
    -c            # 检测次数(后面直接跟数字)
    -a            # 检测所有的设备
    -d            # 延迟更新刷新速率,以秒为单位。默认值为 1.  
    -t            # 跟踪模式.  
    -b            # bug 狩猎模式 — — 意味着跟踪模式.  
    -V             # 显示版本信息,注意是大写字母V.  
    -p             # 混合模式(不推荐).  
    device        # 要监视的设备名称. 默认为 eth0  

iftop 命令

按照 ip:port 统计流量

iftop [选项]

选项
    网卡
    -i <网卡>      # 指定只解析网络接口

    主机名
    -n            # ip不解析成域名
    
    端口
    -P            # 显示通信双方的端口号
    -N            # 端口号不解析成服务名
    
    -B            # 使用 byte 而不是默认的 bit
    
输出结果解释
    第三列
            51Kb         40.0Kb         22.0Kb
        本机    2s             10s             40s    的平均流量
epel 源提供.

嘉兴ing
284 声望24 粉丝

PHPer@厦门