• CPU 实用工具


    系统版本:CentOS 7.4

    top

    17:49:04       // 当前时间
    up 3:55       // 系统运行时间,格式为时:分
    2 users        // 当前登录用户数
    load average   // 三个值分别为 1分钟,5分钟,15分钟内的系统负载,当这个值超过 CPU 可执行单元的数目,表示 CPU 的性能已成为瓶颈。
    
    Tasks       // 进程总数
    running     // 正在运行的进程数,包括正在 CPU 上运行的和将要被调度运行的
    sleeping    // 睡眠的进程数, 通常是等待事件(比如 IO 操作)完成的任务,细分可以包括 interruptible 和 uninterruptible 的类型;
    stopped     // 停止的进程数
    zombie      // 僵尸进程数
    
    us     // 用户空间占用 CPU 百分比
    sy     // 内核空间占用 CPU 百分比,操作系统通过系统调用(system call)从用户态陷入内核态,以执行特定的服务;但是当服务器执行的 IO 比较
              密集的时候,该值会比较大
    ni     // 用户进程空间内改变过优先级的进程占用CPU百分比
    id     // 空闲CPU百分比
    wa     // 等待 IO  输入输出的CPU时间百分比
    hi     // 硬中断占用百分比
    si     // 软中断占用百分比
    st     // 虚拟机占用百分比
    
    PID         // 每个进程的 ID
    USER        // 每个进程所有者的用户名
    PR          // 每个进程的优先级别
    NI          // 该进程的优先级值
    VIRT        // 进程需要的虚拟内存大小,包括进程使用的库,代码,数据等
    RES         // 该进程占用的物理内存的总数量,单位是 KB
    SHR         // 该进程使用共享内存的数量
    S           // 进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止, Z=僵尸进程)
    %CPU        // 该进程自最近一次刷新一来所占用的CPU时间和总时间的百分比
    %MEM        // 该进程占用的物理内存占总内存的百分比
    TIME+       // 该进程自启动以来所占用的总 CPU 时间。
    COMMAND     // 该进程的命令名称。
    
    S 列(也就是 Status 列)表示进程的状态。
    R 是 Running 或 Runnable 的缩写,表示进程在 CPU 的就绪队列中,正在运行或者正在等待运行。
    D 是 Disk Sleep 的缩写,也就是不可中断状态睡眠(Uninterruptible Sleep),一般表示进程正在跟硬件交互,并且交互过程不允许被其他进程或中断打断。
    Z 是 Zombie 的缩写,它表示僵尸进程,也就是进程实际上已经结束了,但是父进程还没有回收它的资源(比如进程的描述符、PID 等)。
    S 是 Interruptible Sleep 的缩写,也就是可中断状态睡眠,表示进程因为等待某个事件而被系统挂起。当进程等待的事件发生时,它会被唤醒并进入 R 状态。
    I 是 Idle 的缩写,也就是空闲状态,用在不可中断睡眠的内核线程上。前面说了,硬件交互导致的不可中断进程用 D 表示,但对某些内核线程来说,它们有可能实际上并没有任何负载,用 Idle 正是为了 
      区分这种情况。要注意,D 状态的进程会导致平均负载升高, I 状态的进程却不会。
    T 或者 t,也就是 Stopped 或 Traced 的缩写,表示进程处于暂停或者跟踪状态。向一个进程发送 SIGSTOP 信号,它就会因响应这个信号变成暂停状态(Stopped);再向它发送 SIGCONT 信号,进程又 
      会恢复运行。
    X 是 Dead 的缩写,表示进程已经消亡,所以你不会在 top 或者 ps 命令中看到它。
    s 表示这个进程是一个会话的领导进程,会话是指共享同一个控制终端的一个或多个进程组。
    + 表示前台进程组。进程组表示一组相互关联的进程,比如每个子进程都是父进程所在组的成员
    
    比如,我们通过 SSH 登录服务器,就会打开一个控制终端(TTY),这个控制终端就对应一个会话。而我们在终端中运行的命令以及它们的子进程,就构成了一个个的进程组,其中,在后台运行的命令,构成后台进程组;在前台运行的命令,构成前台进程组。
    

    CPU 占用率高很多情况下意味着一些东西,这也给服务器 CPU 使用率过高情况下指明了相应地排查思路:

    当 user 占用率过高的时候,通常是某些个别的进程占用了大量的 CPU,这时候很容易通过 top 找到该程序;此时如果怀疑程序异常,可以通过 perf 等思路找出热点调用函数来进一步排查;
    
    当 system 占用率过高的时候,如果 IO 操作(包括终端 IO)比较多,可能会造成这部分的 CPU 占用率高,比如在 file server、database server 等类型的服务器上,否则(比如>20%)很可能有些部分的内核、驱动模块有问题;
    
    当 nice 占用率过高的时候,通常是有意行为,当进程的发起者知道某些进程占用较高的 CPU,会设置其 nice 值确保不会淹没其他进程对 CPU 的使用请求;
    
    当 iowait 占用率过高的时候,通常意味着某些程序的 IO 操作效率很低,或者 IO 对应设备的性能很低以至于读写操作需要很长的时间来完成;
    
    当 irq/softirq 占用率过高的时候,很可能某些外设出现问题,导致产生大量的irq请求,这时候通过检查 /proc/interrupts 文件来深究问题所在;
    
    当 steal 占用率过高的时候,黑心厂商虚拟机超售了!
    

    uptime

    14:01:02         //系统当前时间
    up 3 days, 7 min //主机已运行时间
    2 users          //当前登录用户数
    load average: 0.00, 0.01, 0.05  //三个值分别为 1分钟,5分钟,15分钟内的系统平均负载
    注意:平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和 CPU 使用率并没有直接关系。
    

    vmstat

    (Procs) r      // 运行队列中进程数量
    (Procs) b      // 等待 IO 的进程数量
    (Memory) swpd  // 使用虚拟内存大小
    (Memory) free  // 可用内存大小
    (Memory) buff  // 用作缓冲的内存大小
    (Memory) cache // 用作缓存的内存大小
    (Swap) si      // 每秒从交换区写到内存的大小
    (Swap) so      // 每秒写入交换区的内存大小
    (IO) bi        // 每秒读取的块数
    (IO) bo        // 每秒写入的块数
    (System) in    // 每秒中断数,包括时钟中断
    (System) cs    // 每秒上下文切换数
    (CPU) us       // 用户进程执行时间 (user time)
    (CPU) sy       // 系统进程执行时间 (system time)
    (CPU) id       // 空闲时间(包括 IO 等待时间)
    (CPU) wa       // 等待IO时间
    


    指令介绍

    -a :显示活跃和非活跃内存
    -f :显示从系统启动至今的fork数量。
    -m :显示slabinfo
    -n :只在开始时显示一次各字段名称。
    -s∶显示内存相关统计信息及多种系统活动数。
    delay :刷新时间间隔。如果不指定,只显示—条结果。
    count :刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。
    -d:显示磁盘相关统计信息。
    -p∶显示指定磁盘分区统计信息
    -S︰使用指定单位显示。参数有k ,K, m,M,分别代表1000,1024,1000000,1048576字节。默认单位为K ( 1024 bytes )
    -V :显示vmstat版本信息。
    

    安装 sysstat-12.0.1

    yum install gcc gcc-c++ wget -y
    wget http://sebastien.godard.pagesperso-orange.fr/sysstat-12.0.1.tar.gz
    tar zxvf sysstat-12.0.1.tar.gz
    cd sysstat-12.0.1
    ./configure 
    make && make install
    

    mpstat

    %user      // 表示处理用户进程所使用CPU的百分比。注意,它不包括下面的 nice 时间,但包括了 guest 时间。
    %nice      // 代表低优先级用户态 CPU 时间,也就是进程的 nice 值被调整为 1-19 之间时的 CPU 时间。这里注意,nice 可取值范围是 -20 到 19,数值越大,优先级反而越低。
    %sys       // 表示内核进程使用的CPU百分比;
    %iowait    // 表示等待进行I/O所使用的CPU时间百分比;
    %irq       // 代表处理硬中断的 CPU 时间。
    %soft      // 表示用于软件中断的CPU百分比;
    %idle      // 显示CPU的空闲时间;注意,它不包括等待 I/O 的时间(iowait)
    steal      //(通常缩写为 st),代表当系统运行在虚拟机中的时候,被其他虚拟机占用的 CPU 时间。
    guest      //(通常缩写为 guest),代表通过虚拟化运行其他操作系统的时间,也就是运行虚拟机的 CPU 时间。
    guest_nice //(通常缩写为 gnice),代表以低优先级运行虚拟机的时间。
    
    
    # 显示所有CPU的指标,并在间隔5秒输出一组数据
    $ mpstat -P ALL 5 1
    Linux 4.15.0 (ubuntu)     09/22/18     _x86_64_    (2 CPU)
    13:41:28     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
    13:41:33     all    0.21    0.00   12.07   32.67    0.00    0.21    0.00    0.00    0.00   54.84
    13:41:33       0    0.43    0.00   23.87   67.53    0.00    0.43    0.00    0.00    0.00    7.74
    13:41:33       1    0.00    0.00    0.81    0.20    0.00    0.00    0.00    0.00    0.00   98.99
    

    sar

    %user   // 显示在用户级别(application)运行使用CPU总时间的百分比。
    %nice   // 代表低优先级用户态 CPU 时间,也就是进程的 nice 值被调整为 1-19 之间时的 CPU 时间。这里注意,nice 可取值范围是 -20 到 19,数值越大,优先级反而越低。
    %system // 在核心级别(kernel) 运行所使用CPU总时间的百分比。
    %iowait // 显示用于等待I/O操作占用CPU总时间的百分比。
    %steal  // 管理程序(hypervisor)为另一虚拟进程提供服务而等待虚拟CPU的百分比。
    %idle   // 显示CPU空闲时间占用CPU总时间的百分比。
    
    1.若 %iowait 的值过高,表示硬盘存在I/O瓶颈
    2.若 %idle 高但是系统响应慢时,可能是CPU等待分配内存,此时应加大内存容量
    3.若 %idle 的值持续低于1,则系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。
    
    如果要查看二进制文件 test 中的内容,需键入如下sar命令:
    sar -u -f test
    -u : 输出cpu使用情况和统计信息
    -f : 从制定的文件读取报告
    

    pidstat

    用法:

    pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]
    
    常用的参数:
    -u:默认的参数,显示各个进程的cpu使用统计
    -r:显示各个进程的内存使用统计
    -d:显示各个进程的IO使用情况
    -p:指定进程号
    -w:显示每个进程的上下文切换情况
    -t:显示选择任务的线程的统计信息外的额外信息
    -T { TASK | CHILD | ALL }
    这个选项指定了pidstat监控的。TASK表示报告独立的task,CHILD关键字表示报告进程下所有线程统计信息。ALL表示报告独立的task和task下面的所有线程。
    注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。
    -V:版本号
    -h:在一行上显示了所有活动,这样其他程序可以容易解析。
    -I:在SMP环境,表示任务的CPU使用率/内核数量
    -l:显示命令名和所有参数
    

    cpu使用情况统计(-u)

    PID     // 进程ID
    %usr    // 进程在用户空间占用cpu的百分比
    %system // 进程在内核空间占用cpu的百分比
    %guest  // 进程在虚拟机占用cpu的百分比
    %CPU    // 进程占用cpu的百分比
    CPU     // 处理进程的cpu编号
    Command // 当前进程对应的命令
    

    UID     // 执行进程的 UID
    PID     // 进程ID
    %usr    // 进程在用户空间占用cpu的百分比
    %system // 进程在内核空间占用cpu的百分比
    %guest  // 进程在虚拟机占用cpu的百分比
    %CPU    // 进程占用cpu的百分比
    CPU     // 处理进程的cpu编号
    Command // 当前进程对应的命令
    

    显示各个进程的IO使用情况(-d)

    PID: 进程id
    kB_rd/s: 每秒从磁盘读取的KB
    kB_wr/s: 每秒写入磁盘KB
    kB_ccwr/s: 任务取消的写入磁盘的KB。当任务截断脏的pagecache的时候会发生。
    COMMAND: task的命令名
    

    显示各个进程的上下文切换情况(-w)

    # 每隔5秒输出1组数据
    $ pidstat -w 5
    Linux 4.15.0 (ubuntu)  09/23/18  _x86_64_  (2 CPU)
    
    08:18:26      UID       PID   cswch/s nvcswch/s  Command
    08:18:31        0         1      0.20      0.00  systemd
    08:18:31        0         8      5.40      0.00  rcu_sched
    
    这个结果中有两列内容是我们的重点关注对象。
    一个是  cswch  ,表示每秒自愿上下文切换(voluntary context switches)的次数,
    一个是  nvcswch  ,表示每秒非自愿上下文切换(non voluntary context switches)的次数。
    这两个概念意味着不同的性能问题:
    所谓自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
    而非自愿上下文切换,则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。
    
    每秒上下文切换多少次才算正常呢?这个数值其实取决于系统本身的 CPU 性能。如果系统的上下文切换次数比较稳定,那么从数百到一万以内,都应该算是正常的。
    但当上下文切换次数超过一万次,或者切换次数出现数量级的增长时,就很可能已经出现了性能问题。这时,你还需要根据上下文切换的类型,再做具体分析。
    比方说:
    1. 自愿上下文切换变多了,说明进程都在等待资源,有可能发生了 I/O 等其他问题;
    2. 非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢 CPU,说明 CPU 的确成了瓶颈;
    3. 中断次数变多了,说明 CPU 被中断处理程序占用,还需要通过查看 /proc/interrupts 文件来分析具体的中断类型。
    

    execsnoop

    一个专为短时进程设计的工具。它通过 ftrace 实时监控进程的 exec() 行为,并输出短时进程的基本信息,包括进程 PID、父进程 PID、命令行参数以及执行的结果。

    # 下载
    cd /usr/local/sbin/
    wget https://raw.githubusercontent.com/brendangregg/perf-tools/master/execsnoop
    chmod 755 execsnoop 
    
    # 运行 
    execsnoop 
    
  • 相关阅读:
    Flume-NG源码分析-整体结构及配置载入分析
    Flume之核心架构深入解析
    使用maven构建scala项目
    大数据的一些面试题
    HBase原理和设计
    Hive UDAF开发详解
    Hive UDTF开发指南
    Hive UDF开发指南
    局域网访问电脑中VMware虚拟机
    百度面试-前端
  • 原文地址:https://www.cnblogs.com/klvchen/p/9970648.html
Copyright © 2020-2023  润新知