尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SkyWalking 持续剖析(Continuous Profiling)指南:基于 eBPF 的自动触发式性能诊断配置与原理

SkyWalking 持续剖析(Continuous Profiling)指南:基于 eBPF 的自动触发式性能诊断配置与原理 可观测性APM链路追踪指标监控日志分析微服务【免费下载链接】skywalkingAPM, Application Performance Monitoring System项目地址https://gitcode.com/gh_mirrors/sk/skywalking点击查看免费下载SkyWalking 的持续剖析Continuous Profiling借助 eBPF 技术与进程监控能力在系统负载、进程 CPU、HTTP 错误率等指标达到预设阈值时自动触发 On CPU / Off CPU / Network 剖析任务从而主动发现性能瓶颈与潜在问题。本文以官方后端部署文档为主体结合 OAP 源码、默认配置文件与端到端测试用例完整讲解持续剖析的启用方式、策略配置、触发机制与静默期设计帮助你直接上手配置并理解其底层实现。持续剖析是什么持续剖析利用 eBPF其核心价值在于主动发现问题无需人工介入指标异常时立即采样降低资源浪费剖析任务只在必要时触发而不是持续全量采样覆盖多种瓶颈场景既可定位 CPU 密集型问题也能定位线程切换、网络延迟等问题。在 SkyWalking 的剖析能力体系中持续剖析与进程内剖析Tracing Profiling、Java/Go App Profiling和进程外剖析On-CPU / Off-CPU / Network Profiling并列是由 eBPF Agent 提供动力的第三种剖析方式详情可参考 Profiling 总览。在 OAP 中启用持续剖析持续剖析复用了 eBPF Profiling 的协议服务因此只需确保 eBPF Profiling receiver 处于运行状态即可。在 OAP 的 application.yml 中receiver-ebpf模块的默认配置如下receiver-ebpf: selector: ${SW_RECEIVER_EBPF:default} default: # The continuous profiling policy cache time, Unit is second. continuousPolicyCacheTimeout: ${SW_CONTINUOUS_POLICY_CACHE_TIMEOUT:60} gRPCHost: ${SW_EBPF_GRPC_HOST:0.0.0.0} gRPCPort: ${SW_EBPF_GRPC_PORT:0} maxConcurrentCallsPerConnection: ${SW_EBPF_GRPC_MAX_CONCURRENT_CALL:0} maxMessageSize: ${SW_EBPF_ALS_GRPC_MAX_MESSAGE_SIZE:0} gRPCThreadPoolSize: ${SW_EBPF_GRPC_THREAD_POOL_SIZE:0} gRPCSslEnabled: ${SW_EBPF_GRPC_SSL_ENABLED:false} gRPCSslKeyPath: ${SW_EBPF_GRPC_SSL_KEY_PATH:} gRPCSslCertChainPath: ${SW_EBPF_GRPC_SSL_CERT_CHAIN_PATH:} gRPCSslTrustedCAsPath: ${SW_EBPF_GRPC_SSL_TRUSTED_CAS_PATH:}其中与持续剖析直接相关的关键参数是continuousPolicyCacheTimeout默认 60 秒它控制 OAP 端持续剖析策略的本地缓存时长。从源码看该参数定义于 EBPFReceiverModuleConfig.java缓存用于避免每次 eBPF Agent 拉取策略时都穿透查询存储层。在模块启动阶段EBPFReceiverProvider.java 会完成以下初始化加载官方 OAL 脚本EBPFOALDefine指向oal/ebpf.oal根据gRPCPort是否大于 0 决定启动独立 gRPC 服务或复用共享服务SharingServerModule注册EBPFProcessServiceHandler、EBPFProfilingServiceHandler、ContinuousProfilingServiceHandler、AccessLogServiceHandler四个 gRPC 处理器。其中 ContinuousProfilingServiceHandler.java 即持续剖析协议的核心入口提供了queryPolicies策略下发与reportProfilingTask剖析任务上报两个 RPC 方法。持续剖析策略的配置持续剖析策略以服务Service实体为粒度进行配置主要包含以下字段Service需要监控进程的目标服务实体。Targets触发目标配置触发条件。Target Type目标类型触发后执行的剖析类型目前支持 On CPU Profiling、Off CPU Profiling、Network Profiling 三种。Check Items检测项检测条件多条规则只需满足其一即可启动任务。Type监控类型目前支持 System Load、Process CPU、Process Thread Count、HTTP Error Rate、HTTP Avg Response Time。Threshold阈值判断监控值是否达到预期。Period周期监控数据的时间段秒可理解为最近一段时间。Count次数在检测周期内阈值被触发的次数秒可理解为最近一段时间秒内指定阈值规则被触发的总次数。一旦次数条件满足就会启动指定的剖析任务。URI用于 HTTP 相关监控类型可过滤特定的 URI。上述配置在源码中对应 ContinuousProfilingPolicyConfiguration.java 的数据结构targetCheckers是一个目标类型 → 监控类型 → 检测项的嵌套映射检测项CheckItem包含threshold、period、count、uriList、uriRegex五个字段。目标类型Target Type对应 ContinuousProfilingTargetType.java 中的枚举任务被触发后的实际执行范围如下目标类型触发后的剖析行为On CPU Profiling对满足阈值的进程执行 eBPF On CPU 剖析分析线程栈占用 CPU 的情况Off CPU Profiling对满足阈值的进程执行 eBPF Off CPU 剖析分析上下文切换、I/O 等待等Network Profiling对满足阈值进程所在实例内的所有进程执行 eBPF Network Profiling分析 L4/L7 网络流量注意 Network Profiling 的作用范围与另外两种不同它会扩展到同一实例内的全部进程便于从网络拓扑角度定位问题。策略的存储与版本控制策略保存后OAP 将其落库到continuous_profiling_policy索引。从 ContinuousProfilingPolicy.java 可以看到每条策略记录包含service_id策略所属服务configuration_json策略配置的 JSON 序列化仅存储长度上限 5000uuid策略版本标识。uuid是策略同步的关键eBPF Agent 定期调用queryPolicies携带本地已生效策略的uuidOAP 在 ContinuousProfilingServiceHandler.queryPolicies 中比对数据库中的uuid不一致时才通过ContinuousProfilingPolicyCommand命令向 Agent 下发最新策略从而避免重复下发。一个真实的策略配置示例仓库的端到端测试用例 policy.yaml 给出了完整的策略格式与监控类型阈值说明# Monitoring type with threshold # PROCESS_CPU: Monitoring Process CPU percent, threshold value in [0-100] # PROCESS_THREAD_COUNT: Monitoring process thread count, threshold value must bigger than zero # SYSTEM_LOAD: Monitoring current system load, threshold value must bigger than zero # HTTP_ERROR_RATE: Monitoring the process HTTP response error(status500) percent, threshold value in [0-100] # HTTP_AVG_RESPONSE_TIME: Monitoring the process HTTP response duration(ms), threshold value must be bigger than zero policy: - type: ON_CPU checkers: - type: PROCESS_CPU threshold: 10 period: 10 count: 3该示例表达的策略语义是当进程 CPU 使用率在最近 10 秒内有 3 次达到 10% 时对该进程触发一次 On CPU 持续剖析任务。各监控类型的阈值取值范围总结如下监控类型阈值取值范围含义PROCESS_CPU[0-100]进程 CPU 使用率百分比PROCESS_THREAD_COUNT 0进程线程数SYSTEM_LOAD 0当前系统负载值HTTP_ERROR_RATE[0-100]进程 HTTP 响应错误status 500百分比HTTP_AVG_RESPONSE_TIME 0进程 HTTP 响应时长毫秒说明持续剖析相关文档如本页面与 概念设计文档 将 HTTP 错误定义为 4xx/5xx而 e2e 测试用例的注释将错误定义为 status 500两种口径在仓库内并存配置时请以实际版本说明为准。通过 swctl 命令行配置策略策略既可通过 UI 界面配置也可通过 swctl 命令行工具操作。测试用例 profiling-cases.yaml 展示了完整的命令序列# 设置策略--config 指向策略 YAML 文件 swctl --base-urlhttp://oap-host:12800/graphql --display yaml profiling continuous set \ --service-name sqrt --config policy.yaml # 查询已配置的策略 swctl --base-urlhttp://oap-host:12800/graphql --display yaml profiling continuous ls \ --service-name sqrt # 查询持续剖析监控状态按目标类型过滤 swctl --base-urlhttp://oap-host:12800/graphql --display yaml profiling continuous monitoring \ --service-name sqrt --target On_CPU # 列出由持续剖析触发的 eBPF 剖析任务 swctl --base-urlhttp://oap-host:12800/graphql --display yaml profiling ebpf list \ --service-name sqrt --trigger CONTINUOUS_PROFILING监控与上报指标策略保存后eBPF Agent 会根据服务级配置对该服务下的进程执行监控。监控过程中Agent 会把监控数据上报给 OAP 存储便于实时掌握监控状态。主要指标如下监控类型单位描述System LoadLoad指定时间段的系统负载平均值Process CPUPercentage进程 CPU 使用率百分比Process Thread CountCount进程内的线程数HTTP Error RatePercentageHTTP 请求返回错误响应如 4xx 或 5xx 状态码的百分比HTTP Avg Response TimeMillisecondHTTP 请求的平均响应时间在 OAP 侧监控类型枚举定义于 ContinuousProfilingMonitorType.java与上报协议中的ContinuousProfilingTriggeredMonitorType一一对应。测试用例通过 OAL 指标表达式continuous_profiling_process_cpu验证监控数据的落库与可查询性swctl --base-urlhttp://oap-host:12800/graphql --display yaml metrics exec \ --service-name sqrt --instance-name test-instance --process-name sqrt \ --expressioncontinuous_profiling_process_cpu阈值触发机制滑动时间窗口在 eBPF Agent 内部数据按周期采集并采用**滑动时间窗口sliding time window**技术保存最近Period个周期的数据每个周期内用Threshold规则校验该周期数据是否满足条件统计滑动时间窗口内满足条件的次数若次数超过Count值则触发对应的剖析任务。滑动时间窗口保证了评估时始终参考最近、最相关的数据使判断更准确、更具动态性一旦满足条件即自动启动性能分析帮助及时暴露潜在瓶颈。任务触发的源码链路当 Agent 判定触发后会调用reportProfilingTaskRPC。从 ContinuousProfilingServiceHandler.reportProfilingTask 的实现可以看到为任务构造EBPFProfilingTaskRecord其中triggerType固定为CONTINUOUS_PROFILING区别于手动触发的MANUAL根据请求中的ONCPU / OFFCPU / NETWORK分支设置目标类型targetType对 NETWORK 类型会额外生成网络采样扩展配置EBPFProfilingTaskExtension将 Agent 上报的 URI 正则列表转换为采样规则并设置requireCompleteRequest/requireCompleteResponse等采集选项任务持久化后通过ContinuousProfilingReportCommand命令通知 Agent 开始执行剖析。端到端测试的期望结果 trigger-task.yml 展示了被触发任务的典型结构可用于对照验证- taskid: task id servicename: sqrt serviceinstancename: test-instance processname: sqrt triggertype: CONTINUOUS_PROFILING fixedtriggerduration: 600 continuousprofilingcauses: - type: PROCESS_CPU singlevalue: threshold: 1000 current: 触发时的监控值 message: 触发原因描述 targettype: ON_CPU触发原因Causes与静默期Silence Period触发原因Agent 上报剖析任务时会同时上报触发原因主要包括Process触发策略的具体进程Monitor Type被触发的监控类型Threshold配置的阈值Current规则触发时刻的监控值。OAP 在 parseTaskCause 中按监控类型格式化原因描述对 PROCESS_CPU、HTTP_ERROR_RATE格式化为百分比形式如current 15.00% threshold 10.00%对 PROCESS_THREAD_COUNT、SYSTEM_LOAD格式化为整数比较如current 12 threshold 10对 HTTP_AVG_RESPONSE_TIME格式化为毫秒比较如current 250.00ms threshold 200.00ms若包含 URI 过滤条件描述末尾还会追加on uri标识命中的具体 URI。最终的message字段形如PROCESS_CPU: current 15.00% threshold 10.00%方便在剖析任务列表中直接定位问题根因。静默期触发持续剖析任务后eBPF Agent 支持静默期Silence Period特性在指定时间段内禁止再次触发剖析任务。该设计用于防止进程持续达到阈值时无限启动剖析任务从而避免剖析本身对系统造成额外负担。静默期的时长由 Agent 侧策略控制是保护生产环境的必要机制。端到端验证链路仓库在 test/e2e-v2/cases/profiling/ebpf/continuous/ 下提供了完整的持续剖析验证用例覆盖 ES、BanyanDB、PostgreSQL 等存储完整链路包括查询服务 / 实例 / 进程元数据通过 swctl 设置并查询持续剖析策略校验监控指标continuous_profiling_process_cpu是否有值查询CONTINUOUS_PROFILING触发的剖析任务及其调度记录对调度记录执行profiling ebpf analysis获取剖析分析结果查询持续剖析监控状态。这套用例既是功能回归测试也可以作为部署后验证持续剖析是否正常工作的操作手册。延伸阅读Profiling 概念与设计总览三种剖析方式进程内、进程外、持续剖析的完整对比eBPF CPU 剖析详解On-CPU / Off-CPU 剖析的技术原理eBPF Profiling 后端配置eBPF 剖析接收器的更多配置项。赞分享可观测性APM链路追踪指标监控日志分析微服务【免费下载链接】skywalkingAPM, Application Performance Monitoring System项目地址https://gitcode.com/gh_mirrors/sk/skywalking点击查看免费下载相关推荐SkyWalking Continuous Profiling 持续性能剖析指南基于 eBPF 的自动化性能瓶颈识别SkyWalking Continuous Profiling 持续性能剖析指南基于 eBPF 的自动化性能瓶颈识别 Continuous Profiling可观测性后端微服务云原生SkyWalking eBPF Profiling 实战指南基于 eBPF 的进程外性能剖析On/Off CPU 与 Network ProfilingSkyWalking eBPF Profiling 实战指南基于 eBPF 的进程外性能剖析On/Off CPU 与 Network Profiling可观测性APM链路追踪指标监控日志分析微服务Pyroscope 剖析指南从传统 Profiling 到持续剖析Continuous ProfilingPyroscope 剖析指南从传统 Profiling 到持续剖析Continuous Profiling 本指南系统讲解软件性能分析中两类核心方法——传可观测性性能剖析后端运维观测上一篇【亲测免费】 Akka指南基于Java的中文教程详解下一篇Morpeh ECS框架中文使用教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表