linux之top
负载(load)是linux机器的一个重要指标,直观了反应了机器当前的状态。如果机器负载过高,那么对机器的操作将难以进行。
Linux的负载高,主要是由于CPU使用、内存使用、IO消耗三部分构成。任意一项使用过多,都将导致服务器负载的急剧攀升。
查看服务器负载有多种命令,w或者uptime都可以直接展示负载,
$ uptime
12:20:30 up 44 days, 21:46, 2 users, load average: 8.99, 7.55, 5.40
$ w
12:22:02 up 44 days, 21:48, 2 users, load average: 3.96, 6.28, 5.16
load average分别对应于过去1分钟,5分钟,15分钟的负载平均值。
这两个命令只是单纯的反映出负载,linux提供了更为强大,也更为实用的top命令来查看服务器负载。
$ top
top命令能够清晰的展现出系统的状态,而且它是实时的监控,按q退出。
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次。
没有iostat命令的话 yum/apt-get install sysstat -y 即可
其中rsec/s表示读入,wsec/s表示每秒写入,这两个参数某一个特别高的时候就表示磁盘IO有很大压力,util表示IO使用率,如果接近100%,说明IO满负荷运转。
总结:
(1)使用top命令查看负载,在top下按“1”查看CPU核心数量,shift+"c"按cpu使用率大小排序,shif+"p"按内存使用率高低排序;
(2)使用iostat -x 命令来监控io的输入输出是否过大
解释:
- A:
PID
= (Process Id) 进程Id; - E:
USER
= (User Name) 进程所有者的用户名; - H:
PR
= (Priority) 优先级 - I:
NI
= (Nice value) nice值。负值表示高优先级,正值表示低优先级 - O:
VIRT
= (Virtual Image (kb)) 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES - Q:
RES
= (Resident size (kb)) 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA - T:
SHR
= (Shared Mem size (kb)) 共享内存大小,单位kb - W:
S
= (Process Status) 进程状态。D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程 - K:
%CPU
= (CPU usage) 上次更新到现在的CPU时间占用百分比 - N:
%MEM
= (Memory usage (RES)) 进程使用的物理内存百分比 - M:
TIME
+ = (CPU Time, hundredths) 进程使用的CPU时间总计,单位1/100秒
b:PPID
= (Parent Process Pid) 父进程Id
c:RUSER
= (Real user name)
d:UID
= (User Id) 进程所有者的用户id
f:GROUP
= (Group Name) 进程所有者的组名
g:TTY
= (Controlling Tty) 启动进程的终端名。不是从终端启动的进程则显示为 ?
j:P
= (Last used cpu (SMP)) 最后使用的CPU,仅在多CPU环境下有意义
p:SWAP
= (Swapped size (kb)) 进程使用的虚拟内存中,被换出的大小,单位kb
l:TIME
= (CPU Time) 进程使用的CPU时间总计,单位秒
r:CODE
= (Code size (kb)) 可执行代码占用的物理内存大小,单位kb
s:DATA
= (Data+Stack size (kb)) 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
u:nFLT
= (Page Fault count) 页面错误次数
v:nDRT
= (Dirty Pages count) 最后一次写入到现在,被修改过的页面数
y:WCHAN
= (Sleeping in Function) 若该进程在睡眠,则显示睡眠中的系统函数名
z:Flags
= (Task Flags <sched.h>) 任务标志,参考 sched.h - X:
COMMAND
= (Command name/line) 命令名/命令行