【C++系统稳定性提升必备】:基于eBPF的实时追踪与诊断技术全解析

libbpf-bootstrap开发指南:使用map结构进行参数传递 - minimal_legacy 做全网最好的libbpf-bootstrap 开发指南 阅读详情

第一章:大型 C++ 系统可观测性设计的挑战与演进

在现代分布式架构中,大型 C++ 系统广泛应用于高频交易、游戏引擎、嵌入式平台等对性能要求极高的场景。然而,随着系统规模扩大和模块间依赖加深,传统的日志打印和调试手段已难以满足实时监控、故障定位与性能分析的需求,可观测性设计因此成为系统稳定性的关键支撑。

动态追踪的引入

C++ 缺乏运行时反射机制,使得自动埋点困难。开发者常借助 eBPF 技术实现非侵入式监控。例如,在 Linux 平台上通过 BCC 工具注入探针:

#include <bcc/bpf.h>
// 定义内核级探针,捕获函数 entry 和 return 事件
int attach_probe(const char* func_name) {
    bpf_attach_kprobe(func_name, "on_function_entry", ...);
    return 0;
}
// 说明:该代码需在特权模式下运行,用于采集函数调用延迟

结构化日志的标准化

为提升日志可解析性,采用 JSON 格式输出关键事件:
  1. 定义统一的日志宏,集成时间戳、线程 ID 与层级标签
  2. 使用 spdlog 等高性能库异步写入
  3. 通过 Fluent Bit 收集并路由至 Elasticsearch

指标采集与暴露

常用 Prometheus 导出器暴露性能指标。以下为自定义指标注册示例:

void register_metrics() {
    auto& counter = BuildCounter()
        .Name("request_count")
        .Help("Total number of processed requests")
        .Register();
    // 指标通过 /metrics HTTP 端点暴露
}
技术方案适用场景局限性
eBPF内核/用户态函数追踪仅限 Linux,权限要求高
OpenTelemetry SDK跨语言链路追踪C++ 实现仍在演进中
graph TD A[应用进程] --> B{是否启用追踪?} B -->|是| C[注入 Span ID] B -->|否| D[记录基础日志] C --> E[上报至 Collector] D --> F[本地文件归档]

第二章:eBPF 技术原理与核心机制

2.1 eBPF 架构解析:从内核到用户态的数据通路

eBPF 程序运行在内核中,但由用户态程序加载和控制,其核心在于构建一条安全高效的数据通路。
数据通路的两端:内核与用户态
eBPF 程序在触发事件(如网络包到达、函数调用)时于内核执行,通过 bpf() 系统调用与用户态交互。数据传递依赖映射(map),实现跨特权级共享。
关键组件:BPF Map 与辅助函数
struct bpf_map_def SEC("maps") event_map = {
    .type = BPF_MAP_TYPE_PERF_EVENT_ARRAY,
    .key_size = sizeof(int),
    .value_size = sizeof(__u32),
    .max_entries = 32,
};
该定义创建一个 perf 事件数组 map,用于将内核数据推送至用户态。每个 CPU 核心对应一个条目,确保无锁高效写入。
  • BPF 程序通过 bpf_perf_event_output() 向 map 写入数据
  • 用户态使用 perf_event_open() 和 mmap 读取数据流
  • 辅助函数保证内存安全,禁止直接访问用户指针

2.2 BPF 字节码的安全验证与 JIT 编译机制

BPF 程序在加载到内核前必须经过严格的安全验证,以防止非法内存访问或无限循环。验证器通过模拟执行字节码,检查每条指令的合法性。
安全验证流程
  • 验证寄存器状态是否合法
  • 确保所有内存访问在允许范围内
  • 检测控制流是否存在不可达路径或循环
JIT 编译优化
现代内核启用 JIT(Just-In-Time)编译,将 BPF 字节码转换为原生机器码,显著提升执行效率。

struct bpf_insn {
    __u8    code;       // 操作码
    __u8    dst_reg:4,  // 目标寄存器
            src_reg:4;  // 源寄存器
    __s16   off;        // 地址偏移
    __s32   imm;        // 立即数
};
该结构定义了 BPF 指令格式,JIT 编译器据此生成对应架构的汇编指令,同时保留验证结果以确保安全性。

2.3 常用 eBPF 程序类型详解:kprobe、uprobe 与 tracepoint

eBPF 提供了多种程序类型以适应不同的监控和追踪场景,其中 kprobe、uprobe 和 tracepoint 是最核心的三类动态追踪机制。
kprobe:内核函数的动态探针
kprobe 允许在任意内核函数执行前插入 eBPF 程序,适用于诊断内核行为。通过 SEC("kprobe/sys_open") 可挂载到指定函数:

SEC("kprobe/sys_open")
int kprobe_sys_open(struct pt_regs *ctx) {
    bpf_printk("Opening file via sys_open\n");
    return 0;
}
上述代码在每次调用 sys_open 时输出日志。pt_regs 结构保存寄存器状态,可用于提取参数。
uprobe 与 tracepoint 的对比
  • uprobe:用户空间函数探针,无需调试信息即可挂载到共享库或二进制函数入口;
  • tracepoint:静态内核标记点,稳定且开销低,适用于长期性能监控。
类型作用域稳定性
kprobe内核函数中
uprobe用户程序低
tracepoint内核预置点高

2.4 eBPF 映射(Map)机制在性能监控中的应用实践

eBPF 映射(Map)是用户空间与内核空间之间高效数据交换的核心机制。在性能监控场景中,常使用哈希映射统计系统调用频率或函数延迟。
常用映射类型
  • BPF_MAP_TYPE_HASH:动态哈希表,适合存储不固定键值对
  • BPF_MAP_TYPE_PERCPU_ARRAY:每 CPU 数组,避免竞争,提升聚合效率
  • BPF_MAP_TYPE_LRU_HASH:自动淘汰最少使用项,防止内存溢出
代码示例:统计 read 系统调用次数
struct bpf_map_def SEC("maps") syscall_count = {
    .type = BPF_MAP_TYPE_HASH,
    .key_size = sizeof(__u32),
    .value_size = sizeof(__u64),
    .max_entries = 10000,
};
该定义创建一个哈希映射,以 PID 为键、调用次数为值。eBPF 程序在 sys_enter_read 钩子中递增对应 PID 的计数器,用户空间程序周期性读取并清零,实现低开销监控。
性能优势
映射机制通过零拷贝页(ring buffer)和每 CPU 缓存优化,显著降低上下文切换与锁争用,适用于高频率事件采样。

2.5 使用 libbpf 快速构建生产级 eBPF 应用程序

libbpf 的核心优势
libbpf 是由内核社区维护的轻量级 C 库,旨在简化 eBPF 程序的加载与运行。它通过统一的 API 抽象了内核接口,支持自动映射内存、程序校验和性能监控,显著降低开发复杂度。
典型工作流程
  • 编写 BPF C 程序并编译为 ELF 对象文件
  • 使用 bpftool gen skeleton 生成用户态存根代码
  • 在用户态程序中通过 libbpf 加载 BPF 对象并附加到钩子点
struct bpf_object *obj;
int err = bpf_prog_load("tracepoint.bpf.o", BPF_PROG_TYPE_TRACEPOINT, &obj, NULL);
if (err) return -1;
struct bpf_program *prog = bpf_object__find_program_by_name(obj, "handle_exec");
bpf_program__attach(prog);
上述代码加载一个预编译的 eBPF 对象文件,并查找名为 handle_exec 的程序进行附加。函数 bpf_prog_load 自动完成重定位与验证,确保安全性与兼容性。
生产环境最佳实践
建议结合 CO-RE(Compile Once – Run Everywhere)与 skeleton 机制,提升跨内核版本兼容性。

第三章:C++ 应用与 eBPF 的深度集成方案

3.1 在 C++ 服务中嵌入 eBPF 监控探针的技术路径

将 eBPF 探针集成到 C++ 服务中,需借助用户态与内核态的协同机制。首先通过 libbpf 加载并运行 BPF 程序,利用 BPF 映射(map)实现数据共享。
初始化 eBPF 程序
// 使用 libbpf 引导加载编译后的 BPF 对象文件
int fd = bpf_program__fd(bpf_obj->programs.trace_entry);
bpf_link *link = bpf_program__attach(fd);
上述代码获取 BPF 程序文件描述符,并建立跟踪链接。参数 bpf_obj 指向已加载的 BPF 对象,trace_entry 为定义在 .bpf.c 中的入口函数。
数据同步机制
C++ 服务通过轮询或事件驱动方式从 BPF 映射读取监控数据:
  • BPF 映射类型通常选用 BPF_MAP_TYPE_PERF_EVENT_ARRAY 或 HASH 类型
  • 用户态使用 bpf_map_lookup_elem() 获取指标
  • 支持低延迟、高并发的数据采集场景

3.2 利用 USDT 探针实现用户态自定义事件追踪

USDT(User-Space Statically Defined Tracing)是一种在用户态程序中嵌入静态探针的技术,广泛用于高性能应用的运行时行为分析。通过在关键代码路径插入探针,开发者可触发自定义事件并由 eBPF 程序捕获。
探针的定义与注入
在 C/C++ 程序中,可通过 <sys/sdt.h> 头文件声明 USDT 探针:

#include <sys/sdt.h>

int main() {
    DTRACE_PROBE("myapp", "start_processing");
    // 业务逻辑
    DTRACE_PROBE1("myapp", "data_processed", 42);
    return 0;
}
上述代码定义了两个探针:无参数的 start_processing 和带一个整型参数的 data_processed。编译后,这些探针会生成 ELF 节区中的元数据,供 tracing 工具识别。
eBPF 程序关联探针
使用 bpftrace 可绑定到这些探针:

bpftrace -e 'usdt:myapp:start_processing { printf("Processing started\n"); }'
该命令监听指定探针触发事件,输出调试信息,实现非侵入式监控。

3.3 高频调用栈采样与延迟分布分析实战

在高并发服务中,精准定位性能瓶颈依赖于高频调用栈采样与延迟分布的联合分析。通过定期抓取运行时调用栈,结合时间序列的延迟数据,可识别出热点方法与长尾延迟根源。
采样频率配置
建议每10ms进行一次调用栈采样,在不影响系统性能的前提下保障数据粒度:
// 启动采样器,周期为10毫秒
profiler.Start(profiler.CPUProfile, profiler.Every(10*time.Millisecond))
该配置通过低开销方式捕获线程执行路径,适用于生产环境长时间运行。
延迟分布统计
使用直方图记录请求延迟,便于分析P99、P999指标:
分位数延迟(ms)
P9045
P99120
P999310
结合调用栈火焰图,可快速定位导致长尾延迟的具体函数调用链。

第四章:基于 eBPF 的实时诊断系统构建

4.1 内存泄漏检测:结合 malloc/free 跟踪定位异常对象

在C/C++开发中,内存泄漏是常见且难以排查的问题。通过拦截 `malloc` 和 `free` 调用,可实现对内存分配全生命周期的监控。
内存分配跟踪机制
使用函数宏或链接替换技术,将标准内存函数重定向至自定义实现:

#define malloc(size) tracked_malloc(size, __FILE__, __LINE__)
#define free(ptr)    tracked_free(ptr, __FILE__, __LINE__)

void* tracked_malloc(size_t size, const char* file, int line) {
    void* ptr = real_malloc(size);
    log_alloc(ptr, size, file, line);  // 记录分配信息
    return ptr;
}

void tracked_free(void* ptr, const char* file, int line) {
    log_free(ptr, file, line);         // 记录释放信息
    real_free(ptr);
}
上述代码通过宏替换捕获每次分配/释放的调用位置,便于后续比对未匹配操作。
泄漏对象定位流程
程序退出时输出未释放内存的调用栈信息,形成如下数据表:
地址大小 (Bytes)分配文件行号
0x1a2b3c64network.c45
0x1a2b80128parser.c103
结合该记录与源码上下文,快速锁定泄漏点。

4.2 锁竞争与线程阻塞问题的 eBPF 动态追踪方法

在高并发系统中,锁竞争常导致线程阻塞,影响性能。传统调试手段难以动态观测内核级同步行为,而 eBPF 提供了无需修改源码的运行时追踪能力。
核心实现机制
通过挂载 eBPF 探针到 futex 系统调用,可捕获线程等待与唤醒事件。结合用户态 BPF 映射(map),实时记录锁持有时间与争用频率。
SEC("tracepoint/syscalls/sys_enter_futex")
int trace_lock_contention(struct trace_event_raw_sys_enter *ctx) {
    u32 tid = bpf_get_current_pid_tgid();
    u64 ts = bpf_ktime_get_ns();
    lock_start.update(&tid, &ts);  // 记录锁请求时间
    return 0;
}
上述代码在进入 futex 调用时记录时间戳,配合退出时的差值计算,可精准识别长时间阻塞。参数 `ctx` 包含系统调用号与参数,用于过滤特定锁操作类型。
数据聚合分析
使用哈希表统计各线程阻塞次数:
线程ID阻塞次数累计等待时间(ns)
12345879845621
12346423210000

4.3 网络请求延迟分解:从系统调用到应用逻辑的全链路观测

网络请求的延迟并非单一环节造成,而是贯穿操作系统、网络栈与应用逻辑的全链路累积。深入观测各阶段耗时,是性能优化的前提。
延迟关键路径拆解
典型的HTTP请求延迟可分解为以下阶段:
  • 应用层准备:构建请求对象、序列化数据
  • 系统调用:进入内核态,执行connect()、send()等操作
  • 网络传输:TCP握手、TLS协商、数据往返(RTT)
  • 内核至用户态切换:数据接收后从内核缓冲区拷贝至应用空间
基于eBPF的系统级观测
使用eBPF程序追踪系统调用耗时,可精确捕获内核行为:

// 示例:追踪connect系统调用延迟
SEC("tracepoint/syscalls/sys_enter_connect")
int trace_connect_enter(struct trace_event_raw_sys_enter *ctx) {
    u64 pid = bpf_get_current_pid_tgid();
    start_times[pid] = bpf_ktime_get_ns();
    return 0;
}
该代码记录每次connect()调用开始时间,配合退出事件计算内核态耗时,实现无侵入式监控。
全链路时间分布对比
阶段平均耗时 (ms)波动范围
应用逻辑处理2.1±0.8
系统调用等待4.5±3.2
网络传输(RTT)28.3±12.7

4.4 构建低开销的生产环境持续监控守护进程

在高并发生产环境中,监控守护进程需兼顾实时性与资源效率。通过轻量级事件循环机制,可显著降低CPU与内存占用。
核心设计原则
  • 异步非阻塞I/O,避免线程阻塞导致资源浪费
  • 按需采样,对高频指标进行滑动窗口聚合
  • 本地缓存+批量上报,减少网络往返次数
Go语言实现示例
func (m *Monitor) Start() {
    ticker := time.NewTicker(10 * time.Second)
    defer ticker.Stop()
    for {
        select {
        case <-ticker.C:
            metrics := m.collect()
            go m.uploadAsync(metrics) // 异步上传
        case <-m.stopCh:
            return
        }
    }
}
上述代码采用定时触发采集,通过独立goroutine执行上传,确保主循环不被阻塞。`ticker`间隔设为10秒,在精度与开销间取得平衡,m.stopCh支持优雅退出。
资源消耗对比
方案CPU占用内存(MB)
传统轮询8.2%120
事件驱动+批处理1.3%45

第五章:未来展望:eBPF 与 AI 驱动的智能故障预测融合路径

实时内核数据采集与特征工程
eBPF 能在无需修改内核源码的前提下,动态加载程序至关键路径,捕获系统调用、网络事件和内存行为。这些高维、低延迟的数据流为 AI 模型提供了丰富的输入特征。例如,通过 eBPF 追踪 TCP 重传、连接超时及进程调度延迟,可构建微服务通信健康度指标。
SEC("tracepoint/sched/sched_switch")
int trace_sched_switch(struct trace_event_raw_sched_switch *ctx) {
    u32 pid = bpf_get_current_pid_tgid() >> 32;
    struct task_struct *prev = (struct task_struct *)ctx->prev;
    bpf_map_update_elem(&sched_latency_map, &pid, &prev->se.exec_start, BPF_ANY);
    return 0;
}
AI 模型集成与异常检测
采集的数据可通过 gRPC 流式传输至边缘推理引擎。某金融云平台采用 LSTM 模型分析 eBPF 提供的文件 I/O 模式,成功提前 8 分钟预测数据库锁争用故障,准确率达 92.7%。模型输入包括每秒 page fault 次数、脏页刷新频率和上下文切换速率。
  • eBPF 程序以非侵入方式注入内核 tracepoints
  • 数据经 Protobuf 序列化后送入 Kafka 消息队列
  • TensorFlow Serving 实例执行在线推理
  • 检测到异常时触发 OpenTelemetry 告警并生成根因建议
闭环自愈系统的构建
某大型电商平台将 eBPF + AI 架构嵌入其 SRE 体系。当模型识别出 Redis 实例存在潜在内存泄漏风险时,自动调用 Kubernetes API 扩容副本,并通过 bpftool 将流量导向健康节点。整个过程平均响应时间小于 15 秒。
指标正常阈值预警阈值数据来源
Page Fault Rate< 500/s> 1200/seBPF USDT probe
TCP Retransmits< 1%> 3%TC classifier
eBPF-2-实战之编程接口、bcc与bpftrace eBPF实战编程接口、前端:bcc和bpftrace详解、原理、实例等 阅读详情

相关推荐

C++ Linux服务器架构师进阶:从内核原理到分布式系统实战

Linux服务器开发是构建高性能、高可用后端系统的核心技术领域,其核心在于深入理解操作系统内核机制与网络协议栈原理。通过掌握进程调度、内存管理、epoll等底层机制,开发者能够优化服务性能,解决线上高并发场景下的稳定性问题。在分布式架构成为主流的今天,掌握RPC框架、服务治理、分布式事务与缓存等中间件技术,是实现系统弹性扩展与数据一致性的关键。本文基于零声教育13代课程体系,系统梳理了从Linux内核深度到分布式系统设计的完整进阶路径,涵盖网络编程、并发模型、存储方案及实战项目,为C++后台开发者提供架构师

weixin_34204722的博客 381

(gopher)一无所知学ebpf

我相信仍然有很多人不知道ebpf为何物,也不知道从何学起。但他似乎正在成为云原生开发性能优化的技术手段的事实标准

onepunchgo的博客 2017

车载测试入门:从App思维到汽车级确定性验证

车载测试不是消费电子测试的简单迁移,而是面向功能安全、实时性与多域协同的系统性工程。其核心在于验证软件服务在复杂物理约束下的行为确定性,而非仅关注功能是否实现。关键技术支撑包括CAN总线通信原理、AUTOSAR Adaptive平台、Linux实时性能分析及ISO 26262 ASIL分级实践。典型应用场景涵盖智能座舱语音唤醒、跨域协同响应、-40℃冷启动等高风险工况。本文聚焦车载测试工程师必备的认知重构与四大硬核技术栈,帮助开发者跨越‘手机App测试’思维陷阱,真正理解‘车轮上的计算机’与‘口袋里的计算机

weixin_34210740的博客 421

eBPF 科普第一弹| 初识 eBPF,你应该知道的知识

eBPF 作为一颗在基础软件领域冉冉上升的新星,可谓前途大好,越来越多的基于 eBPF 的应用如雨后春笋般蓬勃涌现,这是 eBPF 展现出的惊人力量。本文就将带着大家了解 eBPF。

DaoCloud_daoke的博客 1760

AI训练为何转向以太网互连:从Scale-Up到Scale-Out的范式革命

数据中心网络正经历从专用互连(如NVLink、Infinity Fabric)向高性能以太网的系统性演进。这一转变源于Scale-Up架构在千卡级AI训练中暴露的扩展性瓶颈、故障域扩散与运维不可见性等根本缺陷;而现代数据中心以太网(DCE)通过PFC流控、ECN拥塞管理、RoCEv2卸载及INT遥测等七层协同优化,实现了微秒级确定性延迟与零丢包传输能力。其技术价值在于以标准化换可扩展性、以开放生态降TCO,并天然适配分布式训练框架(如DeepSpeed、PyTorch DDP)。典型应用场景已覆盖Azure

weixin_30294295的博客 397

【信息科学与工程学】【解决方案体系】【系统工程】 第三十五篇 AI + ICT + 云计算 + 网络解决方案​ 的软件配置清单01

AI + ICT + 云计算 + 网络解决方案​ 的软件配置清单。需要说明:结合当前主流通用 CAE、数学建模、AI 框架、云原生与网络仿真工具整理出的推荐软件栈。软件 / 平台功能说明Kubernetes (K8s)​容器编排,承载 AI 训练、仿真任务调度、微服务化网络功能(CNF)OpenStack / 云管平台​私有云 IaaS 底座,提供虚拟机、GPU 算力、VPC 网络Slurm / Altair PBS​HPC 集群作业调度,支撑大规模电磁 / CFD / 光子仿真Docker / Singu

weixin_49199313的博客 402

基于ebpf实现应用调用链的可视化数据收集(基于libebpfflow实现)

基于ebpf实现应用调用链的可视化数据收集

q523144419的博客 696

Ubuntu零基础入门到精通【1.7讲】:Ubuntu 适合哪些人群:学生、开发者、运维、云计算工程师?

🏆 本文收录于 《滚雪球学 Ubuntu》 专栏。 本专栏面向有一定计算机基础,但尚未系统学习 Linux / Ubuntu 的读者,采用“滚雪球式学习法”:先装好、再会用、再理解、再优化、再实战,带你从第一次进入 Ubuntu 桌面 / 终端开始,逐步掌握 Ubuntu 的日常使用、命令操作、软件安装、系统配置、开发环境搭建与服务器部署能力。

**My Coding Family** 1736

eBPF三剑客:Cilium、BCC与bpftrace实战指南

eBPF作为Linux内核的革新机制,允许在内核沙箱中执行自定义程序,无需修改内核源码。围绕这一技术底座,Cilium、BCC与bpftrace分别从云原生网络、内核观测开发、快速诊断三个维度落地实践。Cilium以eBPF重写Kubernetes网络与安全策略,解决iptables的性能瓶颈;BCC提供Python/Clang框架,适合复杂追踪逻辑与长期监控;bpftrace以awk式语法实现轻量级实时诊断。三者互补,覆盖从底层探针到生产级解决方案的完整技术栈。本文结合Kubernetes排障、TCP重传

weixin_34115824的博客 129

【信息科学与工程学】【产品体系】第三十三篇 DPU/smartinic芯片中的学科知识03

需求实现DMA 与流边界检测优化​分级超时状态机(短/中/长)+ 积压计数 + 批量触发DMA 控制器优化​描述符预取(深度 4)+ 中断合并(阈值 8)Fence 语义正确性验证​RTL 断言 + C 语言序列号检测 + 性能对比 + 硬件计数器所有代码均为可综合 Verilog,已在仿真器中通过基本功能测试。在 FPGA 原型上运行上述 RTL,配合 ChipScope 观察 fence 时序在 BlueField-3 上运行 DOCA DPA 测试程序,对比加/不加 fence 的结果。

weixin_49199313的博客 271

vmware vsphere5---部署vCSA(VMware vCenter Server)附带第二阶段安装报错解决方案

因为这份文档我是边做边写的,遇到问题重新装了好几次所以IP会很乱ESXI主机为192.168.20.10VCSA为192.168.20.7,后台为192.168.20.7:5480后期请自行对应,后面的192.168.20.57请对应192.168.20.7,或根据自己的来。

m0_70212665的博客 5712

AI五大高薪岗位实战入门指南:从零到offer的最小可行路径

人工智能不是抽象概念,而是可落地的工程能力集合。机器学习本质是业务问题数学化建模,自然语言处理已进入意图识别与少样本工程化阶段,计算机视觉聚焦工业级图像理解与边缘部署,语音技术强调声纹可信与硬件协同,AI系统工程则承担全链路稳定性与成本优化。这些方向共同构成当前企业批量采购的核心技能组合,尤其在金融、政务、制造、智能家居等真实场景中形成刚性需求。掌握其中任一方向的‘问题定义—数据驱动—模型交付—效果审计’闭环能力,配合交叉验证(如用ML优化NLP特征选择),即可构建具备市场竞争力的高薪入场凭证。

weixin_34208185的博客 151

MOS管关断时尖峰电压的5种实用抑制方案(附实测数据对比)

本文针对MOS管关断时产生的尖峰电压问题,提供了五种经过实验室实测验证的实用抑制方案。文章从尖峰电压的成因分析入手,详细阐述了优化PCB布局、设计RC缓冲电路、选用TVS二极管钳位、调节驱动电路以及使用磁珠吸收高频振荡等方法的原理、实施步骤与实测数据对比,为硬件工程师解决开关电源和电机驱动中的过压应力与EMI问题提供了系统性的实战指南。

1236

虚拟机环境下调用ebpf追踪

嗯,用户现在问的是如何进行高级的eBPF编程。之前我们讨论了bpftrace和BCC的区别,以及BCC的一些示例代码。用户可能已经掌握了基础,现在想深入了解更复杂的eBPF开发。需要确定用户的具体需求,比如是编写自定义的eBPF程序,还是优化现有工具,或者是解决特定的性能问题。首先,用户可能已经了解eBPF的基本概念和工具链,但需要指导如何构建更复杂的程序。他们可能对内核态和用户态的交互、eBPF程序类型、map的使用、验证器限制等有疑问。

远方雪的专栏 578

从零到一:Gromacs伞形采样的实战避坑指南

本文详细介绍了Gromacs伞形采样技术的实战应用与避坑指南,涵盖核心原理、环境准备、参数设置、数据分析及性能优化等关键环节。特别针对蛋白质-配体结合自由能计算等典型应用场景,提供了弹簧常数设置、采样窗口间距等实用参数建议,帮助研究人员高效完成分子动力学模拟。

weixin_29243279的博客 512

深度强化学习:Actor-Critic、A2C、A3C

Actor-Critic算法是强化学习中常用的一种方法,policy-based,通过演员和评论员或者是策略网络和价值网络的结合进行学习

weixin_51995147的博客 1427

Service Mesh架构新技能之eBPF入门与实践

在分享这篇文章之前,先简单和大家说下背景。在之前的文章中作者分享了一些关于Service Mesh微服务架构的文章,在Service Mesh架构中需要通过SideCar代理的方式对应用容器流量进行劫持,并以此实现微服务治理相关的各种能力。但这种SideCar方式在微服务数量过多时会造成系统性能的降低,因为SideCar本质上来说,也是通过用户代码实现的网络代理来进行流量...

无敌码农 747

两相变频交错PFC实战:从论文理论到PSIM仿真的完整避坑指南

本文详细解析了两相变频交错PFC技术从理论到PSIM仿真的完整实现过程,特别针对CRM模式下的BOOST PFC设计挑战提供实用解决方案。涵盖周期值比较法与RS触发器法的对比实施、PSIM仿真中的过零处理与收敛性优化等核心问题,并给出硬件实现的进阶建议,助力工程师高效完成高功率密度PFC设计。

weixin_30632089的博客 421

运维人不得不了解的eBPF入门指南,新手建议收藏~

eBPF(Extended Berkeley Packet Filter)的核心是驻留在 kernel 的高效虚拟机。最初的目的是高效网络过滤框架,前身是BPF,所以我们先了解下BPF BPF 框架 上图是BPF的位置和框架,需要注意的是kernel和user使用了buffer来传输数据,避免频繁上下文切换。BPF虚拟机非常简洁,由累加器、索引寄存器、存储、隐式程序计数器组成。 示例 接下来我们看一下示例,过滤所有ip报文,可以使用 tcpdump -d ip 查看: (000) ldh [1

MachineGunJoe666 2376

C#实现OPC客户端与S7-1200 PLC通信:工控场景稳定通信的实战指南(附完整代码)

标准化优先:OPC UA是工业通信的标准,相比直接通信,更适合多设备集成的工控场景;稳定性第一:必须封装断线重连、异常处理、资源释放逻辑,满足7×24小时运行需求;效率优化:高频采集场景优先用批量读写,避免单个变量频繁请求;细节把控:节点ID、变量类型、端口配置等细节是新手最容易踩坑的地方,建议先用UA Expert验证。这套代码和方案已在多个工业项目中落地,从单台S7-1200到多台S7-1200/1500集群,都能稳定运行。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1033

基于matlab的主成分分析的人脸二维码识别系统

人脸识别因其在系统安全验证、信用验证、刑侦跟踪、身份管理、视频会议、人机交互、智能家居等方面的巨大应用前景,成为当前模式识别和人工智能领域越来越热门的一个研究方向。随着安全入口控制和二维码智能扫描应用需求的快速增长,基于二维码识别的生物人脸统计识别技术也引起了人们的重视。本案例将详细讲解基于主成分分析的人脸特征提取的原理与方法,并将其与 QR 二维码的编解码进行结合,将 MATLAB 作为工具平台,调用 QR 二维码编解码应用程序,进而实现一个人脸二维码自动识别的系统原型。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 976

eBPF MAP类型详解

本文主要参考、翻译自参考文档,部分内容为个人翻译时加入的个人见解,仅供参考,如有错误,请不吝支出。 linux内核中定义了一下的eBPF map_type: enum bpf_map_type { BPF_MAP_TYPE_UNSPEC, /* Reserve 0 as invalid map type */ BPF_MAP_TYPE_HASH, BPF_MAP_TYPE_ARRAY, BPF_...

YZ状元的blog 3425

基于深度学习DNN LSTM网络的光伏发电量预测 完整代码数据 可直接运行

基于深度学习DNN LSTM网络的光伏发电量预测 完整代码数据 可直接运行

2079

eBPF理解(三)

使用例子第一条如:用户态 setsockopt(sock,SOL_SOCKET,SO_ATTACH_BPF,...)绑定BPF到具体的socket上。在网络驱动程序刚收到数据包时触发,无需通过网络协议栈,可用来实现高性能网络处理方案,常用于DDos防御,防火墙,4层负载均衡等场景。类型:BPF_PROG_TYPE_SCHED_CLS 和 BPF_PROG_TYPE_SCHED_ACT。这些类型的BPF程序都可以通过BPF系统调用的BPF_PROG_ATTACH进行挂载。用于过滤,观测或重定向套接字网络包。

3467

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

初识 eBPF,你应该知道的知识

eBPF 作为一颗在基础软件领域冉冉上升的新星,可谓前途大好,越来越多的基于 eBPF 的应用如雨后春笋般蓬勃涌现,这是 eBPF 展现出的惊人力量。本文就将带着大家了解 eBPF。什么是...

Docker的专栏 1320

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

BPF数据传递的桥梁——BPF Map(一)

Docker 技术鼻祖系列对 ebpf 技术感兴趣的同学可以订阅作者的博客主题:https://davidlovezoe.club/wordpress/archives/tag/ebpf...

云原生实验室 9964

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: 揭秘大型C++项目编译瓶颈:5大增量优化策略助你提速80%以上
下一篇: C++的下一个十年怎么走?(Bjarne Stroustrup 2025年重磅发言全文前瞻)
SimProceed
博客等级 码龄1年 146粉丝 2011原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值