首页 > 其他分享 >基于eBPF的procstat软件追踪等待锁和持有锁的时间

基于eBPF的procstat软件追踪等待锁和持有锁的时间

时间:2024-07-09 13:28:02浏览次数:15  
标签:std 监控 eBPF lock 程序 procstat 软件 追踪

在并发编程中,锁的使用是保证线程安全的重要手段。然而,过度使用锁或者锁竞争可能导致性能瓶颈。为了分析程序中锁的使用情况,我们可以借助procstat软件来追踪程序加锁时间和等待锁的时间。procstat是一个基于eBPF(extended Berkeley Packet Filter)的软件,能够对系统的各种行为进行细粒度的追踪和分析。
之前写过一篇的使用procstat软件检测死锁问题文章,欢迎大家阅读。

procstat软件简介

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

多线程加锁示例代码

本文将使用以下示例程序,演示如何使用procstat软件来分析锁的使用情况。

#include <iostream>
#include <mutex>
#include <thread>
std::mutex mtx;
void func1()
{
    while (1) {
        std::lock_guard<std::mutex> lock(mtx);
        std::this_thread::sleep_for(std::chrono::milliseconds(1));
    }
}
void func2()
{
    while (1) {
        std::lock_guard<std::mutex> lock(mtx);
        std::this_thread::sleep_for(std::chrono::milliseconds(1));
    }
}
void func3()
{
    while (1) {
        bool is_lock = mtx.try_lock();
        std::this_thread::sleep_for(std::chrono::milliseconds(1));
        if (is_lock) {
            mtx.unlock();
        }
    }
}
int main()
{
    std::thread t1(&func1);
    std::thread t2(&func2);
    std::thread t3(&func3);
    t1.join();
    t2.join();
    return 0;
}

在以上代码中,创建了3个子线程func1、func2、func3和1个互斥锁mtx,这三个线程都尝试争抢这个锁,持有成功后sleep 1毫秒,然后将锁释放。

使用procstat追踪锁操作

编译并启动上述代码后,使用procstat软件来监控该程序并检测锁操作。本实验中,编译后的程序名为test。首先,将procstat软件的配置中将持有锁和等待锁的阈值设置为0,单位是纳秒,意思是当进程持有锁时长和等待锁时长超过阈值就会输出警告日志。
配置设置
配置文件位置在procstat目前下的conf目录中,名为config.json。

"lock_stat": {
        "lock_duration": 0,
        "wait_lock_duration": 0
}

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

[root@VM-8-2-centos bin]# ./test &
[1] 1543495
[root@VM-8-2-centos bin]#
[root@VM-8-2-centos bin]# sh start.sh -p 1543495
Start Loading...!
Start Stating...!

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

procstat软件日志

接下来我们查询procstat的日志信息,并搜索LOCK、WAIT LOCK关键字。
锁操作时长监控从结果图中可看出,被监控的test进程的不同线程都在进行抢锁的操作,并且持有锁的时长([LOCK]关键字)都是1ms左右,等待锁的时长([WAIT LOCK]关键字)也被统计出来。

总结

锁操作是多线程编程中常用的技术。基于eBPF的procstat软件通过实时监控程序的锁操作,提供了一种高效且精确的追踪加锁和等待锁时长的功能。通过深入标准库内部的监控,procstat能够帮助开发者快速定位锁性能问题,提升程序的稳定性和可靠性。
procstat软件还可以监测很多的程序异常状态,随着eBPF技术的不断发展和procstat软件不断的迭代,希望能够帮助大家定位程序的性能问题和异常问题,进一步提升对软件和操作系统的监控能力,欢迎大家试用,有问题请私信我,共同学习、交流,共同进步!

标签:std,监控,eBPF,lock,程序,procstat,软件,追踪
From: https://blog.csdn.net/2401_84703565/article/details/140292318

相关文章

  • 在Spring Boot项目中集成分布式追踪系统
    在SpringBoot项目中集成分布式追踪系统大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!在复杂的分布式系统中,定位和解决问题是一项挑战。分布式追踪系统通过跟踪请求的调用链,帮助开发者分析和优化系统性能,确保各个服务之间的协调与合作。本文将探讨如何......
  • 香橙派编译linux内核支持ebpf和虚拟WIFI
    前言上一篇文章香橙派5plus上跑云手机方案一redroid(带硬件加速)中说了怎么运行redroid,这篇补一下怎么修改参数编译内核。补充上篇文章有个内容需要补充一下:更新完内核需要用下面的命令防止内核被apt更新,不然后面使用aptupdate又回到官方的内核(注意版本号,当前是1009)。sudo......
  • 追踪WebKit的缺陷:深入探索Bug跟踪系统
    ......
  • 论文阅读总结:在难治性抑郁症患者中,情绪面孔的注意偏倚与抑郁严重程度之间关系的眼动追
    原文标题:Eye‑trackingevidenceofarelationshipbetweenattentionalbiasforemotionalfacesanddepressionseverityinpatientswithtreatment‑resistantdepression中文译名:在难治性抑郁症患者中,情绪面孔的注意偏倚与抑郁严重程度之间关系的眼动追踪证据原文地......
  • 应对Web安全防护,溯源追踪攻击者。
    前言随着时代的进行,互联网站走进千家万户,网络安全问题也逐渐提上日程,国家对网络安全也欲加重视。一、重视保护现如今,大数据已成为必要发展趋势。Web网站也成为人们获取信息和企业开放产品的重要行式。提到网站,就不得不提到Web安全。仍有许多企业不重视,不在乎Web安全,只要求......
  • 解决接入sleuth链路追踪后xxl-job定时任务的日志无日志问题
    问题背景随着业务规模的不断的增大,系统的复杂度也越来越高,公司软件架构也进入到了分布式微服务的阶段,在这样的情况下每一次请求都有可能跨越多个项目,传统的日志监控方式无法满足调用链路追踪,这就导致问题定位/诊断服务变得复杂。所以我们引入了sleuth这一链路追踪框架为......
  • 【仿真】UR机器人手眼标定与实时视觉追踪(单目)
    这段代码实现了一个机器人视觉引导系统,主要功能包括:连接仿真环境,控制UR机器人。相机标定:使用棋盘格图案进行相机内参标定通过移动机器人采集多组图像使用calibrateCamera函数计算相机内参手眼标定:采集机器人末端位姿和对应的棋盘格图像使用calibrateHandEye函数计算......
  • 热搜不再错过:用Python打造你的微博热搜追踪器
    简介在当今信息爆炸的时代,获取最新、最热门的信息成为了许多人的日常需求。微博热搜榜作为反映社会热点和公众关注焦点的重要窗口,其信息价值不言而喻。本文将介绍一个实用的Python爬虫程序,它能够自动爬取微博热搜榜的信息,并通过邮件的形式将这些信息发送给用户,帮助用户及时......
  • 用Python的pynput库追踪每一次点击和滚动
    哈喽,大家好,我是木头左!在编程的世界里,有时需要洞察用户的行为模式,尤其是在游戏开发、用户界面设计或者行为分析等领域。一个常见而有趣的任务是追踪鼠标的活动,比如左键点击、右键点击和滚轮滚动。今天,将探索如何使用Python的pynput库来实现这一功能,从而开启对用户交互行为的洞察......
  • Unity3D 用贝塞尔曲线进行弹道追踪
    usingSystem.Collections;usingSystem.Collections.Generic;usingUnity.Collections.LowLevel.Unsafe;usingUnityEngine;usingUnityEngine.UI;publicclassBulletLogic:MonoBehaviour{//Startiscalledbeforethefirstframeupdate//飞行速度最大......