zoukankan      html  css  js  c++  java
  • 查看Linux系统的平均负载

    1、Linux系统的平均负载的概念

      有时候我们会觉得系统响应很慢,但是又找不到原因,这时就要查看平均负载了,看它是否有大量的进程在排队等待。特定时间间隔内运行队列中的平均进程数可以反映系统的繁忙程度,所以我们通常会在自己的网站或系统变慢时第一时间查系统的负载,即CPU的平均负载。

      2、查看平均负载

      究竟应该如何查看平均负载呢?最简单的命令是uptime,如下所示:

  • [root@localhost ~]# uptime  
  •  11:31:11 up 11 days, 19:01, 2 users, load average: 0.02, 0.01, 0.00
  •   目前的主流服务器都是双四核,有相当强悍的CPU,做一般的应用服务的话,Linux系统的负载这块倒不用我们担心。

      还可以用w命令来查看,顺便可以查看一下系统当前有哪些用户,他们占用了哪些终端,如下所示:

  • [root@localhost ~]# w  
  •  11:33:00 up 11 days, 19:03, 2 users, load average: 0.00, 0.00, 0.00  
  • USER TTY FROM LOGIN@  IDLE  JCPU  PCPU WHAT  
  • root pts/1113.57.224.3 09:032:11m 0.04s 0.04s -bash  
  • root pts/2113.57.224.3 11:310.00s 0.02s 0.00s w
  •   另外,还有动态命令top,这个命令也可以反映系统负载情况。在下面的命令提示中,我们只关心加粗字体部分。

  • [root@localhost ~]# top  
  • top - 11:37:47 up 11 days, 19:08, 2 users, load average: 0.00, 0.00, 0.00  
  • Tasks: 122 total,  1 running, 121 sleeping,  0 stopped,  0 zombie  
  • Cpu(s): 0.1%us, 0.0%sy, 0.0%ni, 99.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st  
  • Mem:  4044136k total, 1435504k used, 2608632k free,  274740k buffers  
  • Swap: 8193140k total,0k used, 8193140k free,  941884k cached
  •   上面加粗字体显示的内容是什么意思呢?再通过uptime查看一下。

  • [root@localhost ~]# uptime  
  •  11:39:36 up 11 days, 19:16, 1 user, load average: 0.09, 0.03, 0.01
  •   原来它所表示的是过去的1分钟、5分钟和15分钟内进程队列中的平均进程数量。

      那么,如何衡量当前系统是否负载过高呢?可以从以下几点来考虑。

      如果每个CPU(可以按CPU核心的数量计算)当前的活动进程数不大于3,则系统性能良好。

      如果每个CPU当前的活动进程数不大于4,表示可以接受。

      如果每个CPU当前的活动进程数大于5,则系统性能问题严重。

      还可以结合vmstat命令来判断我们的系统是否过于繁忙,如果确定很繁忙的话,就要考虑是否更换服务器或增加CPU的个数了。总结如下:

      如果r经常大于3或4,且id经常少于50,则表示CPU的负荷很重。

      在上面例子中,我的服务器是PowerEdge 2850,CPU是双核双线程的,则0.09/2=0.045(即负载值/真实CPU个数),此系统的CPU负载基本可以忽略了。事实上,现在主流服务器的CPU都很强悍,如果不是应用虚拟化等特殊场景,基本上负载都很小。

      按照前面的计算公式,我所配置Nagios报警的CPU负载阈值为CPU核心的数量(即CPU的物理个数×核数)。还是以我的服务器PowerEdge 2850为例,其CPU核心的数量为2×2=4,则设置报警值为4。这样设置是合理的,因为毕竟不是每个应用服务器的CPU都支持多核心,毕竟整个网站中还有些性能比较弱的服务器是用来做备份的。


    1. CPU 占用情况:

    1.1: 首先看Process运行时占用CPU的细节:

    正如Linux Kernel中所介绍的,Process的状态有3种:

    正在被CPU处理,可被CPU处理,blocked状态。

     

    正在被CPU处理:顾名思义,就是process正在占用CPU。

    可被CPU处理:即runnable状态,这就意味着它将同其他runnable状态的process等待CPU时间。由schedule程序选择调哪个runnable状态的process进CPU。(这些runnable状态的process的队列叫做作Run Queue)

    blocked状态:process可能在等待一个I/O操作获取的数据,或者是一个系统调用的结果

     

    runnable processes的数目和blocked processes的数目可以表现出CPU是否很忙。

     

    另外,很多系统工具会显示一个值: load average。 它就是指running和runnable process的总和。

    load average显示的三个数字的时间分别为1分钟,五分钟和十五分钟 的load average数量。

     

    1.2:CPU的上下文切换:

    Linux Kernel中有个schedule() 函数。它用来从runnable 队列中挑选出一个process进入CPU,并完成上下文切换(Context Switch)。

    当系统做Context Switch时,CPU保存所有old process的context信息并获得new process的所有context信息.Context信息包括大量的linux追踪每个process信息,尤其是一些资源:那些process正在执行,被分配了哪些内存,它打开了那些文件,等等.切换Context会触发大量的信息移动,这是比较高的开销.如果可能的话尽量保持很小的 context switches.

     

    kernel schedule() 触发context switches.为了保证每个process平等的共享CPU时间,kernel周期性中断running的process,看是否有需要作context switches. 如果需要,kernel调度器会开始另外的process而不是让当前的process继续执行,每次的周期性中断或者定时中断都可能触发context switch.每秒定时中断的次数因不同架构和不同的kernel版本而不同(Kernel中的HZ?, Kernel中这个值通常设置为1000) .

    $cat .config |grep CONFIG_HZ

    可以看到这个值设置为多少。(通常为1000)。 也就是每秒钟1000次时钟中断。

     

    用户态如何察看时钟中断,以前Sam使用:

    #cat /proc/interrupts

    认为其中中断0 就是时钟中断数。可以利用间隔10秒的差值算出每秒时钟中断数。但现在在多核上好像不适用了。

     

     

    1.3:CPU状态信息:

    us  --  User CPU time
              The time the CPU has spent running users' processes that are not niced.

              非nice过的用户程序所占用的百分比。

    sy  --  System CPU time
              The time the CPU has spent running the kernel and its processes.

              kernel和系统调用所占用的百分比。

    ni  --  Nice CPU time
              The time the CPU has spent running users' proccess that have been niced.

              被nice过的用户程序所占百分比。

    wa  --  iowait
              Amount of time the CPU has been waiting for I/O to complete.

              等待IO操作时所占百分比。

    hi  --  Hardware IRQ
              The amount of time the CPU has been servicing hardware interrupts.

              处理硬件中断所用百分比。

    si  --  Software Interrupts
              The amount of time the CPU has been servicing software interrupts.

              处理软件中断所用百分比。

    st  --  Steal Time
              The amount of CPU 'stolen' from this virtual machine by the hypervisor for other tasks (such as running  another  vir鈥?
              tual machine).

     

    NICE以及修改process优先级: 见附录1。

     

     

    1.4:使用top查看CPU状况:

    $top -d 1 -c

    top有相当强大的功能。不光可以显示当前CPU各个状态下的时间。还可以分别显示多个CPU Core(按1)。以及某个process具体是运行在哪个core上。(按f,j)

     

    如果发现CPU system部分占用太多,可以使用OProfile 工具查看。

    如果iowait很高时,则需要具体检查IO部分,如硬盘和网卡等。

     

    1.5: 使用vmstat查看CPU状况:

    使用top查看cpu状态时,可以看到CPU在哪些状态下占用较多。以及哪些Process占用较多CPU。

    而使用vmstat查看,在CPU实用方面,则有其它信息可看。

    $vmstat 1    //每隔1s 输出一次结果

    procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
      b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st

     

    CPU项目下的:us sy id wa st与top下的相似。

    procs下则有几项有新意:

    r:in run queue

    b:blocked for resources I/O, paging etc

    如果r 的值持续较大,且连续超过CPU Core的数量,则表明CPU资源严重不足,有很多process在等待CPU, CPU计算能力已经成为瓶颈。

     

     

     

    2. 查看其它IO负载:

    当使用top或者vmstat发现CPU wa时间多时。 vmstat中发现b列一直比较大的话(超过CPU Core)。则表明IO性能不佳。

     

    IO性能,可以具体查看存储设备和网络设备。

     

     

     

     

     Partition察看类型:
    很多时候,在察看U盘格式时,Sam 使用fdisk -l。 察看其U盘中partition list以及格式。但其实这个方法并不准确。因为fdisk拿到的值只是在 -t 时修改的值。

    例如:我们创建了一个ext3 partition. 但没有使用-t 修改其值为82。则fdisk 还是会显示为 Win95 FAT32.

    所以可以使用 blkid。


     


     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    附录1:process优先级及其修改:

    当使用top命令时。有2列显示与process的优先级别有关:

    PR:Priority.

    NI:nice.

    PR数值越小,process的优先级约高。

    PR(new) = PR(old) + NI

     

    指定和修改porcess优先级,可以使用:nicerenice命令。

    $sudo nice -n -10 top -d 1

    则看到top的NI=-10

     

    linux nice 命令详解

      功能说明:设置优先权。

      语  法:nice [-n <优先等级>][--help][--version][执行指令]

      补充说明:nice指令可以改变程序执行的优先权等级。

      参  数:-n<优先等级>或-<优先等级>或--adjustment=<优先等级>  设置欲执行的指令的优先权等级。等级的范围从-20-19,其中-20最高,19最低,只有系统管理者可以设置负数的等级。

     

    renice:

    renice -10 -p 6200  

    将pid=6100的process NI 设置为-10

     

     

    另外:使用top,也可以修改porcess的优先级。

    #top -d 1

    "r"-->输入进程PID-->输入nice值

     

     

     

    0

    0

    阅读(1882) 评论 (0) 收藏(0) 转载(2)  喜欢 打印举报
    已投稿到:

  • 相关阅读:
    swoole 入门
    Centos7安装Percona5.7
    clone github报Permission denied (publickey) 解决方案
    yii2-swiftmailer入门
    Yii 2.0 数据库操作总结
    面向对象简单示例
    面向对象与面向过程
    Tkinter之部件3种放置方式pack、grid、place
    Tkinter之variable用法
    Tkinter之Menu
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299154.html
Copyright © 2011-2022 走看看