- 博客(52)
- 收藏
- 关注
原创 用 epoll 实现 io_uring multishot:preactor 模型设计
io_uring的Multishot机制通过"一次提交,多次完成"的设计,显著提升了高频I/O场景的性能。它通过共享内存队列减少系统调用和上下文切换,支持Poll、Recv、Accept等操作的持续触发。关键标志IORING_CQE_F_MORE指示生命周期状态,结合Buffer复用实现零拷贝和低延迟。相比传统epoll+recv方案,Multishot减少了内存分配和系统调用开销,特别适合网络I/O、短连接等高并发场景。该机制需要精细的生命周期管理,在错误、资源耗尽或取消时终止。通过内
2026-01-15 17:18:41
793
原创 并发 Shell 任务执行框架:任务注册、并发控制、异常安全
在批量任务、运维自动化等场景中,并发执行是常见需求。本文实现了一套可复用的并发 Shell 任务执行框架,通过任务注册机制与令牌桶模型精确控制并发数,并利用 trap 保证任务异常退出时资源自动回收,避免并发泄露。该方案结构清晰、易于扩展,适合在实际项目中长期使用。
2026-01-15 17:17:48
638
原创 Ansible 在性能测试中的价值:让机器干重复劳动,让人专注分析
本文介绍了如何利用Ansible自动化工具优化性能测试工作流程。作者指出性能测试中大量重复性操作(如多机监控启停、数据收集等)适合通过Ansible实现自动化,并分享了一套自研的Ansible监控脚本,可实现一键启动/停止监控、自动收集结果等功能。该方案将测试准备时间从十几分钟缩短至几十秒,同时避免了人工操作失误。文章还列举了Ansible在环境部署、配置分发等性能测试场景中的扩展应用,强调性能测试工程师应掌握这种能显著提升效率的工程化工具。文末提供了获取自研脚本的方式和技术交流渠道。
2025-12-26 17:25:16
752
原创 中断不控,延迟难稳:低延迟系统的终极痛点
本文分析了中断对低延迟系统的影响及其排查方法。低延迟系统对确定性、资源独占性和尾延迟高度敏感,中断会引发执行打断、时延尖刺等问题,尤其是软中断影响更隐蔽。为排查中断问题,文中介绍了自研的irq_watch.py脚本,该工具可实时监控指定IRQ或CPU的中断变化,支持白名单筛选和范围表达式,帮助快速定位中断来源。通过输出中断增量、累计次数及来源描述,为诊断延迟抖动提供依据,适用于金融交易等对微秒级延迟敏感的场景。
2025-12-26 17:25:06
757
原创 从汇编看内存序:C++ 内存模型在 Intel 架构下到底做了什么
摘要: 本文从汇编层面分析C++内存模型在Intel处理器上的实现机制。Intel采用TSO(Total Store Order)内存模型,通过Store Buffer和Load Forwarding机制实现较强内存一致性。研究显示:memory_order_relaxed在Intel架构下表现为普通MOV指令;release/acquire语义也仅需MOV指令,无需额外内存屏障(x86架构下)。这表明Intel硬件已内置较强内存序保证,与较弱内存模型架构(如ARM)形成鲜明对比。
2025-11-06 12:04:13
862
原创 深入理解 C++ happens-before:高级并发程序员的必修课
C++中的happens-before关系定义了多线程程序中操作的可见性和执行顺序,确保线程间数据同步的正确性。其核心包括三种关系:sequenced-before(线程内顺序)、synchronizes-with(跨线程同步)和happens-before(全局可见性)。通过原子操作(如release/acquire)建立同步点,可以避免数据竞争和未定义行为。实战中,合理选择内存序(relaxed、acquire/release、seq_cst等)或锁机制,能在保证正确性的同时优化性能。
2025-11-06 12:04:04
622
原创 可观测副作用:C++编译器优化的“红线”
C++中的"as-if rule"允许编译器自由优化代码,但必须保证可观测副作用(如volatile访问、I/O操作、原子操作等)的最终执行结果与源码一致。这些操作之所以特殊,是因为它们的结果可被外部环境或硬件感知。编译器优化不能改变这些副作用的相对顺序,这是C++在性能与正确性之间的关键平衡点。理解这一规则有助于编写高效且行为可预测的代码。
2025-09-29 00:19:03
842
原创 C++ 执行顺序揭秘:sequenced-before深度解析
本文系统讲解C++标准中的sequenced-before关系,介绍历史演变、与sequence point的区别、对编译器优化约束及多线程影响,并结合实战避坑建议,帮助开发者理解代码执行顺序,写出安全、可移植且避免未定义行为的C++代码。
2025-09-29 00:12:03
1160
原创 踩坑实录:GCC 7.3.0 开启PGO编译优化竟然缺gcov符号?最终解决方案在这里!
摘要:在麒麟V10 SP2(gcc 7.3.0)上使用PGO优化时,出现"undefined reference to `__gcov_indirect_call_counter'"错误。问题原因是GCC 7.3.0在-fprofile-generate模式下未能正确解析libgcov.a中的符号。解决方法是通过-Wl,--whole-archive参数强制链接整个libgcov.a库。该问题在GCC 8.x及以上版本已修复,建议更新编译器版本以获得更好的PGO支持。
2025-09-22 13:05:46
473
原创 从汇编层面看 C++ 引用:语法糖背后的指针本质
摘要: 本文从汇编层面剖析C++引用的底层实现机制,揭示其与指针的异同。通过分析局部变量、函数参数和类成员三种场景下的引用行为发现:在无优化模式下,引用被实现为隐藏指针;高优化等级下可能直接被消除,操作原变量。函数参数中的引用本质传递地址,类成员引用则必须占用指针大小的存储空间。研究表明,引用在语法层是安全别名,底层则依场景灵活实现,性能优化后可能完全消失,帮助开发者更深入理解其本质。
2025-09-19 17:20:04
1041
原创 高级工程师的日常 | 一次解决操作系统升级带来的C++ ABI兼容问题
摘要 本文探讨了系统升级到Red Hat 8后出现的C++程序兼容性问题,根源在于GCC 5.1引入的Dual ABI机制。问题表现为程序无法链接标准库符号,尤其影响使用std::string等类型的模块与第三方库的交互。通过实例分析,展示了新旧ABI不匹配导致的链接错误,并提出了三种解决方案:统一ABI设置、接口隔离与符号隐藏、库升级重编译。文章强调ABI兼容性在系统升级和架构设计中的重要性,建议开发者深入理解Dual ABI机制,以规避二进制兼容性问题。
2025-09-17 17:26:16
679
原创 从 Intel 第四代 Xeon 看未来 CPU:应用该如何转型
本文分析了Intel第四代Xeon Scalable处理器的架构演进趋势,指出现代CPU正从单核性能转向多核并行、NUMA优化和硬件加速方向发展。文章详细介绍了第四代Xeon的模块化封装、高核心数、NUMA架构、硬件加速器(如AMX、AVX-512)和新型内存技术等关键特性,并与前代产品进行了对比。针对这些变化,提出了应用开发转型建议:优化并行设计、NUMA亲和性管理、硬件加速器利用和数据分层策略。文章强调开发者需适应多核异构计算趋势,提前掌握相关技术以充分发挥现代CPU性能。
2025-09-08 12:09:50
1272
原创 有了 MESI 协议,为什么多线程下还会读到旧值?
摘要: 本文通过示例程序揭示多核CPU系统中MESI协议的局限性。当两个线程对同一全局变量进行++操作时,即使有MESI协议仍可能出现重复输出相同值的现象。原因在于:1)非原子操作导致数据竞争;2)写操作暂存store buffer不会立即对其他线程可见;3)MESI仅保证缓存行最终一致性而非即时可见性。解决方案是使用std::atomic原子变量,其通过硬件原子指令和内存序语义确保操作的原子性和跨线程可见性。建议在多线程编程中优先使用原子变量或互斥锁来保证数据安全访问。
2025-09-05 17:19:16
778
原创 C++ 性能优化必知:std::string 的 15 字节临界点
C++中的std::string通过小字符串优化(SSO)机制提升性能,当字符串长度较小时(通常15字节以内)直接存储在对象内部的缓冲区,避免堆内存分配。主流实现如GCC的libstdc++和LLVM的libc++都采用此优化,通过联合体(union)结构在本地缓冲区和堆内存指针间切换,显著减少短字符串操作时的内存开销。该优化体现了C++在抽象与性能间的精妙平衡。
2025-09-02 12:05:05
572
原创 高级工程师的日常 | 从CentOS到龙蜥:国产开源操作系统选型与迁移实录
本文分享了从CentOS迁移到国产开源操作系统龙蜥Anolis OS的全过程经验。文章首先分析了CentOS停更后的替代方案,从兼容性、维护周期、国产化等维度比较了龙蜥、Oracle Linux和openEuler等系统,最终选择兼容RHEL且社区活跃的龙蜥OS。接着详细介绍了软件适配方案,包括源代码、基础软件、第三方库和组件的迁移策略,重点强调了对无源码第三方库的兼容性处理。最后总结了迁移后的全面测试方法和应急预案,确保系统稳定运行。整个过程体现了国产化替代的技术可行性,为信创环境迁移提供了实用参考。
2025-08-29 17:22:12
1140
原创 高级工程师的日常 | 一次客户现场数据库性能问题的排查与解决
业务系统响应缓慢,初步怀疑数据库性能问题。经分层排查发现:SQL逻辑合理,数据库内核无异常,但现场网络带宽持续满载。深入检查发现数据库服务器错误绑定到千兆网卡而非万兆网卡,导致数据传输瓶颈。调整网络配置后业务恢复正常。此案例表明:性能问题需系统化排查,环境配置细节不容忽视,工程师需具备综合分析能力才能快速定位根源性问题。
2025-08-27 12:03:31
285
原创 高级工程师的日常|一次服务降级化解线上故障
本文分享了一个生产环境故障案例:某非核心查询业务因代码缺陷导致进程崩溃。应急处置采取了服务降级策略:关闭该业务访问权限,确保核心功能稳定运行,同时为修复争取时间。文章分析了服务降级与熔断、限流的区别,强调系统设计时应区分核心与非核心业务,制定应急预案。通过专业表述和正确处置,既保障了系统稳定,又体现了工程师的专业能力。最后指出,高级工程师的价值不仅在于编写代码,更在于关键时刻做出正确决策。
2025-08-26 17:20:13
398
原创 高级工程师的日常 | 模块架构设计时,到底该选多进程还是多线程?
本文探讨了银行API对接模块的架构选型问题。通过对业务特点分析(低并发、高可靠性需求、第三方接口风险),对比了多进程与多线程的优缺点。多线程虽然性能更优,但存在单点故障风险;而多进程具备更好的隔离性和容错能力,能有效防范银行SDK的潜在问题。最终建议采用多进程方案,确保资金流转系统的稳定性。该案例展示了架构设计需以业务需求为导向,在关键系统中应优先保障可靠性而非性能。
2025-08-25 13:20:02
960
原创 跨线程同步用 volatile?你可能误解了 C++ 标准
本文深入解析C++中volatile关键字的正确用法与常见误区。作者指出volatile虽能保证变量的每次读写真实发生并保持语句级顺序,但无法提供多线程环境下的原子性、可见性和顺序性保证。通过硬件交互和信号处理函数等实际案例,说明volatile的适用场景,同时强调在多线程编程中应使用std::atomic而非volatile。文章最后提醒开发者要正确理解volatile的语义,避免误用导致的并发问题,并提供了技术交流群的加入方式。
2025-08-20 17:26:50
608
原创 C++全局变量内存布局的坑:为什么 padding 原子变量会失效
摘要:文章探讨了在多线程优化中使用padding防止伪共享的误区。通过实验发现,编译器会自由重排全局变量的内存布局(即使使用padding),导致变量顺序和间隙与预期不符。测试显示,在-O2优化下变量顺序可能反转,而禁用重排后仍会出现未预期的额外间隙。这证明仅靠代码中的padding声明无法确保变量位于不同缓存行,编译器优化策略会破坏这种假设。
2025-08-15 12:31:09
462
原创 C++ 野指针深度解析及排查方法(附技术交流群)
C++野指针问题深度解析:野指针是C++程序崩溃的常见原因,比数组越界更难调试。它与nullptr不同,指向已释放或未初始化的内存区域,导致错误具有隐蔽性。常见成因包括指针未初始化、释放后继续使用和返回局部变量地址。野指针的延迟触发特性使其难以调试,因为释放的内存可能暂时保留原数据。规避方法包括:初始化指针为nullptr、释放后立即置空、优先使用智能指针,以及调试时使用AddressSanitizer和Valgrind工具。
2025-08-09 08:07:02
455
原创 深入理解NUMA:为什么你的服务在多核服务器上不稳定?
摘要:NUMA(非一致性内存访问)架构对多核系统性能影响显著,但常被忽视。NUMA模式下,CPU访问本地内存延迟低,远程内存性能较差。许多工程师不了解NUMA默认开启状态,低估其重要性,认为"自动优化"足够。实际上,NUMA配置不当可能导致性能抖动,并非仅大模型需要关注。文章将深入解析NUMA原理、适用场景及优化策略,帮助读者做出合理配置选择。(149字)
2025-08-07 07:10:19
657
原创 对齐没做好,性能打骨折:内存对齐避坑指南
本文探讨了C++11中alignas关键字与new操作符配合使用时内存对齐失效的问题。实验表明,在C++11标准下,即使使用alignas(64)修饰类型,通过new分配的内存仍无法保证64字节对齐。原因在于C++11的operator new最多只支持16字节对齐。文章提出了三种解决方案:升级到C++17使用原生支持的new操作符、使用posix_memalign配合placement new(兼容C++11)、或采用C++17新增的std::aligned_alloc。这些方法各有利弊,适用于不同场景。
2025-08-04 12:25:18
1201
原创 黑科技 USDT:打通用户态可观测性任督二脉
USDT(User-level Statically Defined Tracing) 技术提供了一种开发者可控、低开销、稳定语义的插桩机制。相比 uprobe 依赖符号和地址、可能受编译器优化干扰,USDT 插桩点是由开发者在源码中显式定义,编译后直接嵌入二进制,在运行时可由 DTrace、SystemTap、eBPF 等工具无侵入地探测,大大增强了用户态可观测性。可以说,USDT 是连接程序内部语义与系统动态追踪机制之间的一把“瑞士军刀”,在不改变程序逻辑的前提下,为性能分析、行为观测、安全。
2025-07-31 00:00:00
809
原创 性能调优黑科技:用LD_PRELOAD精准分析malloc耗时
本文介绍了一种利用LD_PRELOAD动态库拦截技术测量malloc耗时的非侵入式方法。该方法通过预加载包含自定义malloc实现的动态库,实现对标准库函数的透明代理,能够捕获程序运行中所有直接和间接的malloc调用。相比eBPF等技术,该方案具有用户态测量精度高、无需修改源码、支持间接调用统计等优势,但也存在一定性能开销和必须预加载的限制。文章提供了测试demo程序、使用方法和结果示例,并指出该技术适用于性能调优等场景。读者可免费获取该自研工具源码,同时预告后续将介绍其他测量方法。
2025-07-24 22:55:33
1099
原创 基于 eBPF/BCC的性能调优利器 func_latency:内核/用户函数耗时精准统计,性能专家必备神器!
在复杂的系统性能调优过程中,函数执行耗时的精准统计与分析是定位性能瓶颈的核心环节。了解函数的真实运行时间,才能为优化决策提供科学依据。然而,现有的性能分析手段往往存在采样粒度不足、参数过滤不灵活、关联调用链追踪困难等瓶颈,导致性能问题难以精准定位。针对这一痛点,本人自主研发了 func_latency 工具,专注于函数级耗时统计分析。它支持内核函数、用户函数、以及 tracepoint 的多源联合追踪,能够灵活提取函数参数,支持复杂的条件过滤,并可结合调用栈信息进行深度剖析。
2025-07-04 07:31:01
734
原创 GCC 链接时优化(LTO)实战:助力 C++ 性能全面升级
摘要:本文介绍了如何在C++项目中使用GCC的链接时优化(LTO)技术提升性能。通过CMake配置,演示了如何设置-flto编译选项、调整工具链参数(gcc-ar/gcc-ranlib),并通过静态库示例验证LTO效果。测试表明,LTO能实现跨文件函数内联,消除冗余符号,使目标文件出现.gnu.lto节区。相比传统-O3优化,LTO在链接阶段进行全局优化,能显著提升程序性能并减小二进制体积。
2025-06-29 23:33:16
1511
原创 存储过程的进退之道:在信创数据库中的理性选择
【存储过程在现代架构中的困境与替代方案】随着云原生和微服务架构的普及,传统存储过程面临诸多挑战:开发层面存在语言非主流、版本管理困难等问题;架构层面导致逻辑与数据强耦合,阻碍服务解构;在信创环境中更暴露出优化能力不足、调试困难、跨库兼容性差等痛点。建议将业务逻辑上移到应用层,采用ORM框架、数据库函数或调度工具等替代方案,仅在简单写操作或单一数据库场景谨慎使用存储过程。存储过程虽曾辉煌,但在现代工程环境中需理性评估其适用性,优先选择可测试、可观测的应用层解决方案。
2025-06-19 12:05:45
651
原创 还在死磕 Oracle?信创时代,国产数据库必须学起来了!
近两年,国产数据库正在快速崛起,而信创(信息技术应用创新)的大潮也已悄然席卷整个IT行业。还在把 Oracle 当成唯一选型的工程师,要警惕了——不跳出舒适区,就可能被技术趋势淘汰!
2025-06-17 23:03:56
1712
原创 事件驱动框架底层揭秘:IO 多路复用模型选型与设计
随着 Linux 内核不断演进,io_uring 已在 5.10+、5.15+ 等长期支持版本中趋于稳定,且新功能持续增加。但考虑到现阶段生产环境对稳定性与兼容性的高要求,epoll 依然是首选方案。在这样的背景下,提出了设计一套通用事件库的目标: 1. 充分利用当前 epoll 成熟、稳定的优势; 2. 能够在未来 io_uring 成熟稳定后无缝切换,无需修改业务层代码,即可直接享受新技术带来的性能红利。这套通用事件库将统一对外暴露一致的接口,内部根据初始化参数灵活选择底层 I/O 多路复用实
2025-04-29 23:18:24
832
原创 io_uring概述:现代 Linux 异步 IO 的新范式
io_uring 是由 Jens Axboe 主导开发的异步 I/O 框架,它设计的核心是:用户态与内核共享两个环形队列(SQ & CQ)来提交和获取 I/O 请求,从而避免频繁的系统调用,提高性能。其工作机制如下:SQ(Submission Queue):用户将 I/O 请求写入 SQ(实际上是 struct io_uring_sqe)。CQ(Completion Queue):内核完成请求后,将结果写入 CQ(struct io_uring_cqe)。
2025-04-26 23:03:59
1235
原创 什么是 IO 多路复用?为什么高并发系统离不开 epoll?
IO多路复用指的是通过一种机制,让一个线程能够同时等待多个IO操作的完成。不同于阻塞IO模型中的“一个线程一个连接”模式,多路复用可以通过监听多个文件描述符,只有当某个文件描述符就绪时,线程才会被唤醒处理,减少了线程阻塞的时间。
2024-10-20 11:47:47
313
2
原创 基于eBPF的procstat软件追踪程序垃圾回收(GC)事件
procstat是一款基于eBPF的监控软件,运行在Linux平台,主要用于跟踪目标程序的运行状态,并报告异常指标,是分析程序性能问题的一大利器。procstat软件能够用于追踪golang及jvm程序的垃圾回收(GC)情况,实时捕捉垃圾回收相关信息。当检测到垃圾回收的时间超过阈值时,procstat会在日志中输出详细的信息,包括回收时长、回收次数等,帮助开发者快速定位问题根源。接下来我们将通过一个小实验来展示一下procstat软件是如何追踪垃圾回收的
2024-09-20 12:46:47
1297
原创 基于eBPF的procstat软件追踪C++ STL容器扩容
procstat是一款基于eBPF的监控工具软件,运行在Linux平台,主要用于跟踪目标程序的运行状态,并报告异常指标,是分析程序性能问题的一大利器。procstat软件结合前文提到的smart_stl库形成的方案能够用于追踪程序的STL容器扩容情况,实时捕捉STL扩容信息。当检测到扩容时间超过阈值的情况时,procstat会在日志中输出详细的信息,包括扩容时长、扩容次数、发生扩容的用户态堆栈等,帮助开发者快速定位问题根源。
2024-08-14 21:42:22
858
原创 一张图胜过一屏字符,Linux性能监控:sar的可视化方案
在当今的IT环境中,系统性能监控是确保应用程序稳定运行和快速响应问题的关键。Linux作为一种广泛使用的操作系统,拥有多种性能监控工具,其中sar(System Activity Reporter)因其全面性和灵活性被广泛采用。然而,传统的sar输出格式为文本,虽然有生成图的功能 ,但不易于快速分析和实时监控。为了克服这一不足,本文设计了一套完整的可视化方案,通过实时展示sar的数据,极大地提升了性能监控的效率和直观性。
2024-07-27 14:56:24
1662
1
原创 基于eBPF的procstat软件追踪程序Offcpu时间
procstat是一款基于eBPF的监控工具软件,运行在Linux平台,主要用于跟踪目标程序的运行状态,并报告异常指标,是分析程序性能问题的一大利器。procstat能够用于追踪程序的Offcpu时间。该软件通过eBPF技术,可以深入到Linux内核内部,监控操作系统的调度行为,实时捕捉程序的调度状态。
2024-07-12 17:16:01
1931
原创 基于eBPF的procstat软件追踪等待锁和持有锁的时间
procstat是一款基于eBPF的监控工具软件,运行在Linux平台,主要用于跟踪目标程序的运行状态,并报告异常指标,是分析程序性能问题的一大利器。同时,procstat也可用于追踪C/C++程序的等待锁和持有锁的时间。该软件通过eBPF技术,可以深入到标准库内部,监控线程的锁定和解锁行为,实时捕捉程序的运行状态。当检测到加锁和等待锁时间超过阈值的情况时,procstat会在日志中输出详细的警告信息,帮助开发者快速定位问题根源。
2024-07-09 12:50:15
1190
原创 基于eBPF的procstat软件定位软件死锁
procstat是一款基于eBPF的监控工具软件,运行在Linux平台,主要用于跟踪目标程序的运行状态,并报告异常指标,是分析程序性能问题的一大利器。同时,procstat也可用于检测和定位C/C++多线程程序中的死锁问题。
2024-07-05 12:58:22
1361
原创 动态控制eBPF程序加载:检查 Tracepoint、Kprobe是否存在
在 eBPF 程序开发中,确保程序能够在各种不同的系统配置中兼容运行是至关重要的。本文将详细介绍一个方案,通过动态检查Tracepoint、Kprobe是否存在,并结合libbpf的API接口控制 eBPF 程序的加载。这种方法不仅可以提升程序的灵活性,还能提高其在不同内核版本和系统配置中的兼容性。检查指定的 Tracepoint 是否存在;检查指定的 Kprobe 是否存在;
2024-06-02 22:23:47
1397
1
procstat-0.0.10.20240917-beta-x64
2025-04-07
procstat-0.0.9.20240911-beta-x64
2024-09-11
procstat-0.0.2.20240703-beta
2024-07-03
禁用某eBPF程序源代码
2024-06-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅