学习让我快乐

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

使用 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) 的, 后来发现...

C++表达式求值顺序的一个小问题

在学习 hologres 代码的时候, 忽然发现一处直觉感觉不对的地方, 简化一下对应着如下代码块: #include <memory> #include <stdio.h> using namespace std; struct C2 { template <typename F> void finally(F f) { ...

开脑洞地为 rocksdb 引入 orc

问题定义 开发 KuiBaDB 的由头之一是想论证我自己脑补的一个列存模型, 这个列存模型受 hologres 论文中列存启发, 结合我自己的 PG 背景, 移除了 delete map, 转而为列存每一行加个 xmin, xmax 字段来表示行的事务信息, 从而可以判断行是否已经删除. 但在了解 Spanner 之后, 结合 KuiBaDB 开发经验, 对 PG 事务模型在高并发扩展性下...