day13

mac2022-06-30  23

linux性能:cpu/内存/io/网络

cpu:负载/cpu使用率

  负载:系统正在运行以及正在等待io的进程的一个数量,大概可以反应系统是否紧张  vmstat中的r跟b列   r(运行和等待的进程)   b(中断不可恢复的进程)

  cpu使用率:用户态和内核态   hi si  st(软硬中断和steal也算在cpu使用率中)    nice和ideal不算cpu使用率 

  用户态:

  内核态:底层操作都是内核态

  ni:0~-20,越小级别越大

  wait:等待磁盘操作所消耗的cpu,全称叫iowait

  硬中断:硬件外设产生的中断     

  软中断:软件本身产生的中断

  上下文:上文-从哪取数据,下文-下面要执行啥操作

  上下文切换:1.进程与进程之间(消耗cpu是这几种中最高)    2.进程内部(us->sy)     3.线程跟线程     4.中断导致的

内存:物理内存和虚拟内存和交换内存(swap)    进程先在虚拟内存中运行,然后不够,溢出到物理内存。最后实在不行,才到交换内存

  物理内存和虚拟内存用的其实都是物理内存

  buffer:缓冲的是要写的数据,文件系统到内存的读写数据

  cache:缓存的是要读的数据,磁盘到内存的裸io数据

磁盘:好坏看读写的速度,使用程度

io:

网络:网络先触发的是硬中断,然后是软中断

 

下面开始讲一些案例:

命令不懂的就自己--help查看

stress --cpu 1 --timeout 600

1.首先就top命令:

时间长可以看出负载越来越高,慢慢接近1

 2.通过vmstat 

procs: 负载=r+b      因为这里r一直有进程在执行,所以负载接近1.因为只有一个cpu在干活,所以负载没法到2

in:中断   cs: 上下文切换

 

stress -i 1 --timeout 600

1.先top,可以看出负载升高,sy cpu升高。

这个系统的wait坏了,监控不出来。这里的wait应该是会升到10%左右。那就是iowait导致的(所以我们要看io的问题,iostat  pidstat)

解决这个问题可以用stress-ng:stress的升级版

 iostat -x  2      %util:代表磁盘的繁忙程度(超过了20%,可以看出是写操作导致的)

也可以用pidstat -d 1看(然后用pidstat -d可以看出具体是哪个消耗的)

--

 

stress -c 8 --timeout 600

可以看到负载慢慢会升到8,因为8个stress一直在消耗cpu

通过vmstat可知,r+b=8

pidstat也可以看:

这里面的wait是等待cpu临幸所消耗的百分比。等待cpu时间切片给他。所以和上面的wait数值不一样 

等待的话,说明上下文切换和中断会比较多。虽然没上10W,但是肯定也比平时高 

 

sysbench --threads=10 --max-time=300 threads run //sysbench --threads=10 --time=300 threads run

1.top   sy比较高 (下一步分析谁占用的内核态, wait  hi   si  st[虚拟化]都没有)

2.vmstat    上下文比较高(cs)

3.进程上下文切换低

4.发现原来是线程上下文切换高   pidstat -w    //   pidstat -wt

pidstat是按不同维度进行了排序,所以我们今天会一直看pidstat。这样找起来会很快

cswch:主动上下文切换,指进程无法获取所需资源,导致的上下文切换

nvcswch:被动上下文切换,指进程由于 时间片已到 等原因,被系统强制调度,进而发生的上下文切换

 

问题:为什么pidstat看的上下文切换不高,而vmstat特别高 因为pidstat默认看的是进程的 因为进程的最小单位是线程,我们可以pidstat -wt 1 这样就看的线程的

 

 

下午:

先运行app.py文件

发现负载较高,且iowait高。这个时候因为iowait高,所以,我们怀疑是磁盘出了问题

那么我就去看磁盘

 看util可以看出cpu已经很繁忙了

await,也很大。这个一般不超过5

wkb/s:写也多  ------磁盘写操作,导致iowait繁忙

队列也多

procs:r+b

 pidstat看出是python3           pidstat -d 1

然后可以用strace命令跟着这个进程,strace -p pid

可以看出在写文件

我们进入这个目录,发现他确实在写文件

然后使用lsof可以查看文件谁在使用。   4w是正在写的意思

分析到这之后,我们可以去看代码了

和iostat对比一下,可以确认就是写的问题

总结: 1.先观察系统,负载比较高 2.然后看vmstat的r+b,确实是r+b导致的。b比较多,b是中断不可恢复(io操作最常见的) 3.继续top,负载高,cpu不算太高,但是iowait高,hi si软硬中断都不高(这步我们就怀疑是磁盘了) 4.iostat -x 2 发现在疯狂的写操作,导致我们的高负载(然后我们就要去看是什么进程导致的大量写) 5.pidstat -d 1(可以以进程维度去排序cpu io 磁盘 cs等等),发现是python进程大量的写 6.strace -p pid(应用程序我们需要定位到具体的原因),strace跟踪内核 7.发现是在写文件 8.我们用lsof fileName 去确认了一下,发现确实是这个样子9.cat 代码。确实是在写这个文件。ok?至此结束

 

接下来,我们执行另外一个文件,运行另外一个例子

没有flask文件,我们pip给他装一下

运行:什么都不高,但就是访问web工程贼慢

spotlight:可以动态话的监督很多东西

 

3个有道云笔记,看课件

 

cpu热点火焰图,大牛会用这个

 

平均负载高,我们就要去看vmstat(r+b)

如果b列高,大概率是io导致的,我们就去看iostat -x 2  或 sar -d 1   或 pidstat -d 1

 

如果us高,那我们就看用户cpu

如果sy高,看perf(perf跟踪cpu)

 

iowait高看iostat 或 pidstat    ---用strace(strace跟踪io)

 

上下文切换vmstat   pidstat

上下文切换要看是自愿还是非自愿

 

软硬中断都可以用cat看   cat/proc/soft...

软中断大概率网络导致的sar   netstat   tcp

 

cpu

~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~

内存

 

一般遇到内存问题比较少。遇到的基本都是jvm的内存

sar -b:缺页异常

缓冲:读写,文件到设别块。把分散的读写操作合并成一次磁盘的写操作

缓存:读写,内存到设备块,设备块到内存

swap基本不用,可以直接设置为0

内存:虚拟内存   物理内存   交换内存

一般虚拟内存和物理内存大小是一样的,如果不配置的话

 

系统已用/可用/剩余内存:free vmstat sar cat/proc/meminfo

进程虚拟内存/常驻内存/共享内存:ps top

进程缺页异常:sar ps  top

缓冲/缓存:top sar

缓存/缓冲区命中率:cachet op  

 

 

内存

~~~~~~~~~~

~~~~~~~~~~

磁盘(io)

 

系统调用-->文件系统-->磁盘

指标:主要看使用率 %util,同时结合看读写速率

sar  pidstat -d

iostat -x

响应时间:await(分w和r)

top        wait     io的wait等待io消耗的

pidstat   wait     等待cpu所花费的百分比

磁盘      wait     包括磁盘本身操作的时间和等待的时间

 

看队列

 

文件系统空间容量/使用量以及剩余空间:df

索引节点容量/使用量以及剩余量:df -i

页缓存和可回收slab缓存:/proc/meminfo   sar -r   vmstat

缓冲区:/proc/meminfo    sar -r    vmstat

目录项/索引节点以及文件系统的缓存:/proc/slabinfo     slabtop

磁盘i/o使用率/iops/吞吐量/响应时间/io平均大小以及队列等待长度:iostat -d -x     sar -d

进程io大小以及延迟:pidstat   iotop

 

思路:top

wait高 pidstat ---看那个进程

缓存或缓冲高   vmstat

跟踪strace

 

怀疑网络的话netstat    tcp -dump

转载于:https://www.cnblogs.com/Charles2625/p/11110826.html

最新回复(0)