• cpu&io密集型


    1. 通常我们说一个程序是cpu密集型就是cpu用的多,io密集型就是io用的多,这种说法对吗?
      答案是:不能算错,但也不全对。其实应该从程序的瓶颈来看待这个问题,若系统瓶颈在cpu,那就是cpu密集型;反之,若在io,则是io密集型。
      了解程序是哪种类型,对系统优化有着关键的指导作用。

    2. 比如我们平时使用的IM软件、网上商城应用都属于io密集型,因为它们主要做的事情是【高频的小数据传输与读写】,一个是网络io,一个是磁盘io。
      图像处理、加解密、序列化反序列化等则需要消耗大量的cpu计算资源。

    3. cpu使用率怎么测量?

    top - 01:18:23 up 26 days,  1:46,  1 user,  load average: 0.02, 0.06, 0.09  # 最近1分钟,5分钟,15分钟的系统平均负载
    Tasks:  83 total,   1 running,  82 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  0.7 us,  1.0 sy,  0.0 ni, 98.0 id,  0.3 wa,  0.0 hi,  0.0 si,  0.0 st  # cpu使用率:
    KiB Mem :  2046840 total,    96916 free,   871284 used,  1078640 buff/cache
    KiB Swap:        0 total,        0 free,        0 used.  1002840 avail Mem
    
    [root@VM-10-10-centos ~]# cat /proc/stat
    cpu  2386298 133 1512433 220167322 135603 0 17069 0 0 0
    cpu0 2386298 133 1512433 220167322 135603 0 17069 0 0 0  # 每个cpu都有8个数字,表示从开机到当前的累计时间,(单位是jiffiles,时钟中断次数)
    intr 1135957538 223 10 0 0 1242 0 3 0 0 0 0 0 15 0 2204533 0 0 0 0 0 0 0 0 0 0 4423071 0 12185348 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    ctxt 2719534071
    btime 1654615901
    processes 5160015
    procs_running 2
    procs_blocked 0
    softirq 268481450 1 149508501 2 23186582 5524440 0 16 0 0 90261908
    

    use:cpu在用户态的运行时间
    system:cpu在内核态的运行时间
    nice:?
    idle:cpu空闲时间 #
    iowait:cpu空闲,且在等待io的时间 #
    irq:硬中断时间
    softirp:软中断时间
    steal:?

    total1 = use + system + nice + (idle + iowait) + irq + softirq + steal
    used1 = use + system + nice + irq + softirq + steal

    过15秒,再采集一次
    total2 = use + system + nice + (idle + iowait) + irq + softirq + steal
    used2 = use + system + nice + irq + softirq + steal

    在这15秒内,cpu的使用率 = (used2 - used1) / (total2 - total1)
    注意:使用率的计算,与采样频率有关。

    一般应用一天的cpu平均使用率在15%~30%之间,cpu使用率低不代表程序就是io密集型,因为io使用率也可能低。

    1. cpu平均负载

    1.load average:单位时间内,活跃进程的个数。
    2.进程状态:
    R:Running/Runnable(Ready)正在执行/准备执行(等待被调度)
    S:Sleep 可中断(可被随时唤醒)的睡眠状态,如等待io、资源锁等
    D:Disk Sleep 不可中断的睡眠状态,通常是在进行io,会短暂的进入该状态
    Z:Zombie 僵尸进程,等待被父进程回收
    3.活跃进程:正在占用或即将占用cpu的进程,处于R和D两种状态。
    4.一个内核只能跑一个进程,所以当平均负载 > cpu核数时,说明cpu一定忙吗?如果绝大多数进程处于R状态,就可以这么认为,但如果还有大量的D状态,这个假设就不成立。
    5.平均负载越高,cpu使用率就越高吗?

    • cpu密集型:如排序、加/解密、音视频编/解码、序列化/反序列化、压缩/解压、新建/拷贝大对象。此时cpu使用率高,负载也越高,二者呈正相关。
    • io密集型:db查询、kv查询、http/rpc接口调用。此时cpu平均负载可能很高,但使用率不一定高。
      6.cpu使用率很高,cpu一定是瓶颈。若cpu负载高,可能cpu是瓶颈,io也可能是瓶颈。需进一步确定,要看iowait是否高,就大概能确认是io还是cpu成了瓶颈。

    cpu : io = 5 : 5 => 核数 * 2
    cpu : io = 1 : 9 => 核数 * 10
    cpu : io = 3 : 7 => 核数 * (10 / 3)
    总体思想就是,io占比越大,就应该开更多的线程,避免cpu空闲,才能充分利用cpu的算力。

  • 相关阅读:
    ecmall 开发一个新模块
    ecmall 如何新增挂件
    ecmall 主从表的4种模型关系
    ecmall 的一些方法说明
    ecmall 支付成功 订单状态没有改变解决办法
    ecmall 基础类分析
    phpcms 新建模块安装
    phpcms pc_base::load
    strptime()方法
    GDB调试方法精粹
  • 原文地址:https://www.cnblogs.com/JaxYoun/p/16441490.html
Copyright © 2020-2023  润新知