CPU内存磁盘监控分析

CPU内存磁盘监控分析

Posted by 青夜梓藤 on 2019-05-10

1 什么决定操作系统的运行速度

1)CPU
计算、逻辑处理,CPU 只在内存中工作—-最影响电脑性能

2)内存
读取数据(临时),相当于闪存—-其次影响电脑性能

3)磁盘

存储数据——-最次影响电脑性能

4)其他
① 显卡
决定清晰度

②SSD(固态硬盘)
为什么 SSD 比机械硬盘快,分布式写操作,传统机械硬盘是逻辑写

③swap
是磁盘开辟出来的,SWAP 用的是磁盘的空间。把磁盘中的一片空间拿出来,映射为内存

④ 高速缓存
内存和 CPU 之间的一块区域,高速缓存比内存速度还快,集成在 cpu 上。CPU 的工作速度高,但内存的工作速度相对较低,为了解决这个问题,通常使用高速缓存,高速缓存的存取速度介于 CPU 和内存之间。系统将一些 CPU 在近几个时间段经常访问的内容存入高速缓冲,当 CPU 需要使用数据时,先在高速缓存中找,如果找到,就不必访问内存了,找不到时,再找内存,这样就在一定程度上缓解了由于主存速度低造成的 CPU“停工待料”的情况。

⑤ 虚拟内存
特别特别慢,现在内存很便宜,基本不用虚拟内存了,直接用物理内存

⑥buffer
缓冲,文件要写磁盘的,磁盘写,频繁要往磁盘写的文件

⑦cache
缓存,介于 cpu 与内存之间的东西,缓存是从磁盘到内存,磁盘读

2 CPU、内存、磁盘间的关系

CPU:相当于车间里面的工人

内存:相当于车间

硬盘:相当于仓库

  • 工厂里只有工人干活,工人在车间干活,干活需要的材料放在仓库

  • 提高生产效率的方法:首先是加工人,相当于增加 CPU 的颗粒数,工厂里的工人数越多,生产效率就越高;其次就是提高工人的操作熟练度,相当于增加 CPU 的频率,即切片数;再次是在工人没法增加的情况下,把车间加大,也就是增加内存也能提高生产效率,车间增大后,一次性从仓库取货变多,减少车间与仓库的交互次数,节省时间,且一次性加工的货物数量也能增多;最后就是把仓库提升一下,把仓库搬离车间近一点,也就是弄一个高度通道,提升磁盘访问速度。

3 虚拟内存和物理内存的区别

虚拟内存是在硬盘上开辟一块区间当做内存使用,但实际虚拟内存还是硬盘,所用虚拟内存很慢,现在基本不用。

4 4 核 CPU,同时开 8 个进程为什么会不卡?

卡不卡跟 CPU 的频率有关,CPU 的频率决定了 CPU 进行时间切片的片数。假设 1s 内把 CPU 切成 1000 片,时间片先给 A 任务,再给 B 任务,再给 C 任务…如果后面再没有排队的任务了,后面的时间片就再重新给 A 任务,B 任务,C 任务…如果在这一个时间片内任务完成了,则不会卡,如果在分配的时间片内没完成,由于时间片都已经分出去了,现在就只能等待了,就会感觉到卡。

5 linux 下查看 cpu、内存信息

1)查看 CPU 颗粒数
输入 top 命令再按 1,如下为单核

image

2)查看 CPU 频率
cat /proc/cpuinfo,如下 cpu 是 2.6GHZ

image

3)查看内存信息

image

6 负载、CPU 使用率

1)load average
当前正在 CPU 调动的进程以及正在等待 io 的进程之和。top、uptime 命令都可看负载信息

2)系统 CPU
系统内核调度时才会使用系统 CPU,磁盘 io,进程上下文切换都会调用系统内核。

3)用户 CPU
用户进程在运行过程中消耗的 CPU

image

image

4)附加说明
① 负载跟 cpu 颗粒数的关系
保持 1:1 的关系即可,业界也有说法负载是 CPU 颗粒数的 70%-80%。

②CPU 使用率高负载一定高吗,CPU 使用率低负载一定低吗?
通常情况下 CPU 使用率高负载就高,但也有例外情况。如某个进程在做复杂的运算,负载就只有 1,此时是 CPU 使用率高,负载低的情况。如大大量的 io 等待进程,如等待第三方连接、读第三方的 member cache,此时 CPU 使用率低但负载很高。

③ 启了一个 java 服务,会写日志,会读写磁盘,消耗的 cpu 是用户 cpu 还是系统 cpu,为什么?
消耗系统 CPU,写磁盘和读磁盘时切换到内核,由内核进程去操作系统磁盘。尽量避免大量占用系统 cpu,不然用户 cpu 干活就少了

7 上下文切换、中断

1)进程切换
进程在这个时间片内没有把这件事情做完,时间到了 cpu 会把这个进程从时间片里让出来,然后丢给下个进程,下个进程开始干活。进程进行切换时需要保存当前进程执行的状态,状态包括上下,上是值执行到哪个环节,使用哪个地址空间,下是指再次拿到时间片后该继续执行什么操作。

2)中断
进程在这个时间片内,没执行完,产生了中断。中断分为软中断和硬中断。

① 软中断:
内部因素,时间片没了,时间片内执行不完。

② 硬中断:
外部因素,强制终止,如从键盘读取一个值才能继续执行,此时必须接受外部的字符串,不能连续执行,先挂起进程,只有拿到字符串之后才能继续执行。

③ 中断一般什么原因产生?
等待磁盘 io,等待外部设备的数据,时间片到了进程没处理完让出时间片也会产生中断。

举例:假如单核 cpu,启动三个进程 abc,刚启动时 abc 都是 running 状态,但此时的 running 是个假 running,都还没拿到 cpu,加入 a 比较快,抢占到 cpu,状态变化如下

image

8 vmstat 查看 CPU、内存、磁盘

vmstat 可以对操作系统的内存信息、进程状态、CPU 活动、磁盘等信息进行监控,不足之处是无法对某个单独进程进行查看。

image

1)procs
r:表示运行和等待 CPU 时间片的进程数(相当于负载),这个值如果长期大于 CPU 颗粒数,则表示 CPU 不足,需要增加 CPU。

b:表示在等待资源的进程数,比如正在等待 io 或内存交换。

2)memory
swpd:虚拟内存的大小,单位 KB,如果 swap 值不为 0 或者比较大,只要 si、so 的值长期为 0,这种情况一般属于正常情况。

free:表示当前空闲的物理内存(单位 KB)。

Buff:缓冲大小,一般对设备的写才需要缓冲,频繁往磁盘写。

Cache:缓存大小,一般读文件需要缓冲,频繁访问的文件都会被缓存,如果 cache 值非常大说明缓存文件比较多,如果此时 io 中的 bi 比较小,说明文件系统效率比较好。

3)swap
Si:表示由磁盘调入内存,也就是内存进入内存交换区的内存大小。

So:表示由内存进入磁盘,也就是由内存交换区进入内存的内存大小。

一般情况下,si、so 的值都为 0,如果 si、so 的值长期不为 0,则说明系统内存不足,需要增加系统内存。

4)Io
bi:表示由块设备读入数据的总量,即读磁盘,单位 kb/s。

bo:表示写到块设备数据的总量,即写磁盘,单位 kb/s。

如果 bi+bo 值过大,且 wa 值较大,则表示系统磁盘 IO 瓶颈。

5)system
In:表示某一时间间隔内观测到的每秒设备中断数。

cs:表示每秒产生的上下文切换次数。

这 2 个值越大,则由内核消耗的 CPU 就越多。

6)CPU
us:表示用户进程消耗的 CPU 时间百分比,us 值越高,说明用户进程消耗 cpu 时间越多,如果长期大于 50%,则需要考虑优化程序或者算法。

sy:表示系统内核进程消耗的 CPU 时间百分比,一般来说 us+sy 应该小于 80%,如果大于 80%,说明可能出现 CPU 瓶颈。

id:表示 CPU 处在空闲状态的时间百分比。

wa:表示等待所占的 CPU 时间百分比,wa 值越高,说明 I/O 等待越严重,根据经验 wa 的参考值为 20%,如果超过 20%,说明 I/O 等待严重,引起 I/O 等待的原因可能是磁盘大量随机读写造成的,也可能是磁盘或者此监控器的带宽瓶颈(主要是块操作)造成的。

综上所述,如果评估 CPU,需要重点关注 procs 项的 r 列值和 CPU 项的 us、sy、wa 列的值。

9 CPU 监控

1)怎么看 CPU 使用情况
① 看负载,负载越高,压力越大,跟 CUP 颗粒数比较,大于 cpu 颗粒数,排队

② 看 CPU 使用率,CPU 使用率可简单理解为给进程用的时间片/总的时间片。如果 CPU 使用率高,则分析系统 CPU 高还是用户 CPU 使用率高,常见的是用户 CPU 使用率高。用户 CPU 高,那一定是程序占用的,系统 cpu 高 30%概率是磁盘 io 频繁导致,NI CPU 高,说明程序设置了优先级,且优先级高的进程在频繁调用(这种情况很少),中断 CPU 高,说明在频繁设备交互或程序内部 CPU 切换。

2)top 命令查看时发现中断所占的 CPU 高怎么办
中断 CPU 高,可看一下系统 CPU 是不是也高,如果系统 cpu 也高,就用 vmstat 看一下中断次数和上下文切换次数,如果中断次数和上下文切换次数也都比较高(上下文切换次数大没有明确的定义,跟 CPU 的颗粒数有关,经验判断单核上文切换次数不超过 2000 就不大),基本就可以确定是中断导致了上下文切换高,导致系统 CPU 占用高,接下来就是分析为什么会产生中断,具体问题具体分析。

3)CPU 监控

image

  • %usr:用户进程消耗的 CPU 时间百分比。

  • %nice: 运行优先级高进程消耗的 CPU 时间百分比。

  • %system:系统进程消耗的 CPU 时间百分比。

  • %iowait:I/O 等待所占 CPU 时间百分比。

  • %steal:在内存紧张环境下,pagein 强制对不同的页面进行的 steal 操作。

  • %idle:CPU 空闲状态的时间百分比。

在所有的显示中,我们应主要注意%wio 和%idle,%wio 的值过高,表示硬盘存在 I/O 瓶颈, %idle 值高,表示 CPU 较空闲,如果%idle 值高但系统响应慢时,有可能是 CPU 等待分配内存, 此时应加大内存容量。%idle 值如果持续低于 10,那么系统的 CPU 处理能力相对较低,表 明系统中最需要解决的资源是 CPU

10 内存监控

1)top 命令查看内存

image

2)free 命令查看内存

image

3)Java 应用程序不用管内存使用率,非 java 性需要关注内存使用率
java 虚拟机,启动程序时会开辟一块内存供应用程序使用使用,可能 java 程序一运行,内存使用率就达 70%多。java 程序只用考虑:GC、内存溢出问题。

11 磁盘监控

1)iostat -x
iostat 是对系统的磁盘 I/O 操作进行监控,它的输出主要显示磁盘读写操作的统计信息,同时给出 CPU 的使用情况。同 vmstat 一样,iostat 不能对某个进程进行深入分析,仅对操作系统的整体情况进行分析

image

① 各字段含义
rrqm/s:每秒进行 merge 的读操作次数,即 delta(rmerge)/s 。 Ø

wrqm/s:每秒进行 merge 的写操作次数,即 delta(wmerge)/s 。 Ø

r/s:每秒完成的读 I/O 设备次数,即 delta(rio)/s 。 Ø

w/s: 每秒完成的写 I/O 设备次数,即 delta(wio)/s 。 Ø

rsec/s:每秒读扇区数,即 delta(rsect)/s。 Ø

wsec/s:每秒写扇区数,即 delta(wsect)/s Ø

rkB/s:每秒读 K 字节数,是 rsect/s 的一半,因为每扇区大小为 512 字节。 Ø

wkB/s:每秒写 K 字节数,是 wsect/s 的一半 Ø

avgrq-sz:平均每次设备 I/O 操作的数据大小 (扇区),即 delta(rsect+wsect)/delta(rio+wio) 。 Ø

avgqu-sz:平均 I/O 队列长度,即 delta(aveq)/s/1000 (因为 aveq 的单位为毫秒)。 Ø

Await:请求队列中等待时间+svctm(服务时间) 单位是毫秒,按照每次 IO 平均。 即 delta(ruse+wuse)/delta(rio+wio) 。 一般地系统 IO 响应时间应该低于 5ms,如果大于 10ms 就比较大了。 这个时间包括了队列时间和服务时间,也就是说,一 般情况下,await 大于 svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。 Ø

svctm:平均每次设备 I/O 操作的服务时间 (毫秒),即 delta(use)/delta(rio+wio) 。 Ø

%util:一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的, 即 delta(use)/s/1000 (因为 use 的单位为毫秒) 。

② 分析磁盘是否有问题

  • 首先看磁盘队列,如果磁盘队列长度大于 1,磁盘严重有问题

  • 其次是看是读有问题还是写有问题

读多,内存不够(内存小数据量大、没建索引)

写多,写日志,数据库 insert/update、同步操作(数据库集群数据同步、主从数据同步)

2)sar -d
sar 是非常强大性能分析命令,通过 sar 命令可以全面的获取系统的 CPU、运行队列、磁盘 I/O、交换区、内存、cpu 中断、网络等性能数据

image

  • tps:每秒从物理磁盘 I/O 的次数.多个逻辑请求会被合并为一个 I/O 磁盘请求,一次传输的大小是不确定的。

  • rd_sec/s:每秒读扇区的次数。

  • wr_sec/s:每秒写扇区的次数。

  • avgrq-sz:平均每次设备 I/O 操作的数据大小(扇区)。

  • avgqu-sz:磁盘请求队列的平均长度。

  • await:从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1 秒=1000 毫秒)。

  • svctm:系统处理每次请求的平均时间,不包括在请求队列中消耗的时间。

  • %util:I/O 请求占 CPU 的百分比,比率越大,说明越饱和。

  • avgqu-sz 的值较低时,设备的利用率较高。

  • 当%util 的值接近 1% 时,表示设备带宽已经占满。

3)看磁盘大小和使用率:df

image

12 常用命令总结

1)top
c:显示路径

H:显示线程

l:不显示负载

shift + p :按 cpu 使用率排序

shift + p :按内存进行排序

top -p 21308(pid)单独监控某个进程

2)vmstat
vmstat 2 :2s 监控一次

vmstat 2 3:2s 监控一次,监控 3 次

3)iostat
Iostat -x

4)如何看操作系统位数
uname -a:如果返回结果中有_64,就是 64 位,否则就是 32 位

5) sar 命令选项结合起来判断系统瓶颈问题

  • 怀疑 CPU 存在瓶颈,可用 sar -u 和 sar -q 等来查看

  • 怀疑内存存在瓶颈,可用 sar -B、sar -r 和 sar -W 等来查看

  • 怀疑 I/O 存在瓶颈,可用 sar -b、sar -u 和 sar -d 等来查看