系统诊断小技巧(11):如何解决“问题复现了,但是捕捉数据进程因为CPU打满没有运行”?

简介: 引子 曾经搞过一个尴尬的案例。排查过一个CPU打满的问题。因为问题是在凌晨出现,而且非常随机。所以我们就准备了一个脚本,用来捕获占用CPU高的线程。但尴尬的是,问题复现了,我们的脚本偏偏在问题复现的时候,没有记录。

引子

曾经搞过一个尴尬的案例。排查过一个CPU打满的问题。因为问题是在凌晨出现,而且非常随机。所以我们就准备了一个脚本,用来捕获占用CPU高的线程。但尴尬的是,问题复现了,我们的脚本偏偏在问题复现时,没有记录。推断是因为CPU打满,脚本没有机会执行导致的。

那么,CPU打满导致捕捉数据的进程没有运行的问题,能够解决吗?我们尝试回答这个问题。

亦步亦趋:了解Linux内核线程watchdog是怎么保证及时运行的

watchdog内核线程是检测Linux内核softlock机制的一部分,必须及时运行,除非是内核死锁了。如果我们把目光聚焦在用户空间,那么watchdog内核线程的运行设定是个合适的模仿对象。

理解watchdog的运行特点,需要稍微了解下Linux的调度策略和chrt(1)工具。

Linux支持多个调度策略,在“实时”的调度策略上又有调度优先级的区分。这部分话题,以后有机会我们再细聊。现在只要知道这一点,并且知道我们可以使用chrt(1)检查和设置即可。

那么,watchdog内核线程有什么特殊呢?比较下

# 1. 检查watchdog的pid
root@pusf:~# ps -ef | egrep watchdog | egrep -v egrep
root        11     2  0 09:15 ?        00:00:00 [watchdog/0]
root        14     2  0 09:15 ?        00:00:00 [watchdog/1]
... ....
# 2. 检测watchdog的调度策略和优先级
root@pusf:~# chrt -p 11
pid 11's current scheduling policy: SCHED_FIFO
pid 11's current scheduling priority: 99
# 3. 检测当前交互shell的调度策略和优先级
root@pusf:~# chrt -p $$
pid 10389's current scheduling policy: SCHED_OTHER
pid 10389's current scheduling priority: 0
root@pusf:~#

简单比较,让我们了解了两种调度策略(sched-fifo vs. sched-other)和两种优先级(99 vs. 0)。

下面我们用简单例子测试下这两种调度策略的差别。

两种调度策略的比较

测试脚本和压力产生器

我们的测试脚本每隔1秒打印下时间戳,一共取10次。具体内容如下(下文以demo指代这个脚本):

#!/bin/bash

export LANG=C

for ((i=0;i<10;i++));do
    sleep 1
    date
done

既然是比较在CPU打满情况下的调度策略,自然也需要一个压力产生器,用来把CPU打满。我们偷偷懒,直接使用perf(1)工具。

基线数据

我们给出CPU没有打满情况下的测试数据,作为基线数据。测试命令如下

root@pusf:~# ./demo > baseline-data-1 & ./demo > baseline-data-2 &

让我们看看测试结果

# baseline-data-1
Fri Aug 24 06:17:59 EDT 2018
Fri Aug 24 06:18:00 EDT 2018
Fri Aug 24 06:18:01 EDT 2018
Fri Aug 24 06:18:02 EDT 2018
Fri Aug 24 06:18:04 EDT 2018
Fri Aug 24 06:18:05 EDT 2018
Fri Aug 24 06:18:06 EDT 2018
Fri Aug 24 06:18:07 EDT 2018
Fri Aug 24 06:18:08 EDT 2018
Fri Aug 24 06:18:09 EDT 2018

# baseline-data-2
Fri Aug 24 06:17:59 EDT 2018
Fri Aug 24 06:18:00 EDT 2018
Fri Aug 24 06:18:01 EDT 2018
Fri Aug 24 06:18:02 EDT 2018
Fri Aug 24 06:18:04 EDT 2018
Fri Aug 24 06:18:05 EDT 2018
Fri Aug 24 06:18:06 EDT 2018
Fri Aug 24 06:18:07 EDT 2018
Fri Aug 24 06:18:08 EDT 2018
Fri Aug 24 06:18:09 EDT 2018

难以置信, 两份数据没有什么差异。好吧,测试机确实是非常的空闲。

CPU打满情况下的测试结果

我们再采样前,先运行压力产生器把CPU打满。具体运行命令如下

root@pusf:~# perf bench sched messaging -l 10000 & \ # 启动压力产生器
sleep 1; \ # 等待压力产生器驱动CPU
./demo > sched-other.log & \ # 以默认/正常的调度策略采样
chrt -f 99 ./demo > sched-fifo.log & # 以watchdog的调度策略和优先级运行采样

让我们看看结果。

# sched-other.log
Fri Aug 24 06:06:43 EDT 2018
Fri Aug 24 06:06:49 EDT 2018
Fri Aug 24 06:06:55 EDT 2018
Fri Aug 24 06:07:00 EDT 2018
Fri Aug 24 06:07:02 EDT 2018
Fri Aug 24 06:07:04 EDT 2018
Fri Aug 24 06:07:06 EDT 2018
Fri Aug 24 06:07:08 EDT 2018
Fri Aug 24 06:07:09 EDT 2018
Fri Aug 24 06:07:10 EDT 2018

# sched-fifo.log
Fri Aug 24 06:06:39 EDT 2018
Fri Aug 24 06:06:40 EDT 2018
Fri Aug 24 06:06:41 EDT 2018
Fri Aug 24 06:06:42 EDT 2018
Fri Aug 24 06:06:43 EDT 2018
Fri Aug 24 06:06:44 EDT 2018
Fri Aug 24 06:06:45 EDT 2018
Fri Aug 24 06:06:46 EDT 2018
Fri Aug 24 06:06:47 EDT 2018
Fri Aug 24 06:06:48 EDT 2018

调度策略在CPU打满情况下的差异太明显了。第一份数据前后间隔没有是1秒的情况,而第二份数据估计完美主义者都会树大拇指。

步骤

如何解决我们开头提出的问题,现在已经很明确了。我们不再饶舌。

探索愉快!

相关文章
|
17天前
|
监控 关系型数据库 MySQL
在CentOS系统中,如何统计哪个进程打开了文件描述符?
利用上述方法,你可以有效地监控和统计CentOS系统中的进程打开的文件描述符数量,以帮助排查错误或优化系统配置。通过组合使用各种工具和命令,可以获得对系统状态和行为的深入了解,进而做出相应的调整和
91 5
麒麟系统mate-indicators进程占用内存过高问题解决
【10月更文挑战第7天】麒麟系统mate-indicators进程占用内存过高问题解决
1312 2
|
8月前
|
弹性计算 运维 监控
基于进程热点分析与系统资源优化的智能运维实践
智能服务器管理平台提供直观的可视化界面,助力高效操作系统管理。核心功能包括运维监控、智能助手和扩展插件管理,支持系统健康监控、故障诊断等,确保集群稳定运行。首次使用需激活服务并安装管控组件。平台还提供进程热点追踪、性能观测与优化建议,帮助开发人员快速识别和解决性能瓶颈。定期分析和多维度监控可提前预警潜在问题,保障系统长期稳定运行。
300 17
|
9月前
|
人工智能 并行计算 安全
用户实操:如何以龙蜥操作系统为底座在 CPU 上运行 DeepSeek-R1
介绍如何在 CPU 上使用 llama.cpp 推理 671B 版本的 DeepSeek R1,以及实际效果。
|
10月前
|
监控 搜索推荐 开发工具
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
917 2
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
|
12月前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
1667 58
|
11月前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
470 13
|
12月前
|
网络协议 Linux 虚拟化
如何在 Linux 系统中查看进程的详细信息?
如何在 Linux 系统中查看进程的详细信息?
1026 1
|
2月前
|
缓存 人工智能 算法
不同业务怎么选服务器?CPU / 内存 / 带宽配置表
本文详解了服务器三大核心配置——CPU、内存、带宽,帮助读者快速理解服务器性能原理。结合不同业务场景,如个人博客、电商、数据库、直播等,提供配置选择建议,并强调合理搭配的重要性,避免资源浪费或瓶颈限制。内容实用,适合初学者和业务选型参考。
461 0
|
2月前
|
存储 消息中间件 缓存
从纳秒到毫秒的“时空之旅”:CPU是如何看待内存与硬盘的?
在数据爆炸的时代,如何高效存储与管理海量数据成为系统设计的核心挑战。本文从计算机存储体系结构出发,解析B+树、LSM树与Kafka日志结构在不同数据库中的应用与优化策略,帮助你深入理解高性能存储背后的原理。
95 0