天天看点

Linux系统性能监控之CPU关注点操作命令

关注点

首先,我们来看监控CPU运行状况时需要关注的几个:

  1. CPU使用率:

    CPU使用率分为用户态CPU使用率和系统态CPU使用率。用户态CPU使用率是指执行应用程序代码的时间占总CPU时间的百分比;系统态CPU使用率是指应用执行操作系统调用的时间占总CPU时间的百分比。系统态CPU使用率高意味着共享资源有竞争或者I/O设备之间有大量的交互。提高应用性能和扩展性的一个目标是尽可能降低系统态CPU使用率。

  2. 上下文切换:

    如果可运行的线程数大于CPU的数量,那么OS最终会强行换出正在执行的线程,从而使其他线程能够使用CPU。这会引起上下文切换,它会保存当前运行线程的执行上下文,并重建新调入线程的执行上下文。

    上下文切换又分为2种:让步式上下文切换和抢占式上下文切换。前者是指执行线程主动释放CPU,与锁竞争严重程度成正比,可通过减少锁竞争来避免;后者是指线程因分配的时间片用尽而被迫放弃CPU或者被其他优先级更高的线程所抢占,一般由于线程数大于CPU可用核心数引起,可通过调整线程数,适当减少线程数来避免。

  3. 运行队列

    每个CPU都会维持一个运行队列,理想情况下,调度器会不断让队列中的进程运行。进程不是处在sleep状态就是run able状态。如果CPU过载,就会出现调度器跟不上系统的要求,导致可运行的进程会填满队列。队列愈大,程序执行时间就愈长。

  4. Load Average

    Load Average是 CPU的 Load,它所包含的信息不是 CPU的使用率状况,而是在一段时间内 CPU正在处理以及等待 CPU处理的进程数之和的统计信息,也就是 CPU使用队列的长度的统计信息。

    经验值: 安全的load一般是cpu的个数

  5. CPU的利用率

    User Time, System Time, WaitIO, Idle

  6. 中断

    Devices tell the kernel that they are done processing.

建议

  1. 运行队列:每个处理器应该运行的队列不超过1-3个线程。例子,一个双核处理器应该运行队列不要超过6个线程。经验值: 安全的load一般是cpu的个数
  2. CPU利用率:如果一个CPU被充分使用,利用率分类之间均衡的比例应该是:

    65%~70% User Time

    30%~35% System Time

    0%~5% Idle Time

操作命令

  1. 查看CPU信息
    cat /proc/cpuinfo
    grep 'processor' /proc/cpuinfo | wc -l  查看CPU个数            
  2. uptime命令

    以下显示输入uptime的信息:

    04:03:58 up 10 days, 13:19,  1 user,  load average: 0.54, 0.40, 0.20           
    • 当前时间 04:03:58
    • 系统已运行的时间 10 days, 13:19
    • 当前在线用户 1 user
    • 平均负载:0.54, 0.40, 0.20 (最近1分钟、5分钟、15分钟系统的负载)

      系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树。如果一个进程满足以下条件则其就会位于运行队列中: 它没有在等待I/O操作的结果,它没有主动进入等待状态(也就是没有调用’wait’) ,没有被停止(例如:等待终止)。一般来说,每个CPU内核当前活动进程数不大于3,则系统运行表现良好!当然这里说的是每个cpu内核,也就是如果你的主机是四核cpu的话,那么只要uptime最后输出的一串字符数值小于12即表示系统负载不是很严重。当然如果达到20,那就表示当前系统负载非常严重,估计打开执行web脚本非常缓慢。

  3. vmstat命令

    vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况, IO读写情况。

    一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:

    procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
    r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
    0  0      0 5000628      0 122932    0    0  8543 31070    4    9  1  0 93  0  7           

    r 表示运行队列。当这个值超过了CPU数目,就会出现CPU瓶颈了。

    b 表示阻塞的进程。

    swpd 虚拟内存已使用的大小,切换到内存交换区的内存数量(k表示)。如果大于0,表示你的机器物理内存不足了。

    free 当前的空闲页面列表中内存数量(k表示)。

    buff 作为buffer cache的内存数量,一般对块设备的读写才需要缓冲。

    cache: 作为page cache的内存数量,一般作为文件系统的cache

    si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。

    so 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。

    bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte。

    bo 块设备每秒发送的块数量。

    in 每秒CPU的中断次数,包括时间中断

    cs 每秒上下文切换次数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

    us 用户CPU时间。

    sy 系统CPU时间。

    id 空闲 CPU时间。

    wa 等待IO CPU时间。

    st Time stolen from a virtual machine. Prior to Linux 2.6.11, unknown.

  4. Top命令

    TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表。

    top - 12:38:33 up 50 days, 23:15,  2 users,  load average: 60.58, 61.14, 61.22
    Tasks: 203 total,  60 running, 139 sleeping,   4 stopped,   0 zombie
    Cpu(s)  : 27.0%us, 73.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
    Mem:   1939780k total,  1375280k used,   564500k free,   109680k buffers
    Swap:  4401800k total,   497456k used,  3904344k free,   848712k cached
    PID   USER      PR  NI  VIRT   RES  SHR  S  %CPU %MEM    TIME+  COMMAND                                
    4338 oracle    25   0  627m  209m 207m  R   0   11.0    297:14.76 oracle                                             

    多U多核CPU监控

    在top基本视图中,按键盘数字1,可监控每个逻辑CPU的状况

    在top基本视图中,按键盘输入H后,top将以上一次系统记得的“H”状态的相反的状态运行。如上次top的H状态是off,则这次运行时H状态就变成on了,H状态是on时,所有的单独的线程都会被显示出来。

    TOP视图解析:

    第一行:

    12:38:33 当前系统时间

    50days, 23:15 系统已经运行了50天23小时15分钟(在这期间没有重启过)

    2 users 当前有2个用户登录系统

    load average: 60.58, 61.14, 61.22 load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。

    load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。

    第二行:

    Tasks 任务(进程),系统现在共有203个进程,其中处于运行中的有60个,139个在休眠(sleep),stoped状态的有4个,zombie状态(僵尸)的有0个。

    第三行:cpu状态

    27.0% us 用户空间占用CPU的百分比。

    73.0%sy 内核空间占用CPU的百分比。

    0.0% ni 改变过优先级的进程占用CPU的百分比

    0.0%id 空闲CPU百分比

    0.0% wa IO等待占用CPU的百分比

    0.0% hi 硬中断(Hardware IRQ)占用CPU的百分比

    0.0% si 软中断(Software Interrupts)占用CPU的百分比

    第四行:内存状态

    total 物理内存总量

    used 使用中的内存总量

    free 空闲内存总量

    buffers 缓存的内存量

    第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。

    第五行:swap交换分区

    total 交换区总量

    used 使用的交换区总量

    free 空闲交换区总量

    cached 缓冲的交换区总量

    如果出于习惯去计算可用内存数,这里有个近似的计算公式:第四行的free + 第四行的buffers + 第五行的cached,按这个公式此台服务器的可用内存:530668+79236+4231276 = 4.7GB。

    对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。

    第六行是空行

    第七行以下:各进程(任务)的状态监控

    PID 进程id

    USER 进程所有者

    PR 进程优先级

    NI nice值。负值表示高优先级,正值表示低优先级

    VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES

    RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA

    SHR 共享内存大小,单位kb

    S 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程

    %CPU 上次更新到现在的CPU时间占用百分比

    %MEM 进程使用的物理内存百分比

    TIME+ 进程使用的CPU时间总计,单位1/100秒

    COMMAND 进程名称(命令名/命令行)

  5. mpstat命令

    mpstat是MultiProcessor Statistics的缩写,是实时系统监控工具。其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中。在多CPUs系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。

    mpstat -P ALL           
    这里请大家注意区分物理cpu和逻辑cpu的区别,不要混淆了
  6. sar命令
    sar -q      查看load状况
    sar -u      查看cpu使用率
    sar -u -f /var/log/sa/sa12       查看历史情况