一、硬件基础
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 使用