zoukankan      html  css  js  c++  java
  • 快速分析CPU性能问题

    Linux的CPU性能问题,相信在工作中很容易遇到。这篇文章会总结出一个大概的套路,相信能够解决工作中90%以上的CPU性能问题!

    会告诉大家在不同的场景下,cpu性能指标工具如何选择,性能瓶颈怎么找。

    CPU性能指标

    往下看之前,自己可以先想想cpu性能指标有哪些。

    首先,最容易想到的就是CPU的使用率,也是工作中最常见的。

    CPU的使用率描述了非空闲时间占总CPU时间的百分比,根据CPU上运行的任务不同,又被分为用户CPU、系统CPU、等待I/O、硬中断和软中断等。

    • 用户CPU使用率,表示CPU在用户态(user)运行的时间百分比,用户CPU使用率越高,一般表示应用程序比较繁忙导致。
    • 系统CPU使用率(sys),表示CPU在内核态运行的时间百分比,系统CPU高,说明内核比较繁忙。
    • 等待I/O的CPU使用率(iowait),表示等待I/O的时间百分比。iowait高说明系统和硬件设备的IO交互时间长,很多时候是由于磁盘性能问题。
    • 还有在虚拟化环境中的steal CPU使用率和客户CPU使用率(guest),steal表示被其他虚拟机占用的CPU时间百分比,和运行客户虚拟机的CPU时间百分比。一般云厂商客户出现这种问题比较多。不过现在steal的使用率一般都被屏蔽了,客户买了虚拟机之后用top看到的指标都是0.

    第二个容易想到的应该是平均负载(load average)。也就是系统平均h活跃进程数,它也是我们进程关注的指标,反应了系统的整体负载情况,分别指过去1分钟、5分钟、15分钟的CPU平均负载情况。

    正常情况下,平均负载的数字等于CPU的核数,表示CPU使用率刚好被充分利用,大于CPU的核心数,表示CPU负载过重了。

    第三个可能会想到进程的上下文切换:

    上下文切换,本身是保证Linux正常运行的核心功能,但过多的上下文切换,会将原本运行在进程上的CPU时间,消耗在寄存器、内核栈、以及虚拟内存等数据的保存和恢复上,缩短了进程在CPU上的运行时间,导致性能问题。

    还有一个指标是CPU缓存的命中率,可以自行GOOLE,我后面也会专门总结一篇!

    我把上面总结的CPU性能指标总结一张图,也方便自己查找和记忆:

    性能指标和性能工具来分析:

    首先从性能指标出发看,当我们想查看某个指标时,需要知道有哪些工具可以查看。

    根据不同的性能指标,对提供指标的性能工具进行分类和理解。

    如何迅速分析:

    虽然 CPU 的性能指标比较多,但要知道,既然都是描述系统的CPU性能,它们就不会是完全孤立的,很多指标间都有一定的关联。想弄清楚性能指标的关联性,就要通晓每种性能指标的工作原理

    举个例子,用户 CPU 使用率高,我们应该去排查进程的用户态而不是内核态。因为用户 CPU 使用率反映的就是用户态的 CPU 使用情况,而内核态的 CPU 使用情况只会反映到系统 CPU 使用率上。

    为了缩小排查范围,我通常会先运行几个支持指标较多的工具,如 top、vmstat 和 pidstat 。为什么是这三个工具呢?仔细看看下面这张图,你就清楚了。

    这张图里,我列出了 top、vmstat 和 pidstat 分别提供的重要的 CPU 指标,并用虚线表示关联关系,对应出了性能分析下一步的方向。

    通过这张图你可以发现,这三个命令,几乎包含了所有重要的 CPU 性能指标,比如:

    • 从 top 的输出可以得到各种 CPU 使用率以及僵尸进程和平均负载等信息。
      从 vmstat 的输出可以得到上下文切换次数、中断次数、运行状态和不可中断状态的进程数。
      从 pidstat 的输出可以得到进程的用户 CPU 使用率、系统 CPU 使用率、以及自愿上下文切换和非自愿上下文切换情况。
    • 另外,这三个工具输出的很多指标是相互关联的,也用虚线表示了它们的关联关系。

    作为程序员或者运维都需要知道linux系统优化,这边文章也参考了rehat官方手册和linux专栏。

  • 相关阅读:
    How to import data from Oracle into PostgreSQL(转)
    C++——算法 回溯 八皇后问题
    Python——彩图变线稿
    算法——二叉树的遍历 前序 中序 后序 广度优先 深度优先 (转)
    C++——计数排序 (转)
    C++——位运算相关 (转)
    C++——std::vector相关 (转)
    C++——双指针 (转)
    C++——求三数之和,实操从低效做法逐步提升到高效做法,受益良多
    C++——基础容器
  • 原文地址:https://www.cnblogs.com/Tao9/p/11507262.html
Copyright © 2011-2022 走看看