zoukankan      html  css  js  c++  java
  • stress施压案例分析——cpu、io、mem【命令分析】

    stress施压命令分析


    一、stress --cpu 1 --timeout 600  分析现象?负载为啥这么高?top命令查看用户进程消耗的cpu过高(stress进程消耗的)

     

    分析现象,可以看出负载很高,用户态的cpu的使用率是100%,stress进程使用的cpu也接近100%。

    问题:负载为什么接近于1??

    #   vmstat 1  查看监控信息

    负载=r+b,这是一个瞬时值。

    下图可以看出r+b为1,所以这里的负载为1。

    这里负载不为2的原因,这里只有一核cpu在干活,也只有一个进程在消耗cpu,所以这里负载是1,不会是2。

    二、stress -i 1 --timeout 600  分析现象?top看负载升高,内核cpu过高?       iostat -x  3    stress消耗cpu多,iowait 等待        pidstat -d      

     

    正常情况下,这里的iowait也是有数据的,不是0,应该会涨,可能是操作系统版本的原因,或者用stress-ng版本这个加强版

    下载地址:https://kernel.ubuntu.com/~cking/tarballs/stress-ng/

    安装步骤和stress一样的,需要编译安装。

    高版本的stress-ng编译需要高版本的gcc,我这里以前是4.4.7版本的

    gcc下载地址:http://www.gnu.org/prep/ftp.html

    分析步骤:

    top可以看到有iowait ,所以这里可能是io等待导致的。

    1、 iostat -x  3   

    通过iostat 看磁盘的繁忙程度,这里的数据应该是达到20%以上,可以看出磁盘繁忙,还有进程读和写,我这里的操作系统版本太低,所以数据很小。

    这里写操作也比较多,怀疑应该每秒写600多,所以磁盘繁忙是大量的写导致的,所以下面使用pidstat再分析。

    2、pidstat -d 3  查看进程读、进程写、和进程延迟

    这里iodelay,这里每次都有java(tomcat)和stress。

    这里的写操作比较多,

     

    三、stress -c 8 --timeout 600  

     

    现象:用户cpu已经打满了,负载上升很快,并且很快就到8了,每个进程所占的cpu资源是12%多,就是这8个stress把cpu打满了。

     vmstat 1

    负载=r+b =8

    pidstat 3

    这里的%wait是等待cpu临幸它所消耗的一个百分比,百分比越高,等待排队的时间越长,和iowait不同。

    这里8个进程在抢占cpu,中断和上下文切换会高些。

    vmstat 3  查看中断和上下文切换

    这里cs应该达到几十万以上,我这里数据不对,

     案例:有次压测用的是4核的一个cpu,用20个线程去压,cpu就打满了,到100%

    一个tomcat写的java进程,20个并发的是tps大概是90多,30个并发tps是80多,80个并发的时候tps就是70多。

    cpu都是打满的,随着并发数的时候,响应时间不断增加,tps不断减小。

    什么原因???

    响应时间增加怀疑cpu上下文切换导致的线程等待时间比较长,

    tomcat打印tomcat整理处理时间,再打印一个接口的一个处理时间,接口处理时间从100ms增加到200ms,但是tomcat的处理时间从1s增加到8s。

    随着并发数的增加,tomcat线程池的排队时间从1s增加到8s多,时间耗在哪里了呢,时间耗在了线程的上下文切换上了。

    四、sysbench --threads=10 --max-time=300 threads run

     

    现象:负载很高,大部分还在内核态cpu,看看谁在用内核态cpu?iowait没有,中断没有,也不是虚拟化??那是谁把内核cpu打满了??

    最有可能是上下文切换,进程之间上下文切换导致的内核态cpu比较高。

     # vmstat 1

    可以看到图中cs上下文切换真他妈好高,达到百万级别了。

    #pidstat -w  看上下文切换,但是这里啥也看不出来。为啥看不出来呢???

    因为???

    pidstat默认看的是进程之间的上下文切换,上下文切换的最小单位是线程。

    查看线程之间的上下文切换加一个-t参数

    pidstat -wt 1

    cswch自愿上下文切换:进程无法获取资源导致的上下文切换,比如;I/O,内存资源等系统资源不足,就会发生自愿上下文切换。

    nvcswch非自愿上下文切换:进程由于时间片已到,被系统强制调度,进而发生的上下文切换 ,比如大量进程抢占cpu。

    python脚本运行分析


    五、app.py

    python3  app.py 运行python脚本,看现象

    现象:负载上来,这里%iowait特别高,应该是80%多,cpu内核使用也挺高的,top 定位到磁盘有问题。

    #vmstat 1 

    首先查看这里负载为啥升高?负载=r+b

    可以看到这里只有一个进程运行也就是r,但是b(中断不可恢复)会有多个,可见负载高是由io导致的。

     # iostat -x 3

    查看下面的磁盘繁忙程度很高,并且写的排队时间到174多毫秒,写的速度为每秒20多万KB,可见是由大量的写操作导致的磁盘比较繁忙。

    #pidstat -d 3    查看到底是哪个进程导致的iowait,也就是哪个进程在进行大量的写操作。

    可以看到是python3这个进程在进行大量地写操作,达到十万级别以上。

    分析流程屡一下:

    1、top首先看负载高(负载=r+b),vmstat 查看这里是有中断不可恢复的进程的比较多(io操作一般是中断不可恢复的进程,可能是io问题);

    2、然后看cpu使用情况,看到cpu这里iowait比较高,可见是由磁盘导致的;

    3、然后iostat -x 看磁盘,磁盘这里确实比较繁忙,并且有很疯狂的写操作,磁盘每次操作消耗时间比较长,大部分时间耗排队时间比较长;

    4、然后分析到底是哪个进程在进行写操作,这里使用pidstat -d 3 查看是python3进程在进行大量的写操作,消耗io比较高,这里是定位到了进程的层面;

    5、对于应用程序要定位到方法层面,为啥导致了写操作比较多,到底在写什么东西呢??

    这里可以看到python3的pid 为32488,这里内核调用也挺高的,用strace来跟踪系统内核进程的调用情况。

    strace -p  32488 

    这里是在往logtest.txt写文件,进入到相应目录查看有没有这个文件。

    使用lsof查看文件句柄,看都是谁打开的,是python3打开的,目前已经定位到了在写什么了。

    6、定位到方法,再去看代码,每次写得很大,大概10M。

     

    六、iolatency.py

    负载不高,cpu使用率也不高,iowait也不高,ni 中断都没问题,啥现象都没有,但就是使用的时候,或者使用某个具体功能,访问某个具体的页面的时候响应贼慢。

    启动的时候,大家可以看到启动了一个ip:80

     

    所以这里可以访问一下,192.168.1.17  (http默认80端口,可以不加)大家可以看到这里访问很快

    但是如果大家访问   192.168.1.17/popularity/word      就可以看到这里访问贼慢,还没有返回结果。

    过了好大一会,才返回如下结果:

    这里进行压测该接口   http://192.168.1.17/popularity/word  我们top下观察现象:

    这里负载升高、iowait也升高达80%多。

    1、负载上去的原因:vmstat 1     b列有许多中断不可恢复的进程。io 里的bo数据很大,是在进行大量的写操作,定位到io问题。

    2、iostat -x 3   查看队列、和写的速度都很大,定位到是大量的写操作导致磁盘繁忙和和排队,下面查看是哪个进程在大量地写。

    3、pidstat -d  3  确定是python进程在写操作。

    4、strace -p  <pid>看这个进程在写啥,或者加个过滤条件:strace -p  <pid>  grep | write,跟踪不到在写啥????

    5、filetop (bcc-tools里的一个包,github上下载,源码安装)

  • 相关阅读:
    echarts之tooltip
    js随笔
    在wex5平台grid显示问题
    JSON.parse()和JSON.stringify()区别
    在wex5平台grid里面的gridselect下拉不能显示汉字问题
    wex5平台放入tabs组件后运行时显示空白
    正整数求n不用sqrt
    leetcode1143最长公共子序列
    美团Java一面(2020.3.19)
    leetcode138. 复制带随机指针的链表
  • 原文地址:https://www.cnblogs.com/wuzm/p/11281621.html
Copyright © 2011-2022 走看看