基于eBPF的procstat软件追踪程序Offcpu时间

在现代计算机系统中,性能调优和问题诊断是大家经常会面临的问题,解决这些性能问题是确保程序高效运行的关键。有时不知为何程序的吞吐量和时延出现抖动,有一种可能就是程序发生了Offcpu。了解程序的 Offcpu 时间有助于识别潜在的性能瓶颈和系统资源调度问题。今天,我们将介绍一款强大的性能追踪软件——procstat,它使用 eBPF 技术来追踪程序的Offcpu时间,并通过一个小例子展示它的使用方法。
之前写过关于procstat软件的文章,使用procstat软件检测死锁问题和使用procstat软件追踪加锁和持有锁的时间,欢迎大家阅读。

什么是 Offcpu

Offcpu 时间指的是一个线程在非运行状态下所花费的时间。这可能是由于被其他线程抢占、等待 I/O 操作完成或其他原因。有很多时候,程序发生的性能抖动是由于Offcpu导致。通过分析程序的Offcpu 情况,我们可以更好地理解线程调度和系统资源的使用情况,从而进行性能优化。

procstat软件简介

procstat是一款基于eBPF的监控工具软件,运行在Linux平台,主要用于跟踪目标程序的运行状态,并报告异常指标,是分析程序性能问题的一大利器。procstat能够用于追踪程序的Offcpu时间。该软件通过eBPF技术,可以深入到Linux内核内部,监控操作系统的调度行为,实时捕捉程序的调度状态。当检测到Offcpu时间超过阈值的情况时,procstat会在日志中输出详细的信息,帮助开发者快速定位问题根源。接下来我们将通过一个小实验来展示一下procstat软件是如何追踪程序Offcpu时间的。
此软件可以在以下链接中下载到,并提供免费试用,后续还会有版本更新迭代,使用时需要能连互联网环境。
Github下载链接

Offcpu示例代码

我们通过一个简单的 C++ 程序来演示如何使用 procstat 追踪Offcpu时间。以下是我们的示例程序:

#include <iostream>
#include <thread>
#include <chrono>
int main()
{while (1) {std::this_thread::sleep_for(std::chrono::milliseconds(1));}return 0;
}
// g++ offcpu.cpp -o offcpu -g -std=c++11 -pthread -O2

这个程序简单地在一个无限循环中每次休眠 1 毫秒,然后继续运行。程序的休眠在实际应用中可能代表等待 I/O 或者其他资源的情况。

使用procstat追踪Offcpu

编译并启动上述代码后,使用procstat软件来监控该程序并检测Offcpu状态。本实验中,编译后的程序名为offcpu。首先,将procstat软件的配置中将offcpu的阈值设置为900000,单位是纳秒,意思是当进程发生Offcpu时长超过阈值900微秒就会输出日志。
配置设置
配置文件位置在procstat目前下的conf目录中,名为config.json。

"schedule_stat": {"offcpu_duration": 900000
},

我们可以通过以下命令启动procstat进行监控:sh start.sh -p 进程号。其中,<进程号>是正在运行的offcpu程序的进程ID。
运行程序

[root@VM-8-2-centos bin]# ps -ef | grep offcpu
root     2896306 2894954  0 14:38 pts/2    00:00:12 ./offcpu
root     2911886 2911344  0 15:29 pts/4    00:00:00 grep --color=auto offcpu
[root@VM-8-2-centos bin]# sh start.sh -p 2896306
Start Loading...!
Start Stating...!

启动监控后(输出“Start Stating…!”后就已开始监控了),procstat会持续监控该程序的运行状态,并在日志中记录时间超过配置文件中设定的阈值的Offcpu操作(时长可配置)。

procstat软件日志

接下来我们查询procstat的日志信息,并搜索SCHED OFFCPU关键字。
offcpu日志图在日志中发现offcpu进程非常频繁地进入Offcpu状态,从结果图中也可看出,被监控的offcpu进程的确进入过Offcpu状态,我们截取几条日志分析一下。

  1. 第13667行,是表示该进程发生Offcpu的时长超过了阈值,各字段含义:
    (1)comm=offcpu,表示发生Offcpu的进程的启动命令是offcpu;
    (2)tid=2896306,表示发生Offcpu的线程id是2896306;
    (3)state=1,表示Offpu的类型,1是可打断的,2是不可打断的;
    (4)duration=[1068527]ns,表示本次Offcpu的时长是1068527纳秒,约为1ms;
    (5)preempt_pid=0,表示抢占该进程的抢占者进程id是0;
    (6)preempt_tid=0,表示抢占该进程的抢占者线程id是0;
    (7)preempt_comm=swapper/0,表示抢占该进程的抢占者进程命令是swapper/0;
    (8)waker_pid=0,表示唤醒该进程的唤醒者进程id是0;
    (9)waker_tid=0,表示唤醒该进程的唤醒者线程id是0;
    (10)waker_comm=swapper/0,表示唤醒该进程的唤醒者进程命令是swapper/0。
  2. 第13668行是发生Offput时的线程堆栈信息,可以看到是由于用户空间调用了sleep导致进程被调度出运行队列导致的Offcpu。
  3. 第13683行是唤醒offcpu进程的线程的堆栈信息,可以看到是定时器发生了中断,之后唤醒了offcpu进程,也就是sleep的时间到了被唤醒了。
  4. 第13701行是50ms输出一次的Offcpu状态的统计信息,其包含的字段意义如下:
    (1)tid = 2896306,表示发生Offcpu的线程id;
    (2)pid = 2896306,表示发生Offcpu的进程id;
    (3)comm = offcpu,表示发生Offcpu的进程的启动命令是offcpu;
    (4)total_duration = 25574161ns,表示该统计周期内此进程发生Offcpu的总时长是25ms;
    (5)avg_duration = 1065590ns,表示该统计周期内此进程发生Offcpu的平均时长是1ms;
    (6)max_duration = 1071927ns,表示该统计周期内此进程发生Offcpu的最大时长是1ms;
    (7)max_index = 18,表示该统计周期内时长最大的Offcpu发生在第18次;
    (8)count = 24,表示该统计周期内一共发生了24次Offcpu。

通过分析这些信息就能知道发生Offcpu的真正原因,在分析程序的性能抖动时非常有帮助!

总结

procstat 是一个功能强大的工具,通过 eBPF 技术实现了对程序 Offcpu 时间的全面追踪。通过本文的介绍和示例,相信你已经对 procstat 有了基本的了解。希望你能在实际工作中充分利用这个软件,提高程序的性能和稳定性。
procstat软件还可以监测很多的程序异常状态,随着eBPF技术的不断发展和procstat软件不断的迭代,希望能够帮助大家定位程序的性能问题和异常问题,进一步提升对软件和操作系统的监控能力,欢迎大家试用,有问题请私信我,共同学习、交流,共同进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/45489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣215 数组中第k大的数

给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 本题主要考察各种排序算法&#xff0c;…

【论文速读】《面向深度学习的联合消息传递与自编码器》,无线AI的挑战和解决思路

这篇文章来自华为的渥太华无线先进系统能力中心和无线技术实验室&#xff0c;作者中有大名鼎鼎的童文。 一、自编码架构的全局收发机面临的主要问题 文章对我比较有启发的地方&#xff0c;是提到自编码架构的全局收发机面临的主要问题&#xff1a; 问题一&#xff1a;基于随…

Rhino云渲染使用教程

Rhino是一款功能强大、灵活易用的三维计算机图形建模软件&#xff0c;广泛应用于建筑、工业设计、产品设计、珠宝设计、动画制作等多个领域。哪Rhino可不可以使用云渲染呢&#xff1f;答案是可以的&#xff0c;下面给大家介绍一下炫云Rhino云渲染的使用方法。 1、搜索“炫云”…

springboot枚举简单使用笔记

springboot枚举简单使用笔记 定义枚举: package com.geofly.ynygzx.iscp.api.common.enums;/*** Description: 需求提交记录状态枚举** Param:* Return:* Author yanghaoxing* Date 2024/7/12 10:01*/public enum RequirementSubmissionStatus {BACK("已撤回", 0),S…

摘要算法介绍

摘要算法介绍 摘要算法&#xff08;Hash Algorithm&#xff09;是一种将任意长度的数据映射为固定长度的哈希值&#xff08;摘要&#xff09;的算法。哈希值通常用作数据的唯一标识符&#xff0c;在数据完整性验证、数字签名、密码学等领域有广泛应用。以下是摘要算法的详细介…

Java I/O模式 (一)

第一章 Java的I/O演进之路 1.1 I/O模型基本说明 1/0模型&#xff1a;就是用什么样的通道或者说是通信模式和架构进行数据的传输和接收&#xff0c;很大程度上决定了程序通信的性能&#xff0c;Java 共支持3种网络编程的/10 模型&#xff1a;BIO、NIO、AIO 实际通信需求下&am…

Centos忘记密码,重置root密码

Centos忘记密码&#xff0c;重置root密码 操作环境&#xff1a;Centos7.6 1、选择包含rescue的选项&#xff0c;按e进入编辑模式 首先&#xff0c;我们需要重启系统&#xff0c;进入开机引导菜单界面。在这里&#xff0c;我们可以看到系统的内核版本和启动参数等信息。我们需…

【JavaEE精炼宝库】文件操作(2)——文件内容读写 | IO流

文章目录 一、输入流1.1 InputStream 概述&#xff1a;1.2 read 方法详解&#xff1a;1.3 close 方法&#xff1a;1.4 利用 Scanner 进行读操作&#xff1a;1.5 Reader&#xff1a; 二、输出流2.1 OutputStream 概述&#xff1a;2.2 write 方法详解&#xff1a;2.3 利用 PrintW…

学习测试8-数据库mysql操作

下载配置mysql 网络博客 使用 在Linux里 1 service mysql start 启动服务 2 在Navicatt 中连接Linux服务器 3 第一步 将所有文件上传到/opt目录下 第二步 chmod 777 deploy-mysql.sh 第三步 ./deploy-mysql.sh4 service mysql status 查看状态是否安装成功 5 重启mys…

Typescript 模块小知识-global scope

问题表现 在编写ts代码的时候遇到一个问题, 表现为, 如果在某个ts工程中, 如果多个文件里面没有任何导出export或者是export default, 那么这些文件如果有const或者是let定义相同的声明都会报错如下 无法重新声明块范围变量 a/a.ts 和 index.ts 和 index2.ts 都没有进行expor…

对于远程仓库, 只给出了下载安装包的选项没有给出克隆虚的相关代码怎么办?

问: % git clone https://xxxx.xxxx.com/xxxx/css-manage/tree/master Cloning into master... fatal: unable to update url base from redirection:asked for: https://xxxx.xxxx.com/xxxx/css-manage/tree/master/info/refs?servicegit-upload-packredirect: https://xxxx…

基于Redisson 实现 Redis 分布式锁

代码示例&#xff1a; GetMapping("/testJmeter")public void testJmeter() {synchronized (this){int stock Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"))if (stock > 0) {int realStock stock - 1;stringRedisTemplate.opsFo…

盘点:流媒体视频流协议与EasyCVR视频监控技术的深度融合

随着科技的不断进步&#xff0c;视频监控技术已经渗透到了社会的各个角落&#xff0c;从公共安全到企业运营&#xff0c;再到家庭安全&#xff0c;其应用范围日益广泛。而视频流格式作为视频监控技术的核心要素之一&#xff0c;其选择和应用对于确保视频传输的流畅性、清晰度和…

Python爬虫教程第3篇-解决使用reqeusts遇到的ProxyError异常

起因 问题出现在windows电脑上&#xff0c;我用mac执行程序的时候并不会报错&#xff0c;但是如果在windows上的时候&#xff0c;大部分windows电脑会报错&#xff0c;而有些版本低的windows电脑又不会报错。 异常栈信息 HTTPSConnectionPool, Cannot connect to proxy, no …

基于SpringBoot的校园疫情防控系统

你好&#xff0c;我是专注于计算机科学与技术的研究者。如果你对我的工作感兴趣或有任何问题&#xff0c;欢迎随时联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架&#xff0c;B/S架构 工具&#xff1a;Eclipse&#xff0c;Mav…

2024中国互联网大会 | 中国电信携手产业链伙伴推动低空经济行业创新与发展

低空经济是指以民用有人驾驶和无人驾驶航空器在低空空域内的各类飞行活动为牵引&#xff0c;辐射带动相关领域融合发展的综合经济形态。2024年全国两会&#xff0c;“低空经济”首次写入国务院政府工作报告。 赛迪顾问在《中国低空经济发展研究报告&#xff08;2024&#xff09…

【Linux】docker和docker-compose 区别是什么

Docker 和 Docker Compose 是用于容器化应用的工具,它们在开发、部署和管理容器化应用程序时有不同的作用。以下是对它们的简要介绍和功能描述: Docker 定义: Docker 是一个开源的平台,允许开发者自动化地部署、扩展和管理应用程序容器。容器是一种轻量级、可移植、独立的软…

详解C#委托与事件

在C#中&#xff0c;委托是一种引用类型的数据类型&#xff0c;允许我们封装方法的引用。通过使用委托&#xff0c;我们可以将方法作为参数传递给其他方法&#xff0c;或者将多个方法组合在一起&#xff0c;从而实现更灵活的编程模式。委托类似于函数指针&#xff0c;但提供了类…

Redis的一个典型应用

1.redis服务器与python编程环境 #install server sudo apt update sudo apt install redis-server #install python api pip install redis --timeout 200 -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com 1.1 测试代码 # 创建Redis客户端实例…

树状数组(Binary Indexed Tree, BIT)

树状数组&#xff08;Binary Indexed Tree, BIT&#xff09; 树状数组&#xff08;Binary Indexed Tree, BIT&#xff09;&#xff0c;也称为 Fenwick Tree&#xff0c;是一种用于高效处理数组前缀和查询和单点更新的数据结构。它能够在 (O(\log n)) 时间内完成单点更新和前缀…