基于eBPF的procstat软件追踪程序垃圾回收(GC)事件

news2024/9/20 14:40:45

在性能敏感的应用程序中,偶尔遇到程序无故卡顿是开发者们常见的挑战之一。这种现象可能会表现为突然的延迟、系统响应时间增加、吞吐量的下降。这类问题的根源可能是编程语言的垃圾回收(Garbage Collection,GC)导致,尤其是在内存管理上有着较高压力的情况下。
然而,识别和跟踪这些GC事件并非易事。GC发生时,程序线程会暂停执行(如Golang的Stop-the-World,Java的GC暂停),这一操作可能影响到应用的性能表现。在传统的监控方法中,很难准确捕捉到这些事件的开始与结束。为了有效应对这种挑战,基于eBPF的procstat软件提供了一种强大且高效的追踪机制,帮助开发者轻松掌握GC事件的执行情况,尤其是在性能敏感场景下。

背景:GC与程序卡顿

垃圾回收是现代编程语言(如Java、Go)中的核心机制,帮助开发者自动管理内存,释放不再使用的对象。然而,GC并非免费的操作,它需要消耗CPU资源并暂停正在执行的线程以清理内存,尤其是在Stop-the-World的GC模型中,所有工作线程在垃圾回收期间都会被暂停。这种暂停,虽然通常非常短暂,但在高并发、高负载的系统中,即使是几毫秒的GC暂停也可能导致显著的性能抖动。
例如,在一个高频交易系统中,每一次停顿都会影响交易的执行时间,从而造成经济损失。在这种情况下,准确定位和监控GC事件的影响就显得至关重要。然而,常见的性能分析工具往往难以做到对GC暂停的精细追踪,这时,基于eBPF的procstat软件就能够大显身手。

eBPF简介

eBPF(Extended Berkeley Packet Filter)是一种强大的内核技术,最初用于网络数据包过滤。如今,eBPF已经发展成为一种通用的内核编程平台,广泛应用于性能监控、安全审计、网络分析等领域。它的强大之处在于能够在内核中高效、灵活地运行用户定义的代码,同时对系统性能的影响极小。eBPF允许开发者编写自定义的代码,并将这些代码动态加载到内核中,以监控各种系统级和应用级事件。由于eBPF程序在内核中运行,因此它能够以极低的开销实时捕获事件并反馈给用户。

uprobe:用户态函数监控
uprobe 是eBPF提供的一种能力,专门用于监控用户态程序中的特定函数。通过设置 uprobe、uretprobe,开发者可以在目标程序的函数被调用或退出时,自动触发预先定义的eBPF程序,从而捕获该函数的执行情况。其特点有:

  1. 函数挂钩:uprobe 可以挂钩到任意用户态函数,无论是标准库函数还是用户自定义函数。当该函数被调用时,uprobe 会触发EBPF程序的执行。
  2. 精确捕获:uprobe 能够精确捕获函数的调用时间、参数、返回值等关键信息。这对性能分析和调试非常有帮助。
  3. 轻量级监控:与传统的调试工具相比,uprobe 和eBPF结合后的监控方案不会影响程序的功能,对性能影响也很小,尤其是监控不常运行到的异常分支,如本文介绍的垃圾回收,几乎不影响程序性能。

在本文中,eBPF被用来捕获程序的GC事件,通过与 uprobe 结合,实现对程序的垃圾回收操作的实时监控。

procstat软件简介

procstat是一款基于eBPF的监控软件,运行在Linux平台,主要用于跟踪目标程序的运行状态,并报告异常指标,是分析程序性能问题的一大利器。procstat软件能够用于追踪golang及jvm程序的垃圾回收(GC)情况,实时捕捉垃圾回收相关信息。当检测到垃圾回收的时间超过阈值时,procstat会在日志中输出详细的信息,包括回收时长、回收次数等,帮助开发者快速定位问题根源。接下来我们将通过一个小实验来展示一下procstat软件是如何追踪垃圾回收的。此软件可以在以下链接中下载到,并提供免费试用,后续还会有版本更新迭代,使用时需要能连互联网环境。
Github下载链接

GC示例代码

我们通过一个简单的 golang 程序来演示如何使用 procstat 追踪垃圾回收时间。以下是我们的示例程序:

package main
import (
    "time"
)
func main() {
    for {
        allocateMemory()
        time.Sleep(100 * time.Millisecond)
    }
}
func allocateMemory() []byte {
    mem := make([]byte, 1024*1024)
    mem = nil
    return mem
}

这个程序简单地在一个无限循环中每次申请1MB内存空间,然后sleep 100毫秒,之后不再保留这块内存的引用。会触发垃圾回收操作。

使用procstat追踪GC事件

编译并启动上述代码后,使用procstat软件来监控该程序的GC行为。本实验中,编译后的程序名为test。首先,将procstat软件的配置中将gc的阈值设置为0,单位是纳秒,意思是当进程发生gc就会输出日志。
配置设置
配置文件位置在procstat目前下的conf目录中,名为config.json。

    "gc_stat": {
        "gc_duration": 0,
        "libjvm_path": ""
    }

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

[root@VM-8-2-centos go_gc]# ls
test  test.go
[root@VM-8-2-centos go_gc]# ./test &
[1] 3983572
[root@VM-8-2-centos go_gc]#
[root@VM-8-2-centos go_gc]# cd /root/work_dir/procstat/bin
[root@VM-8-2-centos bin]# sh start.sh -p 3983572
Start Loading...!
Start Stating...!

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

procstat软件日志

一、接下来我们查询procstat的日志信息,并搜索[GC]关键字。
GC从上图的日志中可以看出已经成功地捕获到了test进程的GC操作,我们对第1行日志分析一下:
(1)GC发生的时间是12:19:47.664795232,精确到纳秒级别;
(2)发生GC的进程名称是test,进程id是3983572,线程id是3983574;
(3)发生GC的时长是79479纳秒。
二、搜索[GC STAT]关键字。
GC STAT上图是每秒输出一次的GC统计信息,可以看出已经成功地捕获到了test进程的GC操作,我们对第1行日志分析一下:
(1)发生GC的进程名称是test,进程id是3983572,线程id是3983572;
(2)当秒该线程发生GC的总时长是63115纳秒;
(3)当秒该线程每次的平均GC时长是63115纳秒;
(4)当秒该线程发生的最长的GC时长是63115纳秒;
(5)当秒该线程共发生1次GC;
(6)当秒该线程发生的最长的GC是第1次GC。

总结

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

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

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

相关文章

超易用的AI训练页面!训练推理一体化助你快速炼制AI模型!

模型训练页面展示 AI绘画的热度也不是一天两天了。之前很火的粘土画风转换、AI漫画风格图像等等也都是由AI绘画来实现的。但要想训练一个模型需要很多繁琐的步骤&#xff0c;甚至很多小白都找不到训练模型的资源。 不过现在这个问题已经不需要担心了&#xff0c;厚德云推出了一…

vue websocket 使用

基于webSocket通信的库主要有 socket.io&#xff0c;SockJS 关于SockJS的使用 先安装 sockjs-client 和 stompjs npm install sockjs-client npm install stompjs import SockJS from sockjs-client; import Stomp from stompjs; export default { data () { …

一文看懂Elasticsearch的技术架构:高效、精准的搜索神器

一、概述 Elasticsearch 以其强大的全文本搜索功能而闻名。速度之所以这么快&#xff0c;因为 Elasticsearch 核心采用的是倒排索引&#xff1b;它功能之所以这么强大&#xff0c;是因为采用了可调相关度分数、高级查询 DSL 以及可提升搜索能力的诸多功能。 然而全文本搜索只是…

OpenCV特征检测(4)检测图像中的角点函数cornerHarris()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 Harris 角点检测器。 该函数在图像上运行 Harris 角点检测器。类似于 cornerMinEigenVal 和 cornerEigenValsAndVecs&#xff0c;对于每个像素 (…

LeetCode[中等] 54.螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 思路&#xff1a;定义方向数组&#xff0c;按照顺时针顺序&#xff1a;右(0,1)&#xff0c;下(1,0)&#xff0c;左(0,-1)&#xff0c;上(0,-1) 从矩阵的左上角开始遍历…

卷积参数量计算公式

1. 普通卷积&#xff08;Standard Convolution&#xff09; 普通卷积的参数量计算包括卷积核的权重和可能的偏置项。 2. 深度卷积&#xff08;Depthwise Convolution&#xff09; 深度卷积是逐通道的卷积操作&#xff0c;每个输入通道都有一个独立的卷积核。 3. 逐点卷积&…

骨传导耳机哪个牌子好?盘点口碑最好的5款骨传导耳机!

在快节奏的现代生活中&#xff0c;耳机成为了我们与外界沟通的重要桥梁&#xff0c;无论是在通勤路上、健身锻炼&#xff0c;还是在工作学习中&#xff0c;耳机都扮演着不可或缺的角色。而在众多耳机类型中&#xff0c;骨传导耳机以其独特的声音传导方式和健康舒适的佩戴体验&a…

C语言中的assert断言

Assert断言 断言是程序中处理异常的一种高级形式。可以在任何时候启用和禁用断言验证&#xff0c;因此可以在测试时启用断言&#xff0c;而在部署时禁用断言。同样&#xff0c;程序投入运行后&#xff0c;最终用户在遇到问题时可以重新启用断言。 用法&#xff1a; #…

Qt窗口——QDockWidget

文章目录 浮动窗口浮动窗口使用示例 浮动窗口 QDockWidget浮动窗口可以认为是子窗口&#xff0c;每一个子窗口都可以停靠在四周&#xff0c;像Qt Creator页面&#xff0c;就很多的子窗口&#xff1a; 浮动窗口使用示例 创建&#xff1a; QDockWidget* dockWidget new QDock…

宝马I-Plus手动变速器、K手动变速器、G手动变速器解析

(一) I-Plus手动变速器 1、技术特点 (1)改进齿轮组件结构。I-Plus手动变速器采用第四挡(直接挡)高转速方案&#xff0c;这样可以在保持轴中心距不变的前提下减小啮合力。由此提高驱动力矩后&#xff0c;使得在带有N53B3000发动机的528i车型上首次使用 I 手动变速器。 对啮合面几…

Python精选200Tips:151-155

实战项目 P151--气象数据爬取技术栈:数据爬虫P152--求解数独问题技术栈:代码逻辑+回溯法P153--疾病传播模型的100天模拟技术栈:SIR 模型(易感-感染-恢复模型)P154--复杂函数的最值求解技术栈:粒子群优化算法P155-- 评论情感分析技术栈:snownlp和jieba的应用运行系统:ma…

Opencv+Cuda编译的保姆级别教程

OpencvCuda编译的保姆级别教程 一、环境总览二、环境准备2.1 opencv和opencv扩展2.2 cuda环境下载2.2.1 首先电脑要有英伟达的显卡2.2.2 然后查看显卡驱动版本2.2.3 下载Cuda Toolkit工具包2.2.4 下载Cudnn库 2.3 CMake下载 三、CMake配置步骤3.1 加载路径第一次Configure3.1.1…

前端——表格、列表标签

今天我们来学习一下web开发里面的表格标签、列表标签 常用快捷键&#xff1a; shift alt 下 复制粘贴选中内容 表格标签 table HTML 表格由 <table> 标签来定义。 HTML 表格是一种用于展示结构化数据的标记语言元素。 每个表格均有若干行&#xff08;由 <tr>…

yolov5测试代码

一般源码的测试代码涉及很多文件&#xff0c;因项目需要写一个独立测试的代码。传入的是字典 import time import cv2 import os import numpy as np import torch from modules.detec.models.common import DetectMultiBackend from modules.detec.utils.dataloaders import …

京东商品属性的详细api数据解析:颜色、尺寸与材质

京东&#xff08;JD.com&#xff09;作为一个大型电商平台&#xff0c;其商品信息通过API接口提供给开发者或第三方服务使用&#xff0c;以便进行商品搜索、展示、分析等操作。然而&#xff0c;直接访问京东的详细商品属性&#xff08;如颜色、尺寸、材质等&#xff09;API通常…

数据的表示和存储 第2讲 定点数的编码表示

​ 互联网行业 算法研发工程师 ​ 全文概括&#xff1a; 本讲介绍了定点数的编码表示&#xff0c;主要包括原码、补码和移码。 原码表示方式简单&#xff0c;正数用0表示&#xff0c;负数用1表示&#xff0c;但存在表示不唯一和加减运算不统一的问题。 补码表示方式解决了…

zabbix“专家坐诊”第256期问答

原作者&#xff1a;乐维社区 原文链接&#xff1a;https://forum.lwops.cn/questions 问题一 Q&#xff1a;zabbix 6.4.18版本的&#xff0c;使用zabbix_agentd2监控mysql数据库&#xff0c;只能在界面配置mysql的相关信息吗&#xff1f;这个在zabbix表里面是明文存储的&#x…

集采良药:从“天价神药”到低价良药,伊马替尼的真实世界研究!

在医疗科技日新月异的今天&#xff0c;有一种药物以其卓越的疗效和深远的影响力&#xff0c;成为了众多患者心中的“精准武器”——伊马替尼。这款药物不仅在慢性髓细胞白血病&#xff08;CML&#xff09;的治疗上屡创佳绩&#xff0c;更是胃肠道间质瘤&#xff08;GIST&#x…

微信小程序自定义navigationBar顶部导航栏(背景图片)适配所有机型,使用tdesign-miniprogram t-navbar设置背景图片

设置导航栏样式自定义 一定要设置&#xff0c;不然页面会出现一个原生的导航栏&#xff0c;一个自定义的 // app.json文件 "window": {"navigationStyle": "custom" }设置导航栏样式 我这里使用tdesign-miniprogram t-navbar&#xff0c;t-na…

大模型的热度正在下降,大模型的未来在哪里?

“ 技术是一个需要沉淀和厚积薄发的过程 ” 任何事物都会经过起步&#xff0c;发展&#xff0c;顶峰&#xff0c;平稳&#xff0c;下降&#xff0c;灭亡的过程&#xff0c;大模型技术也不例外。 而从现今的趋势来看&#xff0c;大模型的热度正在不断下降&#xff0c;这到底意…