linux是当前在服务器领域最成功操作系统,不仅性能卓越,安全性高,更重要的是提供了一套完善的监控机制,来检测系统内存、网络、cpu等运转情况,从而让用户做出应对方案,确保系统稳健运行。在工作中,常用的监控方式主要有以下命令。
uptime
uptime命令可以查看当前系统的负载,运行结果如下:
11:34:31 up 86 days, 19:39, 2 users, load average: 0.00, 0.01, 0.00
主要是最后3个数,表示1,5,15分钟内系统负载,如果该值除以逻辑cup个数,结果大于5表明系统负荷过大。
这里的系统负载定义为CPU在特定时间间隔内运行队列中的平均进程数,进程进入队要满足下列条件:
- 没有在等待I/O操作的结果
- 没有主动进入等待状态,即没有调用wait
- 没有被停止
一般来说,每个cpu内核的负载不大于3,则系统表现良好。如果cpu是4核,那么只要负载不大于12说明系统良好,如果超过12,系统就处于高负载状态,需要注意了。
扩展:cat /proc/loadavg
运行结果如下:
0.00 0.02 0.00 2/182 16802
前3个数和uptime命令后3个数含义相同,表示系统负载,后面的数是当前运行进程数/总进程数, 最后一个数表示最近运行的进程id。
vmstat
vmstat能够输出指定时间间隔的一些系统核心指标,包括cpu使用率、内存使用率、虚拟内存交换、IO读写等,以便让我们更详细的了解系统的运行状态,执行结果如下:
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 466688 267644 1967496 0 0 0 5 1 1 2 0 98 0 0
1 0 0 466672 267644 1967516 0 0 0 28 331 481 0 1 99 0 0
0 0 0 466796 267644 1967520 0 0 0 4 468 518 2 1 97 0 0
- r:运行队列大小(队列中等待分配CPU资源的进程数),该数据比平均负载更能体现cpu的负载情况,不包含等待io的进程,如果该数据达到cpu核数,说明cup资源已经饱和并出现瓶颈,一般超过3就比较高,超过5就高,超过10就危险了。
- b:阻塞进程数。
- swpd:虚拟内存使用大小,如果大于0,则内存不足,不是OOM引起的话,就表明要升级内存了,或者把耗内存的任务移出。
- free:空闲的物理内存。
- buff:缓存文件的权限等元数据。
- cache:缓存打开的文件,是为了提高程序运行的性能,当使用时,buff/cache会很快被使用。
- si:每秒从磁盘读入虚拟内存的大小,如果该数据大于0,表示物理内存泄露或者不足。
- so:每秒从虚拟内存读入磁盘的大小,大于0,同si。
- bi:块设备(磁盘)每秒接收的块数量,默认块大小1kB,磁盘写入速度差不都140M/s。
- bo:块设备(磁盘)每秒发送的块数量,bi、bo要接近0,否则就是io频繁,要处理。
- in:每秒cpu中断次数。
- cs:上下文切换频率。
线程上下文切换、系统函数调用等都会造成cpu上下文切换,该值越小越好,大了就要考虑减少线程/进程数量,使其有一个合适的值。
通常通过压测,调整进程/线程数量,直到cs的值满足要求,从而找到一个合适的值。(注:切换耗时10ms,则每秒每个cpu可切换100次,在10-20倍的范围算正常,即cs值在1000-2000内还正常)。上下文切换很消耗cpu资源,如果cpu大部分时间都用在上下文切换上,干正事的时间就少了,就不会充分利用cpu。
- us:用户cpu时间。
- sy:系统cpu时间,如果太高,表示系统调用时间过长,如IO操作频繁。
- id(idle):空闲cpu时间,us+sy+id=100。
- wa(wait):io等待造成的cup时间消耗,如果数值较大,可以说明系统的瓶颈在磁盘io。
- st(stolen):cpu被偷走的时间,一般被虚拟机消耗。
mpstat
mpstat命令报告一些cpu的统计信息,在多核cpu中,不仅能查看全部cpu的指标均值,还能够查看一个cpu的指标信息,mpstat -P[] 1(internal) 2(count)运行如下:
07:21:21 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
07:21:22 PM all 0.00 0.00 0.50 0.00 0.00 0.00 0.00 0.00 99.50
07:21:23 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
Average: all 0.00 0.00 0.25 0.00 0.00 0.00 0.00 0.00 99.75
-P=[0,核数-1]
- usr:用户cpu时间占比,不包含nice值为负数的进程。
- nice:nice值为负数的进程cpu时间占比。
- sys:系统(核心)cpu时间占比。
- iowait:硬盘io等待cpu时间占比,如果过大,说明系统磁盘io频繁,磁盘io可能出现瓶颈。
- irq:cpu中断时间占比。
- soft:cup软中断时间占比。
- steal:
- guest:
- idle:cpu空间时间占比,除去io等待空闲。
如果一个cpu占用率很高,可能是由一个单线程程序引起的。
pidstat
pidstat命令报告进程的cpu占用率(-u default),内存占用率(-r),io情况(-d),可统计所有进程数据,也可以查看指定进程数据(-p),cpu占用率结果如下:
07:39:46 PM PID %usr %system %guest %CPU CPU Command
07:39:47 PM 21609 0.00 1.00 0.00 1.00 0 java
07:39:47 PM PID %usr %system %guest %CPU CPU Command
07:39:48 PM 21609 1.00 0.00 0.00 1.00 0 java
内存占用率结果如下:
07:44:49 PM PID minflt/s majflt/s VSZ RSS %MEM Command
07:44:50 PM 497 198.00 0.00 101164 1036 0.03 pidstat
07:44:50 PM 21609 4.00 0.00 2439932 79172 2.02 java
- minflt/s:每秒次缺页错误次数,次缺页错误指的是虚拟内存地址映射到物理内存地址产生的page default次数。
- majflt/s:每秒主缺页错误次数,主缺页错误指的是虚拟内存地址映射到物理内存地址产生的major page default次数,通常在内存紧张时产生。
- VSZ:使用的虚拟内存KB。
- RSS:使用的物理内存KB。
- MEM:使用的内存百分比。
磁盘io情况如下:
07:52:07 PM PID kB_rd/s kB_wr/s kB_ccwr/s Command
07:54:02 PM 13885 0.00 0.00 0.00 java
07:54:03 PM 13885 0.00 0.00 0.00 java
- kB_rd/s:进程每秒读取的数据量。
- kB_wr/s:进程每秒写入的数据量。
iostat
iostat主要查看磁盘io情况,iostat -k 1
运行结果如下:
avg-cpu: %user %nice %system %iowait %steal %idle
0.50 0.00 0.00 0.00 0.00 99.50
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 0.55 0.03 3.72 156733 20788752
vdb 0.05 0.00 1.18 9273 6586332
-k 表示块单位转换为kb,-d表示显示设备名称(default),-x获得更多的统计信息,-c获取cpu的一些信息avg-cpu。
- tps:每秒传输的次数,即每秒io请求次数。
- kB_read/s:每秒从硬盘读取字节数。
- kB_wrtn/s:每秒写入硬盘字节数。
- kB_read:读取字节数。
- kB_wrtn:写入字节数。
iostat -x -k 1
运行结果如下:
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.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
vdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- rrqm/s:每秒进行merge的读操作数目。
- wrqm/s:每秒进行merge的写操作数据。
- r/s:每秒读磁盘次数。
- w/s:
- rkB/s:
- wkB/s
- avgrq-sz:平均每次I/O操作数据大小。
- avgqu-sz:平均每次I/O操作队列长度。
- await:平均每次I/O操作等单时间。
- r_await:
- w_await:
- svctm:平均每次设备I/O操作的服务时间。
- %util:一秒中有百分之多少的时间用于 I/O 操作。
如果%util接近100%,则I/O请求过载,磁盘可能存在瓶颈。
free
free用来查看内存情况,free -m
执行结果如下:
total used free shared buffers cached
Mem: 3832 3154 677 0 269 2075
-/+ buffers/cache: 810 3022
Swap: 0 0 0
-m以M单位显示,默认是kB
- Mem:从OS层面来看内存情况。
** shared:被进程共享的内存,已经deprecated。
** buffers:被os buffer的内存。
** cached:被os cache的内存。 - -/+ buffers/cache:从应用程序角度来看内存情况。
** -buffers/cache:应用程序认为系统被用掉多少内存。
** +buffers/cache:应用程序认为系统剩余多少内存。 - Swap:交换区信息。
buffer和cache的进一步理解:
buffer:A buffer is something that has yet to be "written" to disk.
cache:A cache is something that has been "read" from the disk and stored for later use.
都是为了提高I/O性能,由os管理,为了提高I/O性能,就要多cache数据,所以通常看cache比free大。
sar
sar命令格式 sar [options(-u)] [-o file] t n,该命令很强大,根据不同参数,报告不同的统计数据,可以统计cpu、硬盘、网卡等很多信息。
sar -n DEV 1
报告网卡流量统计,执行结果如下:
04:01:05 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
04:01:06 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
04:01:06 PM eth0 1.01 4.04 0.07 7.79 0.00 0.00 0.00
04:01:06 PM eth1 1.01 2.02 0.08 0.11 0.00 0.00 0.00
-n网卡信息统计,DEV显示网络信息、EDEV显示关于网络错误信息、SOCK显示套接字信息、FULL显示全部。
- rxpck/s:每秒接收数据包。
- txpck/s:
- rxkB/s:每秒接收字节。
- txkB/s:
- rxcmp/s:每秒接收压缩数据包。
- txcmp/s:
- rxmcst/s:每秒接收的多播数据包。
sar -b 1
报告磁盘、缓冲区I/O情况,执行结果如下:
11:38:56 AM tps rtps wtps bread/s bwrtn/s
11:38:57 AM 0.00 0.00 0.00 0.00 0.00
11:38:58 AM 0.00 0.00 0.00 0.00 0.00
11:38:59 AM 1.98 0.00 1.98 0.00 23.76
11:39:00 AM 0.00 0.00 0.00 0.00 0.00
- tps:每秒进行磁盘读写的次数。
- rtps:
- wtps:
- bread/s:每秒读取的字节数。
- bwrtn/s:
sar -r 1
报告swap空间使用情况,执行结果如下:
11:35:25 AM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit
11:35:26 AM 707808 3216608 81.96 276200 2146784 2523160 64.29
11:35:27 AM 707808 3216608 81.96 276200 2146784 2523160 64.29
11:35:28 AM 707808 3216608 81.96 276200 2146784 2523160 64.29
11:35:29 AM 707808 3216608 81.96 276200 2146784 2523160 64.29
11:35:30 AM 707808 3216608 81.96 276200 2146784 2523160 64.29
11:35:31 AM 707808 3216608 81.96 276200 2146784 2523160 64.29
sar -u 1
报告cpu使用情况,执行结果如下:
11:41:43 AM CPU %user %nice %system %iowait %steal %idle
11:41:44 AM all 0.50 0.00 0.00 0.00 0.00 99.50
11:41:45 AM all 0.00 0.00 0.50 0.00 0.00 99.50
11:41:46 AM all 0.00 0.00 0.00 0.00 0.00 100.00
11:41:47 AM all 0.00 0.00 0.50 0.00 0.00 99.50
11:41:48 AM all 2.00 0.00 0.50 0.00 0.00 97.50
sar -w 1
报告上下文切换统计,执行结果如下:
11:42:44 AM proc/s cswch/s
11:42:45 AM 0.00 382.83
11:42:46 AM 0.00 364.00
11:42:47 AM 0.00 336.00
11:42:48 AM 1.00 379.00
-x报告指定进程的统计信息,如进程运行在那个cpu上、进程cpu占用情况等;-A显示全部信息,不在一个个说明。
top
top命令也很强大,包含了前面好几个命令检查的内容,如系统负载情况(uptime),内存使用情况(free),cpu使用情况(vmstat)等。通过top命令,可以相对全面查看系统的负载及其原因。同时,top命令支持排序,可以按照不同的列排序,方便查找出诸如内存占用最多的进程、CPU占用率最高的进程等。
top [options]
options主要如下:
- -i设置时间间隔
- -u设置用户
- -p设置进程号
- -n设置循环次数
top
的输出是一个瞬时值,执行结果如下:
top - 16:51:11 up 69 days, 21:54, 1 user, load average: 0.00, 0.00, 0.00 (uptime)
Tasks: 101 total, 1 running, 100 sleeping, 0 stopped, 0 zombie【僵尸进程】
Cpu(s): 0.2%us, 0.2%sy, 0.0%ni(nice process,改变过优先级的进程占用cpu的百分比), 99.7%id, 0.0%wa(I/O等待占用cpu的百分比), 0.0%hi(硬中断进程占用cpu百分比), 0.0%si(软中断进程占cpu百分比), 0.0%st(被偷走的cpu百分比) (vmstat)
Mem: 3924416k total, 3501784k used(内核控制的内存数,内核控制的内存不一定被使用,因为使用后的内存不会被归还free,所以free会越来越小,不用担心), 422632k free(未被内核控制的内存数), 277996k buffers (free)
Swap: 0k total, 0k used(要特别关注,如果大于0时,说明内核在进行内存与swap区的数据交换,表明内存不足), 0k free, 2261116k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND (pidstat)
22389 root 20 0 2382m 70m 10m S 0.7 1.8 527:36.10 java
1548 root 20 0 1492 260 176 S 0.3 0.0 44:57.06 aliyun-service
24780 root 20 0 30732 2872 2216 S 0.3 0.1 10:06.78 AliYunDunUpdate
- PR:进程优先级。
- NI:nice值,PR代表进程的优先级,但是不能确定其高低级别,nice可以表示进程优先级的高低级别,负表示高优先级,正表示低优先级。
- VIRT:进程使用的虚拟内存数,VIRT=SWAP+RES。
- RES:进程使用的屋里内存数。
- SHR:共享内存大小。
- S:进程状态,R=运行,S=睡眠,T=停止,Z=僵尸,D=不可中断的睡眠状态。
- %CPU:cpu占用百分比。
- %MEM:物理内存占用百分比。
- TIME+:进程使用cpu总时间。
netstat
netstat
报告网络相关的各种信息,如网络链路,路由表,连接状态,协议,多播成员等,常见参数如下:
- -a(all):显示所有,默认不显示状态为listen相关的
- -t(tcp):显示tcp协议相关的
- -u(udp):
- -x(unix): 显示unix协议相关的
- -l: 仅显示listen相关的
- -p:显示建立连接的程序名
- -r: 显示路由表
- -c: 执行该命令的时间间隔
netstat
执行结果如下:
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 114.215.25.109:8802 124.202.245.102:58429 ESTABLISHED
tcp 0 0 iZm5efx0fms2a5b051fm4:35696 10.29.110.3:eforward ESTABLISHED
tcp 0 0 iZm5efx0fms2a5b051fm4:56348 100.100.25.3:http ESTABLISHED
tcp 401 0 iZm5efx0fms2a5b051fm4:56040 100.100.25.3:http CLOSE_WAIT
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ] DGRAM 7390 @/org/kernel/udev/udevd
unix 10 [ ] DGRAM 8615 /dev/log
unix 2 [ ] DGRAM 27784664
unix 3 [ ] STREAM CONNECTED 27782671
unix 3 [ ] STREAM CONNECTED 27782670
整体上看,结果分为两部分:
一个是Active Internet connections,称为有源TCP连接,"Recv-Q"和"Send-Q"是接收队列和发送队列。这些数字一般都应该是0。如果不是则表示软件包正在队列中堆积。这种情况只能在非常少的情况见到。
另一个是Active UNIX domain sockets,称为有源Unix套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)。Proto显示连接使用的协议,RefCnt表示连接到本套接口上的进程号,Types显示套接口的类型,State显示套接口当前的状态,Path表示连接到套接口的其它进程使用的路径名。
ps
ps命令报告进程信息,常用ps aux |grep java
, aux显示所有进程(包括其他用户的进程)的详细信息,执行结果如下:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
work 6660 0.1 18.0 3619892 709948 ? S Jun23 1:37 /home/work/jdk-1.8/bin/java -Djava.awt.headless=true -Dfile.encoding=utf-8 -Djava.io.tmpdir=/home/work/co-channel/temp -server -Xms2048M -Xmx2048M -Xmn800M -XX:-UseCompressedClassPointers -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=128M -Xss256K -verbose:gc -Xloggc:/home/work/co-channel/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -classpath /home/work/co-channel/conf:/home/work/co-channel/lib/co-channel-2.0.0.jar:cn.passiontec.cochannel.ApplicationActivator
- VSZ:进程使用虚拟内存大小(virtual size)。
- RSS:进程使用的实际内存大小。
- TTY:与进程关联的终端。
- START:进程启动的日期。
- TIME:进程使用cpu的总时间。
f:树显示进程。
java启动命令行参数:
进程状态:
- R 运行 Runnable (on run queue)正在运行或在运行队列中等待。
- S 睡眠 Sleeping 休眠中, 在等待某个条件的形成或接受到信号。
- I 空闲 Idle。
- Z 僵死 Zombie(a defunct process)进程已终止, 但进程描述符依旧存在, 直到父进程调用wait4()系统调用后才会释放。
- D 不可中断 Uninterruptible sleep(ususally IO)收到信号不唤醒、不可运行, 进程必须等待中断发生。
- T 终止 Terminate 进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行。
- P 等待交换页。
- W 无驻留页(has no resident pages)没有足够的记忆体分页可分配。
- X 死掉的进程。
- < 高优先级进程。
- N 低优先级进程。
- L 内存锁页Lock。
- s 进程的领导者(在它之下有子进程)。
- 位于后台的进程组。
dmsg
dmsg命令用来查看系统内核情况,如设备的链接、断开、故障等,以及系统运行内核日志,通过该命令查看内核日志、设备等情况,可以发现系统问题。