• 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 使用

  • 相关阅读:
    JAVA中的注解小结
    终结任务
    共享资源访问
    基本线程机制
    HashSet、LinkedHashSet、TreeSet
    EnumMap
    LinkedHashMap及其源码分析
    集合迭代器快速失败行为及CopyOnWriteArrayList
    LinkedList
    比特币中的Base58 编码
  • 原文地址:https://www.cnblogs.com/chendai21/p/9467817.html
Copyright © 2020-2023  润新知