Linux的负载高,主要是由于CPU使用、内存使用、IO消耗三部分构成。任意一项使用过多,都将导致服务器负载的急剧攀升。

查看服务器负载有多种命令,w、vmstat或者uptime都可以直接展示负载。
[hs@master opt]$ uptime
 11:00:06 up 106 days, 19:36,  3 users,  load average: 0.00, 0.03, 0.05

信息显示依次为:现在时间、系统已经运行了多长时间、目前有多少登陆用户、系统在过去的1分钟、5分钟和15分钟内的平均负载。
1可以被认为是最优的负载值。负载是会随着系统不同改变得。单CPU系统1-3和SMP系统6-10都是可能接受的。

[hs@master opt]$ w
 11:00:38 up 106 days, 19:37,  3 users,  load average: 0.00, 0.03, 0.05
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
spark59  pts/0     09:47   14:46   1:08   0.01s sshd: spark59 [priv]
spark59  pts/1     09:47   11:10  55.77s  0.00s sshd: spark59 [priv]
spark59  pts/2     09:58    6.00s  0.11s  0.00s sshd: spark59 [priv]

load average分别对应于过去1分钟,5分钟,15分钟的负载平均值。

[hs@master opt]$ 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 2276632 132056 1544508    0    0    20    75    1    0  2  0 97  0  0

procs
r 列表示运行和等待cpu时间片的进程数,如果长期大于1,说明cpu不足,需要增加cpu。
b 列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。
cpu 表示cpu的使用状态
us 列显示了用户方式下所花费 CPU 时间的百分比。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,需要考虑优化用户的程序。
sy 列显示了内核进程所花费的cpu时间的百分比。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。
wa 列显示了IO等待所占用的CPU时间的百分比。这里wa的参考值为30%,如果wa超过30%,说明IO等待严重,这可能是磁盘大量随机访问造成的,也可能磁盘或者磁盘访问控制器的带宽瓶颈造成的(主要是块操作)。
id 列显示了cpu处在空闲状态的时间百分比
system 显示采集间隔内发生的中断数
in 列表示在某一时间间隔中观测到的每秒设备中断数。
cs列表示每秒产生的上下文切换次数,如当 cs 比磁盘 I/O 和网络信息包速率高得多,都应进行进一步调查。
memory
swpd 切换到内存交换区的内存数量(k表示)。如果swpd的值不为0,或者比较大,比如超过了100m,只要si、so的值长期为0,系统性能还是正常
free 当前的空闲页面列表中内存数量(k表示)
buff 作为buffer cache的内存数量,一般对块设备的读写才需要缓冲。
cache: 作为page cache的内存数量,一般作为文件系统的cache,如果cache较大,说明用到cache的文件较多,如果此时IO中bi比较小,说明文件系统效率比较好。
swap
si 由内存进入内存交换区数量。
so由内存交换区进入内存数量。
IO
bi 从块设备读入数据的总量(读磁盘)(每秒kb)。
bo 块设备写入数据的总量(写磁盘)(每秒kb)
这里我们设置的bi+bo参考值为1000,如果超过1000,而且wa值较大应该考虑均衡磁盘负载,可以结合iostat输出来分析。

以上三个个命令只是单纯的反映出负载,linux提供了更为强大,也更为实用的top命令来查看服务器负载。
top命令能够清晰的展现出系统的状态,而且它是实时的监控,按q退出。
[hs@master opt]$ top
top - 11:01:13 up 106 days, 19:37,  3 users,  load average: 0.05, 0.04, 0.05
Tasks: 131 total,   1 running, 130 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.1 us,  0.3 sy,  0.0 ni, 98.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   8011936 total,  5733520 used,  2278416 free,   131392 buffers
KiB Swap:        0 total,        0 used,        0 free.  1543588 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                              
32001 hs        20   0 1265020 256252  38172 S   2.3  3.2   0:56.77 java                                                 
 2696 hs        20   0 3726664 447420     60 S   0.7  5.6 819:57.88 java                                                 
29566 root      20   0   64780   4668   2628 S   0.7  0.1  43:18.42 AliYunDun                                            
 1624 hs        20   0 1789456 292492   4928 S   0.3  3.7 298:23.89 java                                                 
 2008 hs        20   0 1996320 438004   4604 S   0.3  5.5 849:44.95 java                                                 
 2465 hs        20   0 1258944 170752    264 S   0.3  2.1  89:18.25 java                                                 
 3284 hs        20   0 2867828 210788   3756 S   0.3  2.6 259:29.98 java                                                 
29580 root      20   0  836552   6320   2584 S   0.3  0.1  13:10.27 AliHids                                              
    1 root      20   0   63648  25184   1424 S   0.0  0.3   4:44.45 systemd                                              
    2 root      20   0       0      0      0 S   0.0  0.0   0:01.49 kthreadd                                             
    3 root      20   0       0      0      0 S   0.0  0.0   8:01.90 ksoftirqd/0                                          
    5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H                                         
    7 root      rt   0       0      0      0 S   0.0  0.0   0:30.46 migration/0   

Tasks行展示了目前的进程总数及所处状态,要注意zombie,表示僵尸进程,不为0则表示有进程出现问题。

Cpu(s)行展示了当前CPU的状态,us表示用户进程占用CPU比例,sy表示内核进程占用CPU比例,id表示空闲CPU百分比,wa表示IO等待所占用的CPU时间的百分比。wa占用超过30%则表示IO压力很大。
Mem行展示了当前内存的状态,total是总的内存大小,userd是已使用的,free是剩余的,buffers是目录缓存。
Swap行同Mem行,cached表示缓存,用户已打开的文件。如果Swap的used很高,则表示系统内存不足。

在top命令下,按1,则可以展示出服务器有多少CPU,及每个CPU的使用情况
一般而言,服务器的合理负载是CPU核数*2。也就是说对于8核的CPU,负载在16以内表明机器运行很稳定流畅。如果负载超过16了,就说明服务器的运行有一定的压力了。

在top命令下,按shift + "c",则将进程按照CPU使用率从大到小排序,按shift+"p",则将进程按照内存使用率从大到小排序,很容易能够定位出哪些服务占用了较高的CPU和内存。

仅仅有top命令是不够的,因为它仅能展示CPU和内存的使用情况,对于负载升高的另一重要原因——IO没有清晰明确的展示。linux提供了iostat命令,可以了解io的开销。

输入iostat -x 1 10命令,表示开始监控输入输出状态,-x表示显示所有参数信息,1表示每隔1秒监控一次,10表示共监控10次。
其中rsec/s表示读入,wsec/s表示每秒写入,这两个参数某一个特别高的时候就表示磁盘IO有很大压力,util表示IO使用率,如果接近100%,说明IO满负荷运转。
[hs@master opt]$ iostat -x 1 10
Linux 3.10.0-123.9.3.el7.x86_64 (master)  07/29/2016  _x86_64_ (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.47    0.00    0.38    0.20    0.00   96.95

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     0.86    0.77    1.45    50.88   139.71   172.11     0.18   81.22    3.87  122.28   1.52   0.34
vdb               0.00    37.36    0.37    3.16    28.06   159.69   106.50     0.02    4.69    5.87    4.55   1.86   0.65

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.75    0.00    0.25    0.25    0.00   98.75

总结:
(1)使用top命令查看负载,在top下按“1”查看CPU核心数量,shift+"c"按cpu使用率大小排序,shif+"p"按内存使用率高低排序;
(2)使用iostat -x 命令来监控io的输入输出是否过大

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐