首页 > 其他分享 >Top命令--如何排查用户态 CPU 使用率高?

Top命令--如何排查用户态 CPU 使用率高?

时间:2024-07-12 12:08:35浏览次数:17  
标签:-- Top period cpu 内核 进程 CPU quota

CPU 的物理核与逻辑核

一台机器可能包含多块 CPU 芯片,多个 CPU 之间通过系统总线通信。一块 CPU 芯片可能包含多个物理核,每个物理核都是一个实打实的运算核心(包括运算器、存储器等)。超线程(Hyper-Threading)技术可以让一个物理核在单位时间内同时处理两个线程,变成两个逻辑核。但它不会拥有传统单核 2 倍的处理能力,也不可能提供完整的并行处理能力。

假设一个 CPU 芯片就是一个班级;它有 2 个物理核,也就是 2 个同学,老师让他们分别担任班长和体育委员;过了一段时间,校长要求每个班级还要有学习委员和生活委员,理论上还需要 2 位同学,但是这个班级只有 2 个人,最后老师只能让班长和体育委员兼任。这样一来,对于不了解的人来说,这个班级有班长、体育委员、学习委员和生活委员 4 个职位。

top

top 命令输出

top - 18:31:39 up 158 days,  4:45,  2 users,  load average: 2.63, 3.48, 3.53
Tasks: 260 total, 2 running, 258 sleeping, 0 stopped, 0 zombie
%Cpu(s): 38.1 us, 4.2 sy, 0.0 ni, 53.5 id, 2.3 wa, 0.0 hi, 1.9 si, 0.0 st
KiB Mem : 16255048 total, 238808 free, 7608872 used, 8407368 buff/cache
KiB Swap: 33554428 total, 31798304 free, 1756124 used. 7313144 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
32080 root 20 0 8300552 4.125g 11524 S 86.4 26.6 1157:05 java
995 root 20 0 641260 41312 39196 S 28.6 0.3 7420:54 rsyslogd

top 命令找到%CPU 排位最高的进程id=32080,进而找到对应的容器

CPU 使用率就是 CPU 非空闲态运行的时间占比,比如,单核 CPU 1s 内非空闲态运行时间为 0.8s,那么它的 CPU 使用率就是 80%;双核 CPU 1s 内非空闲态运行时间分别为 0.4s 和 0.6s,那么,总体 CPU 使用率就是 (0.4s + 0.6s) / (1s * 2) = 50%

%Cpu(s): 38.1 us,  4.2 sy,  0.0 ni, 53.5 id,  2.3 wa,  0.0 hi,  1.9 si,  0.0 st

上述比例加起来是100%

  1. us(user):表示 CPU 在用户态运行的时间百分比,通常用户态 CPU 高表示有应用程序比较繁忙。典型的用户态程序包括:数据库、Web 服务器等。

  2. sy(sys):表示 CPU 在内核态运行的时间百分比(不包括中断),通常内核态 CPU 越低越好,否则表示系统存在某些瓶颈。

  3. ni(nice):表示用 nice 修正进程优先级的用户态进程执行的 CPU 时间。nice 是一个进程优先级的修正值,如果进程通过它修改了优先级,则会单独统计 CPU 开销。

  4. id(idle):表示 CPU 处于空闲态的时间占比,此时,CPU 会执行一个特定的虚拟进程,名为 System Idle Process。

  5. wa(iowait):表示 CPU 在等待 I/O 操作完成所花费的时间,通常该指标越低越好,否则表示 I/O 存在瓶颈,可以用 iostat 等命令做进一步分析。

  6. hi(hardirq):表示 CPU 处理硬中断所花费的时间。硬中断是由外设硬件(如键盘控制器、硬件传感器等)发出的,需要有中断控制器参与,特点是快速执行。

  7. si(softirq):表示 CPU 处理软中断所花费的时间。软中断是由软件程序(如网络收发、定时调度等)发出的中断信号,特点是延迟执行。

  8. st(steal):表示 CPU 被其他虚拟机占用的时间,仅出现在多虚拟机场景。如果该指标过高,可以检查下宿主机或其他虚拟机是否异常。

Linux 中 CPU 利用率是如何算出来的?

  1. top 命令是读取的 /proc/stat 中输出的 cpu 各项利用率数据,而这个数据在内核中的是根据 kernel_cpustat(内核变量) 来汇总并输出的。

  2. Linux 内核每隔固定周期会发出 timer interrupt (IRQ 0),每次当时间中断到来的时候,都会调用 update_process_times 来更新系统时间。更新后的时间都存储在我们前面提到的 percpu 变量 kcpustat_cpu 中。

CPU 使用率与平均负载的关系

CPU 使用率是单位时间内 CPU 繁忙程度的统计。而平均负载不仅包括正在使用 CPU 的进程,还包括等待 CPU 或 I/O 的进程。因此,两者不能等同。举一个例子:假设现在有一个电话亭,有 4 个人在等待打电话,电话亭同一时刻只能容纳 1 个人打电话,只有拿起电话筒才算是真正使用。那么 CPU 使用率就是拿起电话筒的时间占比,它只取决于在电话亭里的人的行为,与平均负载没有非常直接的关系。而平均负载是指在电话亭里的人加上排队的总人数。

LinuxLoad Average= 可运行队列进程平均数 + 休眠队列中不可打断的进程平均数

load衡量的是task(linux 内核中用于描述一个进程或者线程)对系统的需求(CPU、内存、IO等等),system load average由内核负载计算并记录在/proc/loadavg 文件中, 用户态的工具(比如uptime,top等等)读的都是这个文件。内核是怎么计算load average的? 指数加权移动平均法:a1 = a0 * factor + a * (1 - factor),其中a0是上一时刻的值,a1是当前时刻的值,factor是一个系数,取值范围是[0,1],a是当前时刻的某个指标采样值。

我们一般认为:

  1. 如果load接近0,意味着系统处于空闲状态;

  2. 如果 1min 平均值高于 5min 或 15min 平均值,则负载正在增加;

  3. 如果 1min 平均值低于 5min 或 15min 平均值,则负载正在减少;

  4. 如果它们高于系统 CPU 的数量,那么系统很可能遇到了性能问题(视情况而定)。

Linux 中的负载高低和 CPU 开销并不完全对应

如何排查用户态 CPU 使用率高?

导致load 飙高的原因,说简单也简单,无非就是runnable 或者 uninterruptible 的task 增多了。但是说复杂也复杂,因为导致task进入uninterruptible状态的路径非常多(粗略统计,可能有400-500条路径)。PS:

  1. 周期性飙高

  2. IO原因

  3. 内存原因,比如task 在申请内存的时候,可能会触发内存回收,如果触发的是直接内存回收,那对性能的伤害很大。

  4. 锁,比如采用mutex_lock进行并发控制的路径上,一旦有task 拿着lock 不释放,其他的task 就会以TASK_UNINTERRUPTIBLE的状态等待,也会引起load飙高。

  5. user CPU,有些情况下load飙高是业务的正常表现,此时一般表现为user cpu 飙高

迟分析需要深入内核内部,在内核路径上埋点取数。所以这类工具的本质是内核probe,包括systemtap,kprobe,ebpf等等。但是probe 技术必须结合知识和经验才能打造成一个实用的工具。阿里自研的ali-diagnose可以进行各种delay分析,irq_delay, sys_delay, sched_delay, io_delay, load-monitor。

如果想定位消耗 CPU 最多的 Java 代码,可以遵循如下思路:

  1. 通过 top 命令找到 CPU 消耗最多的进程号;

  2. 通过 top -Hp 进程号 命令找到 CPU 消耗最多的线程号(列名仍然为 PID);

  3. 通过printf "%x\n" 线程号 命令输出该线程号对应的 16 进制数字;

  4. 通过 jstack 进程号 | grep 16进制线程号 -A 10 命令找到 CPU 消耗最多的线程方法堆栈。

如果是非 Java 应用,可以将 jstack 替换为 perf。 生产系统推荐使用 APM 产品,比如阿里云的 ARMS,可以自动记录每类线程的 CPU 耗时和方法栈(并在后台展示),开箱即用,自动保留问题现场

如何限制cpu的使用

CFS Bandwidth Control

The bandwidth allowed for a group(进程所属的组) is specified using a quota and period. Within each given “period” (microseconds), a group is allowed to consume only up to “quota” microseconds of CPU time. When the CPU bandwidth consumption of a group exceeds this limit (for that period), the tasks belonging to its hierarchy will be throttled and are not allowed to run again until the next period. 有几个点

  1. cpu 不像内存 一样有明确的大小单位,单个cpu 是独占的,只能以cpu 时间片来衡量。

  2. 进程耗费的限制方式:在period(毫秒/微秒) 内该进程只能占用 quota (毫秒/微秒)。quota /period = %CPU 。PS:内存隔离是 申请内存的时候判断 判断已申请内存有没有超过阈值。cpu 隔离则是 判断period周期内,已耗费时间有没有超过 quota。PS: 频控、限流等很多系统也是类似思想

  3. period 指的是一个判断周期,quota 表示一个周期内可用的多个cpu的时间和。 所以quota 可以超过period ,比如period=100 and quota=200,表示在100单位时间里,进程要使用cpu 200单位,需要两个cpu 各自执行100单位

  4. 每次拿cpu 说事儿得提两个值(period 和 quota)有点麻烦,可以通过进程消耗的 CPU 时间片quota来统计出进程占用 CPU 的百分比。这也是我们看到的各种工具中都使用百分比来说明 CPU 使用率的原因(下文多出有体现)。

 

标签:--,Top,period,cpu,内核,进程,CPU,quota
From: https://www.cnblogs.com/david-cloud/p/18298072

相关文章

  • 数学建模第一次笔记:层次分析法
    概要最近因为要参加数学建模的比赛,所以用博客来记录自己的数学建模学习过程,也分享出来,希望对大家有用,我的数学建模学习过程如下:1,先有一本数学建模和优秀论文的相关书籍,我的是学校发的。2,接下来便是自学或者跟着网课系统学习(这里推荐后者)3,我是跟着清风学习的数学建模,个人......
  • 基于51单片机智能热电偶温度检测PID控制恒温箱设计套件24-157
    24-157、51热电偶PID控制恒温箱设计-LCD1602-热电偶-KEY-AO4405本系统由STC89C52单片机电路+LCD1602液晶显示电路+热电偶检测电路+按键电路+AO4405-MOS管驱动发热电阻电路+AO4405-MOS管驱动制冷片电路+电源电路组成。1、LCD1602液晶实时显示温度和温度上下限。2、通过按键可......
  • 【LangChain v0.2:向稳定性迈进的一大步】
    文末有福利!LangChainv0.2:向稳定性迈进的一大步❝本文经翻译并二次整理自LangChainv0.2:ALeapTowardsStability一文。LangChain官方正式对外宣布了LangChainv0.2的预发布版本,这个版本在提升LangChain的稳定性和安全性方面迈出了重要一步。langchainv0.2的预发......
  • 【期末考试复习】概率论与数理统计(知识点模式 - 复习题2)
    题目:设随机变量XXX的概率密度函数为f(x......
  • 全速增长!NetMarvel 与您相约 2024 ChinaJoy 盛会!
    2024年第二十一届ChinaJoy将于7月26日至29日在上海新国际博览中心盛大召开。继去年成功参展后,全球一站式效果营销服务平台——NetMarvel今年将继续亮相,与您相约W4馆B208展位,共同探讨全球移动互联网行业增长!在如今普遍流量触底的大环境下,出海厂商如何寻找新增量?作为一家在移动......
  • 最新AI一站式系统源码-ChatGPT商业版系统源码,支持自定义AI智能体应用、AI绘画、AI视频
     一、前言人工智能语言模型和AI绘画在多个领域都有广泛的应用.....SparkAi创作系统是一款基于ChatGPT和Midjourney开发的智能问答和绘画系统,提供一站式AIB/C端解决方案,涵盖AI大模型提问、AI绘画、AI视频、文档分析、图像识别和理解、TTS&语音识别、AI换脸等多项功能。......
  • C语言学习网站推荐
    1.C语言中文网:http://c.biancheng.net/view/510.html此网站会提供很多关于C语言的入门算法,教程等等。分享的C语言知识结构是比较完整的。此网站还提供了很多关于C语言的资料,代码。有些资料是免费的,有些是需要付费的。2.54笨鸟:54笨鸟:您的下一套教程,何必是书籍和C语言中文......
  • WPF display and host pdf via WebBrowser
    //xaml<Windowx:Class="WpfApp206.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mi......
  • 4-LinkedList底层结构和源码分析
    4-LinkedList底层结构和源码分析介绍汇总:LinkedList的全面说明LinkedList的底层操作机制LinkedList的运行重要步骤ArrayList和LinkedList比较1-LinkedList的全面说明LinkedList底层实现了双向链表和双端队列特点可以添加任意元素(元素可以重复),包括null线程不安全,......
  • “好物”推荐+Xshell连接实例+使用Conda创建独立的Python环境
    目录主题:好易智算平台推荐+RTX4090DGPU实例租用演示+安装配置torch1.9.1+cuda11.1.1环境引言:算力的新时代平台介绍:技术与信任的结晶使用案例:实际使用展示创建实例开始使用连接实例(下文演示使用Xshell连接,后续传文件也有配套的sftp可以使用)sftp传文件查看服务器配置,使用C......