10.1 使用w查看系统负载
[root@aminglinux-01~]# w
21:32:32 up 3:59, 1 user, load average: 0.08, 0.02, 0.01
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.247.1 21:32 0.00s 0.15s 0.09s w
第一行:时间、系统运行时间、登陆用户数、平均负载
下面的信息,告诉管理员有哪些用户登陆,登陆设备是什么,来自哪个IP,登陆时间,空闲时间,当前终端的所有进程占用的CPU时间,当前命令占用的CPU的时间。最需要关注的是第一行load average 后面的三个数值。
第一个值表示 1 分钟内系统的平均负载值,1分钟之内有多少个进程和任务在使用cpu,计算,排队等
第二个值表示 5 分钟内系统的平均负载值
第三个值表示 15分钟内系统的平均负载值
1分钟内的反应的比较真实,第一个数值比较精准的反应当前CPU的情况。
平均负载值代表单位时间段内 CPU 活动进程数。CPU在某一时刻,只能给一个任务或进程提供服务,其他的进程按优先级大小排队,然后进行CPU进行计算。值越大说明服务器压力越大。一般情况下这个值不超过 CPU 数量就没有关系。如果 CPU 数量为8,值小于8就没有问题。
如果超过了,那么最后的进程则需要排队等待处理,说明负载偏高,负载过高,就要想办法查看什么进程引起的负载高,要调整优化。top看哪个进程排在最上面,最上面的说明耗费cpu比较多,针对那个进程去优化。比如mysql占用cpu高,那么就去查看mysql的慢查询日志,看看是不是可以通过优化sql语句来提升mysql的查询效率,这样就降下来了。 如果即使调优了还是高,说明cpu不够用啦,只能增加机器扩容。
#uptime 查看系统负载
21:49:22 up 4:16, 1 user, load average: 0.00, 0.00, 0.00
返回结果,和 w 返回信息的第一行一致。
#top 也可以查看系统负载 查看服务器cpu情况
[root@aminglinux01~]# cat /proc/cpuinfo
processor : 0 processor 处理器,逻辑CPU个数0单核,1双核.......7=8核
vendor_id : GenuineIntel
cpu family : 6
model : 78
model name : Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz
stepping : 3
cpu MHz : 2400.059
cache size : 3072 KB cache 缓存
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss nx rdtscp constant_tsc up arch_perfmon pebs bts tsc_reliable nonstop_tsc aperfmperf unfair_spinlock pni pclmulqdq ssse3 sse4_1 sse4_2 movbe popcnt aes hypervisor 3dnowprefetch ida arat epb xsaveopt pln pts dts
bogomips : 4800.11
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
/proc/cpuinfo 记录了cpu的详细信息。目前市面上的服务器很多是2颗4核cpu,在Linux看来,就是8个cpu。flags 如果有 ht 说明支持超线程技术。
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数
# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq
# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l
[root@aminglinux01 ~]# w 【显示两个终端登陆】
16:10:51 up 11:52, 2 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - 04:19 23:45 0.18s 0.18s -bash 【虚拟机登陆信息】
root pts/0 192.168.247.1 15:47 0.00s 0.28s 0.02s w 【远程连接工具登陆信息】
[root@aminglinux01~]# skill -9 tty1 【关闭虚拟机终端】 skill , 不是 kill
[root@aminglinux01 ~]# w
16:11:16 up 11:52, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.247.1 15:47 0.00s 0.30s 0.02s w
10.2 vmstat命令
w ;uptime 可以查看系统整体负载,通过数值可以判断系统有没有压力。但是具体是哪里出了问题,cpu? 内存?磁盘?并无法给出判断。通过vmstat可以指定具体是哪里有压力。
#vmstat 1 【每间隔1秒输出一次,且一直输出,直到ctrl c 停止】
#vmstat 1 5 【每间隔1秒输出一次,一共输出5次】
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 1346596 21696 494320 0 0 7 31 21 15 0 1 99 0 0
0 0 0 1346588 21696 494344 0 0 0 0 25 12 0 1 99 0 0
0 0 0 1346588 21696 494344 0 0 0 4 17 18 0 1 99 0 0
0 0 0 1346588 21696 494344 0 0 0 0 17 12 0 0 100 0 0
0 0 0 1346588 21696 494344 0 0 0 0 14 10 0 0 100 0 0
r(分配几个进程) b(阻塞io阻塞)
buff(内存和磁盘写入磁盘) cache(cpu和内存读出磁盘)
si(0) so(0)
bi(in cpu) bo(out cpu)
us(进程占用cpu) wa(等待)
vmstat显示的信息分6部分。
1、procs [p'rɒk] 程序,进程
r run 1秒内运行和等待CPU时间片的进程数,这个值如果长期大于系统CPU个数,就说明CPU资源不足,可以考虑增加CPU;
b block 被阻塞的,表示等待资源的进程数,任务数据等待写入磁盘,被I/O阻塞的任务有多少,网络、磁盘、I/O都有关,这列值如果长时间大于1,需要关注一下。
2、memory 内存相关信息
swpd 切换到交换分区中的内存数量,数值不变,说明每次没问题,如果数值很大,且不断的在变更,说明内存不够,或者内存溢出。切换到内存交换区的内存数量(以KB为单位)。如果swpd的值不为0或者比较大,而且si、so的值长期为0,那么这种情况一般不用担心,不会影响系统性能;
free 当前空闲的内存数量
buff 缓冲大小,即将写入磁盘的
cache 缓存大小,从磁盘中读取的,
一般作文件系统的cached,频繁访问的文件都会被cached。如果cached值较大,就说明 cached文件数较多。如果此时IO中的bi比较小,就说明文件系统效率比较好。
3、swap 内存交换情况
si 交换分区写入内存的数据量 swap into memory
so 内存写入到交换分区的数据量 swap out of memory
没有说两个数值一直是0,或者很小很小的值,没变化,很稳定,说明内存够;如果长期大于0,而且不断的变化,说明内存不够。
4、io 磁盘使用情况
bi 从块设备读取数据的量 读磁盘 into memory
bo 从块设备写入数据的量 写磁盘 out of memory
这里设置的bi+bo参考值为1000,如果超过1000,而且wa值比较大,则表示系统磁盘IO性能瓶颈。
5、system 显示采集间隔内发生的中断次数
in 某一时间间隔中,观察到的每秒设备中断数
cs 每秒产生的上下文切换次数
CS,上下文切换属于cpu的一个范畴,简单讲就是cpu不能在同一时刻去处理多个任务,只能在一个时间点处理一个任务,但是每个任务分配的时间片是有限的,所以,任务任务1走完给它分配的时间片,就该任务2占用cpu了,这时候任务1到任务2就是上下文切换。 两列值不宜过高,平常不作为参考值。
6、CPU 显示cpu的使用状态
us user 显示用户所花费 cpu 时间的百分比,常年高于50或接近100,说明某进程占用很大的资源,需要进行优化。
sy system 显示系统花费 cpu 时间百分比
id idle ['aɪd(ə)l] 限制的,停顿的 cpu 处于空闲状态的 时间百分比
wa wait 表示I/O(网络或者磁盘)等待所占用cpu 时间百分比
st steal表示被偷走的cpu所占 时间百分比 一般为0,不用关注
us 就是我们给系统安装的一些应用、服务等耗费的cpu, sy就是系统内核自己的服务耗费的,id就是空闲的。steal这一数值,很少有不为0的情况,虚拟机里,比如现在的云主机,如果运营商把8核cpu的宿主机做了20台单核的虚拟机,那很有可能会出现这个值不为0的情况,如果出现了,就去找运营商理论。
loadaverage 和 us 要结合着一起看。loadaverage表示1分钟之内在使用或等待CPU的进程数量,vmstat中的us表示系统中的应用和服务消耗的CPU。
10.3 top命令
#top 【动态监控进程所占系统资源,每间隔3秒变一次】
top - 22:12:42 up 4:39, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 79 total, 1 running, 78 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.3%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st
Mem: 1938820k total, 592852k used, 1345968k free, 21888k buffers
Swap: 4194296k total, 0k used, 4194296k free, 494396k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2718 root 20 0 2568 1100 880 R 0.7 0.1 0:00.62 top
1 root 20 0 2900 1428 1216 S 0.0 0.1 0:01.67 init
top的特点是把占用系统资源(cpu,内存,磁盘IO等)最高的进程放到最前面。
top命令打出了很多信息,包括系统负载(loadaverage),进程数,cpu使用情况以及交换分区的使用情况。
重点在下面的进程使用系统资源详细情况列表,%CPU、%MEM、COMMAND 比较重要,RES 这一项为进程所占内存大小,而%MEM表示进程使用内存百分比。输出结果%CPU列的总和可以超过100%,最高是cpu核数x100 比如,4核cpu,最高就是400% 这样cpu就算跑满了。
top 状态下,按 shift + m或者M 可按照内存使用大小排序(注意 %MEM选项),P返回。
top 状态下shift+ > 翻看下页的进程情况
top 状态下 shift + < 翻看上一页的进程情况
PR和NI PR为线程优先级,范围[0, 40),实时优先级的线程显示为RT。值越小优先级越高 NI为Nice值,范围[-20, 20),PR值为初始线程优先级加上Nice值。
VIRT virtual 虚拟内存
RES reserve 物理内存使用情况
SHR share共享内存。所谓共享内存就是系统内核分配一部分内存让多个进程同时使用,目的是为了让它们之间通信方便。
S 进程状态
TIME+ 使用CPU的时间
top状态下,按数字 1 可以列出各颗 cpu 的使用状态,多核机器有效
注意第三行 cpu 处的变化
top状态下
h 查看帮助信息
z,B 更改显示颜色,更改粗体显示,bold粗体的
l,t,m 显示隐藏load average,task/cpu 状态,mem info
u 后面跟用户名,只显示特定的用户
n 后面跟数字,只显示一定数量的进程,0不限制
k kill进程
q 退出
c 显示详细command信息
#top -d 1 每间隔1秒刷新一次
#top -d 1 -c 没间隔1秒刷新一次,command命令显示更全面
#top -bn1 【一次性列出全部进程,非动态显示】
该用法可写在脚本中
10.4 sar命令
可以监控系统所有资源状态。平均负载、网卡流量、磁盘状态、内存使用等等。不同于其他系统状态监控工具的地方在于,它可以打印历史信息,可以显示当天从零点开始到当前时刻的系统状态信息。yum install -y sysstat 安装此命令。up
初次使用会报错,因为sar工具还没生产相应的数据库文件(实时监控就不会报错,因为不用去查询那个库文件)。数据库文件在/var/log/sa/ 目录下。
sar -n DEV #查看当天从零点到当前时间的网卡流量信息
sar -n DEV 1 10 #每秒显示一次,共显示10次
sar -n DEV -f /var/log/sa/saxx #查看xx日的网卡流量历史
sar -q #查看历史负载
sar -b #查看磁盘读写
1、查看网卡历史流量 重点掌握
#sar -n DEV
IFACE 表示设备名称
rxpck/s 每秒接收的包的数量
txpck/s 每秒发出的包的数量
rxKB/s 每秒接收的数据量,单位KByte 1KB=1000byte=8000bit
txKB/s 每秒发出的数据量,单位KByte
若服务器丢包非常严重,需要查看网卡流量是否异常。接收数据部分 rxpck大于4000,或者rxKB大于5000,则有可能被攻击了,正常服务器网卡流量没有这么大。除非自己在拷贝数据。 计算实际速度,取 rxkb或txkb的峰值,换算成KB,比如是686KByte,然后用686*8/1000=5.4MBit
Bytes 字节,缩写为B 【电脑硬盘的最小单位】
bit 位, 1Byte=8bit 【网络中最小的单位】
bps =bit per second 每秒位数
pps =package per second 每秒数据包 Mb ,Gb,10Gb
10Gb=10000Mb 【电脑中1GB=1024MB,网络中1Gb=1000Mb】
宽带10Mb,下载速度是1.25MB,10Mb=10Mbit 10Mbit/8=1.25Mbyte=1.25MB
2、查看某一天的网卡历史流量
Redhat 或者 CentOS 发行版 sar 的库文件一定是在 /var/log/sa/ 目录下。ls /var/log/sa/ 发现下面两种类型的文件,sa开头加日期,sar开头加日期,sa开头的文件不能直接cat,只能用 sar -f 查看,sar开头的可以用cat查看。
sar 命令会每个月循环使用,这个月sa01查看的是这个月1号的网卡流量,不能查看再之前的网卡流量。
#sar -f /var/log/sa/saDD DD表示数字,25表示25号,29表示29号
3、实时查看网卡流量
#sar -n DEV 1 5 【每间隔1秒刷新一次,共5次】
[root@thinkpad ~]# sar -n DEV 1 5
Linux 2.6.32-431.el6.i686 (thinkpad) 02/15/17 i686 (1 CPU)
23:12:04 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
23:12:05 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
23:12:05 eth0 1.01 0.00 0.06 0.00 0.00 0.00 0.00
4、查看历史负载
#sar -q
05:40:01 PM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
【1分钟】【5分钟】【15分钟】
05:50:01 PM 0 75 0.00 0.00 0.00
Average: 0 75 0.00 0.00 0.00
5、查看磁盘
#sar -b
Linux 2.6.32-431.el6.i686 (wangbin) 02/20/2017 i686 (1 CPU)
【每秒写】【每秒读】
05:40:01 PM tps rtps wtps bread/s bwrtn/s
05:50:01 PM 0.13 0.00 0.13 0.00 1.28
Average: 0.13 0.00 0.13 0.00 1.28
6、显示CPU的状态
#sar -p 【-p或者-u ,也可以不加,sar默认显示CPU状态】
Linux 2.6.32-431.el6.i686 (wangbin) 02/20/2017 i686 (1 CPU)
05:40:01 PM CPU %user %nice %system %iowait %steal %idle
05:50:01 PM all 0.01 0.00 0.25 0.00 0.00 99.74
06:00:02 PM all 0.03 0.00 0.44 0.01 0.00 99.53
Average: all 0.02 0.00 0.34 0.00 0.00 99.64