Linux 监控分析

一、硬件基础

Cpu   逻辑的处理、计算、判断

现代分时多任务操作系统对 CPU 都是分时间片使用的:比如A进程占用10ms,然后B进程占用30ms,然后空闲60ms,

再又是A进程占10ms,B进程占30ms,空闲60ms;如果在一段时间内都是如此,那么这段时间内的占用率为40%。

CPU对线程的响应并不是连续的,通常会在一段时间后自动中断线程。未响应的线程增加,就会不断加大CPU的占用。

指标:Cpu 利用率:供(用户进程+系统进程)干活的时间/总的时间

Cpu 利用率越高 进程等待时间切片的时间越来越长,代码处理等待时间越来越长

一个cpu 在同一瞬间只能处理一个任务,多个任务时,任务挂起,等待下个时间片

寄存器——cpu 上下文切换  怎么知道之前处理到哪了接下来需要干什么

查询指令:cat /proc/cpuinfo

内存  相当于闪存,cpu干活的地方(数据存放的地方)

查询指令:cat /proc/meminfo

硬盘   将重要的数据记录起来,以便未来再次使用这些数据

查询指令:fdisk -l (需要root权限)

No-sql 非关系型数据库数据存内存中:读取速度快

360安全管家清理的数据存在磁盘中

固态硬盘:快 分散式读写   & 机械硬盘  通道式的读写

二级缓存:介于cpu 与内存之间(日常 中很少用)

磁盘I/O

一切问题兼I/O (联系数据库读写操作理解)

理解数据库的执行过程

1、读取的数据越多,数据不在内存中的概率更大,需要从磁盘中读取写入内存,再从内存中通过cpu拿走。内存寻址

--大概率不在内存中:不是热点数据不在内存中

写的sql 性能不好(例如select * from students;)

2、写操作将数据写到内存,内存自动同步到磁盘。同步速度不够快则会造成数据丢失

 

面试题:cpu 、内存、磁盘之间的关系?

Cpu 相当于车间的工人,内存相当于车间,磁盘相当于仓库

怎么提高加工效率:加人、加大车间

二、Linux 监控分析命令

Top  命令

思考题1:

用户态、系统态

Root 用户起了Java进程消耗的是用户进程还是系统进程  —用户进程

Java进程写日志的时候(写入磁盘)是消耗用户进程还是系统进程  —系统进程(写日志的时候调用的是系统内核)

负载(load average)过去一分钟、过去五分钟、过去十五分钟的平均负载

思考题2:负载高cpu一定高么?cpu 低负载就一定低么?    不一定。

CPU  与负载有关系,但没有绝对关系

比如:

Cpu 正在调度的一个进程,时间片都给了这个进程 cpu 使用率高但负载不高

cpu 使用率20% ,但系统有大量等待I/O的返回  这个时候负载比较高

思考题3:负载怎么去理解?

类比:3条车道的马路

      0 1 2 3  4+以上就会出现排队

负载= cpu正在调度的进程(running)+正在等待I/O的进程之和

负载多少合理取决于cpu 颗粒数 

双核cpu 理论上负载小于等于2就可以

一般:负载是cpu颗粒数的 70%~80%

cpu使用率多少合适取决于什么类型的应用

I/O 密集型(常见)--  读取数据,建议cpu 不超过80%(us+sy)

CPU计算密集型-- 大部分时间都在做计算用 ,cpu 达到100% 也很正常

Vmstat 命令: r(running),不包含sleeping状态的进程  b(正在等待I/O的进程)

A – running(等待)—running(真,拿到时间片)—--等待I/o过程,中断不可恢复状态--中断不可恢复--running(真)

中断不可恢复(中断过程不可干预,一定会返回一个结果)是等待io返回 io返回后中断就恢复

中断可恢复是等待外部输入,比如外部input后恢复 这种不算入负载

B -running(等待)-- running(等待)             -- running(真,拿到时间片)     —等待input 操作(中断可恢复状态)--

c-running(等待) --running(等待)              --running(等待)                -- running(真,拿到时间片)---

                                             --负载为2                     --     负载为2

性能好坏的评估要结合负载与cpu 一起看

进程中存在的状态:running  sleeping(包含中断可恢复状态、中断不可恢复状态),同一瞬间只有一个running 状态  sleeping状态是大多数进程的状态

Kill -9 杀不掉进程的情况:该进程是中断不可恢复状态

网络带宽:

看cpu-Top 命令:

三个区域

Us  用户进程

Sy  系统进程

Ni 改变过优先级的进程

Id 空闲cpu

Wa 等待

Hi 硬中断

Si 软中断

St 强制内存交换

Mem (物理内存)

虚拟内存(swap):在磁盘上开辟一块空间当作内存使用,但是会利用内存已分配过但不再使用的物理内存的空间

大部分在磁盘上小部分在内存上。

用到虚拟内存的话,进程就会卡

缓存:把频繁的数据缓存起来,当作缓存。下次用到时从缓存中读取,快。

缓冲:把要同步到磁盘的文件缓冲起来,写入磁盘

Mem-Buffer 缓冲

Swap -Cache 缓存

缓存与缓冲不占用本身的内存

Linux中Buffer和Cache的区别

1. Cache:缓存区,是高速缓存,是位于CPU和主内存之间的容量较小但速度很快的存储器,因为CPU的速度远远高于主内存的速度,

CPU从内存中读取数据需等待很长的时间,而  Cache保存着CPU刚用过的数据或循环使用的部分数据,这时从Cache中读取数据会更快,减少了CPU等待的时间,提高了系统的性能。

  Cache并不是缓存文件的,而是缓存块的(块是I/O读写最小的单元);Cache一般会用在I/O请求上,如果多个进程要访问某个文件,

可以把此文件读入Cache中,这样下一个进程获取CPU控制权并访问此文件直接从Cache读取,提高系统性能。

2. Buffer:缓冲区,用于存储速度不同步的设备或优先级不同的设备之间传输数据;通过buffer可以减少进程间通信需要等待的时间,

当存储速度快的设备与存储速度慢的设备进行通信时,存储慢的数据先把数据存放到buffer,达到一定程度存储快的设备再读取buffer的数据,在此期间存储快的设备CPU可以干其他的事情。

Buffer:一般是用在写入磁盘的,例如:某个进程要求多个字段被读入,当所有要求的字段被读入之前已经读入的字段会先放到buffer中。

 

Java系统基本不需要关注内存的使用率(内存溢出)的情况-- —  初始化的时候分辟一块内存使用空间,4G内存初始化的时候分配3G cpu使用率为75% 

Mjava=heap+noheap+direct m

非java系统需要考虑内存的使用率,比如C --

交互区   java是线程模式

进程区 cpu 不可能超100%

任务区 每个任务都有可能超100% -多核cpu

virt进程所占的内存

Res 进程所占的物理内存

Shr  共享内存

Uptime  查看负载

Vmstat 

Vmstat 2  每隔2s打印情况 可以看进程队列、i/O的使用情况

Sar  2(delay)  4 (count)

Sar -q 2 4

Runq-sz  正在运行的进程队列

Plist-sz   当前系统进程(非正在运行的进程)与线程之和

看内存-top free -m sar 命令

看内存是否充裕

Si 从内存到磁盘 swap in

So  从磁盘到内存 swap out

Iostat

Sar -B ,-r -w

百度:linux 内存 缺页

缺页计算逻辑

看磁盘-iostat ,sar -d

Device 区域  tps   io 次数

 iostat -x

rrqm/s  wrqm/s  合并

r/s  w/s 

看网络-netstat  -i ,tcpdump

 

总结:(01:45)

Cpu:使用率 负载 队列 -- top  sar iostat vmstat

内存:pgin  pgout  剩余  swap 使用  --sar  top  vmstat  free

磁盘:r/S w/S  队列 操作时间(整体服务时间) busy--iostat -x, sar -d,nmon

网络:上行 下行 丢包 --–netstat nmon

分析:

Cpu 使用率一般不超过80%   (us+sy)

us 过高,系统进程占的cpu 过高,进程等待时间切片的时间越来越长

Cpu 使用异常,平时保存在10%,突然一天到达40%

负载数:小于等于cpu 颗粒数

负载大于cpu颗粒数:有很多等待进程。

对于cpu 来说首先看负载,负载高看cpu 高不高

1、看cpu使用情况,使用率高解决使用率高的问题;

2、使用率不高看进程队列 sar  -q   vmstat

看正在调度的进程数高还是等待io 的进程数高

等待io 的进程数高说明等待服务器的返回,看下等待什么东西的返回

如果是cpu正在调度的进程数高,说明进程起多了或cpu 在时间切片内没有执行完还在继续干活

 Cpu 使用率过高--查cpu过高的原因:

user(用户进程高,查哪个用户进程占用率高。Java  查看java 下哪个线程使用率过高,把线程栈信息打印出来;

看这个占cpu 线程比较高的栈正在执行的方法)

system (系统进程高,系统内核调度:I、大量磁盘io导致(判断是否io导致:看磁盘队列、看磁盘繁忙程度(nmon)-超过30% 具体是磁盘读还是写导致的。读磁盘-内存不够了,

需要从磁盘中拿数据了;写磁盘导致-系统写操作太多,减少写操作,查看应用程序中有哪些写操作   比如写日志、info日志级别就好,少用debug;写很多文件 将写操作合并或减少写操作)

II、中断(上下文切换,1、频繁进程抢占(进程优先级抢占  top  );2、这个时间片内未调度完(程序执行慢)   top 中hi si  vmstat 中system 的cs in 指标 )

上下文切换,从这个进程切换到下一个进程 ,说明在这个时间片内当前任务没有执行完强制切换到下一个时间片,要不就是进程在频繁的抢占

Strace  终极命令  系统使用率过高时分析不出问题的话可用该命令 看完之后就没有然后了

 

是根据系统内核调用的命令

系统内核调用哪个模块调用了多少次

cpu 负载

内存:top  命令 看free 是否持续减少,并且swap有没有持续上升

磁盘:nmon  中的busy 超过30% 说明磁盘比较繁忙

队列  Sar -d  iostat -x ( await  svctm )

有排队现象看 读多还是写多

网络:netstat -i  /tcpdump (没讲) 看上行、下行 ,是否丢包

nmon 使用

原文地址:https://www.cnblogs.com/chendai21/p/9467817.html