学习让我快乐

争于世, 不争于势;简洁, 高效, 赏心悦目

bpftrace, 与 C++

这篇文章总结下 bpftrace 以及相关工具, bpftrace 帮助我在日常值班, 双11大促(就比如刚刚结束的双 11 一峰), 时快速定位了不少问题. 关于 bpftrace 介绍, 一句话是 bpftrace 可以以极低开销查看运行时进程的状态, 比如函数执行阶段某个局部变量的值等. 这篇文章注重介绍 C++ 程序如何通过 bpftrace 追踪, 而不会过多介绍 bpftrace...

Coredump 未解之谜: 为什么 r14 为 0?

干活的时候, 同事又塞了个 coredump, 咋一看比较直观 r14 寄存器为 0, 导致 SIGSEGV. 0x00007f54b0335cf0 <+0>: push r15 0x00007f54b0335cf2 <+2>: push r14 0x00007f54b0335cf4 <+4>: push...

使用 jegdb 来调试内存相关 crash

这周我值班, 然后值班的时候有个同事找过来让帮忙排查个 coredump; 当时稀里糊涂一起看了下, 正好又有值班上的事情就被打断了. 等忙完了手头上的事情之后忽然又想起了这个 coredump: 咋一看, 这个 coredump 原因很明显, PostgreSQL MemoryContext 结构体被写坏了: (gdb) p *(AllocSetContext*)0x7fe20cc...

backtrace() crash: 从 CFI 说起

最近我们线上一种 crash 出现的频次逐渐升高, 具有完全一致的堆栈, 即在 _M_deallocate() 时收到了 SIGUSR2 信号, 信号里面调用了 backtrace(), backtrace() 触发了 SIGSEGV 导致了 crash. #0 x86_64_fallback_frame_state (context=0x7fc3f69fa3b0, context=0x...

jemalloc 代码精读 0: sz_size2index_compute

为了便于内存管理, jemalloc 引入 size class 的概念, 在 jemalloc 内部只支持分配 size classes 指定的 size 字节. 默认情况下, jemalloc 支持的 size class 有 8byte, 16byte, 32byte, 64byte 等等; 即 jemalloc 内部不支持分配一个大小为 33byte 的内存块. 在 jemalloc...

C 语言: Call to a function without a prototype

上周我一同事找我看一个很有意思的问题, 一个 bool 返回值函数总是返回 true. 简化为如下例子: // 1.c bool _is_valid_jsonb_with_schema() { // 简化后的例子, 实际 _is_valid_jsonb_with_schema 的逻辑有点复杂. return false; } // 2.c void is_valid_js...

从 fetch_add(0) 说起

在写完 C++ memory order: load(SeqCst) VS fetch_add(0, SeqCst) 这篇文章之后, 随着知识的进一步积累的, 一种不踏实感油然而生, 尤其是在收到一封感谢邮件之后: I notice that you have an interesting blog post regarding why fetch_add(0) is used ra...

Spanner: Becoming a SQL System

即上一篇 关于 Spanner 的若干猜测 之后, 继续跟进了 Spanner 另一篇论文 “Spanner: Becoming a SQL System”, 同样这篇文章不是论文介绍文章, 而是对论文一些我感觉模糊的地方所做的猜测. 非常欢迎/希望一起交流一下. 3.1 Distributed query compilation Spanner 中 SQL 优化过程, 当 Spanne...

C++ 的心智负担 -- Integral promotion

我个人习惯于将自己对 C++ 的经验分为三类: 纯粹的知识点, 喜好的代码风格, 以及心智负担; 在心智负担这一类中又记录了心智负担能否被编译器检测出来, 以及对应的编译选项及工具; 从我目前的笔记大小来看, C++ 确实是一个心智负担包袱很大的语言了== 这里介绍一下我记录的其中一个心智负担. 在我将 tokio 完整地移植到 C++ 作为 C++20 coroutine 运行时之后, ...

基于 FlameGraph 的内存泄漏检测

在进一步深入了解 FlameGraph 时, 可以看到火焰图作为一种通用工具, 不单单可以用于 cpu 热点展示, 还可以用与探测 diskio, memory 等热点消耗情况. 其中在 memory 上的功能引起我的兴趣, 在我日常值班线上巡检过程中, 遇到的不少 memory 使用持续上涨但不知所由的情况, 此时需要设置个环境变量开启 jemalloc profile 功能之后重启实例,...

在 tokio 上几个失败尝试

问题定义 最近在入门了 linux cfs scheduler, pelt, load balance 这些之后, 忍不住想以 tokio code base 为基础实践一下这几种操作的威力; 希望是能为 hologres 的 holo os 提提速, 详细细节可参考论文: Hologres builds a scheduling framework, referred to as...

linux 中的 pelt

本文基于 linux 5.16, 本文不是 linux pelt 入门介绍, 而是我在了解完 pelt 之后一些猜测推断与整理, 希望能与大家交流化解下我的迷惑. 本文使用的 task group 结构如下所示: task_struct se pelt 对于一个单独的 task_struct pe pelt 计算, 当前内核采用的公式是: \[{w_n * t_n * y ^ ...

C++ memory order: load(SeqCst) VS fetch_add(0, SeqCst)

在阅读 tokio 代码时, 发现一个很奇怪的地方, fetch_add(0): let state = State(self.state.fetch_add(0, SeqCst)); 就很好奇为啥不是直接 load(SeqCst), 还要 fetch_add(0) 一把? 翻了下修改历史, 背后原来是有故事的, 简单来说就是这块代码一开始就是 load(SeqCst) 的, 后来发现...