pprof 是采样器,不是记账本
CPU profile 按固定频率采样,heap profile 默认每 512KB 才留一个样本,block 和 mutex profile 甚至默认关闭。把小对象泄漏或瞬时尖峰直接读成“总量”,是 pprof 最常见的误用。
685 字
|
3 分钟
std::pmr 的分配器边界
pmr 把分配器从类型参数变成了运行期对象,代价是容器的类型不再携带资源信息。资源必须比容器活得久,跨资源赋值不会自动迁移,这两条边界决定了它好不好用。
712 字
|
4 分钟
GOMEMLIMIT 不是内存上限
GOMEMLIMIT 影响的是 GC 的推进节奏,不是运行时的硬性配额。容器里 RSS 仍然会越过它,原因分成堆内保留、堆外占用和内核记账三类,分开看才知道该调哪个旋钮。
913 字
|
5 分钟
Trait 对象与单态化:两种多态的成本
泛型和 impl Trait 在编译期为每个具体类型生成一份代码,dyn Trait 在运行期查虚表。前者换来内联和零开销,代价是代码体积与编译时间;后者换来统一的容器类型,代价是间接调用。
631 字
|
3 分钟
C++23 协程的帧到底分配在哪里
协程帧不是栈上的一块临时空间,它的生命周期由 coroutine_handle 决定。HALO 能不能省掉这次堆分配,取决于编译器看得见什么;看不见的时候,帧的大小直接决定每次 co_await 的成本。
885 字
|
4 分钟
一次 p99 抖动,牵出 Go 调度器的偷任务
CPU 利用率只有四成,p99 却周期性地跳起来。问题不在 GC,而在工作窃取:长短不一的 goroutine、跨 P 的缓存迁移和 spinning M 一起,把尾延迟抬了上去。
969 字
|
5 分钟
Pin 到底在钉什么
Pin 保证的不是“值不会移动”,而是“在 Pin 的有效期内,没有任何安全代码能移动它”。理解这一点,才能解释 Unpin、结构体钉住和 async future 之间的关系。
850 字
|
4 分钟
从 sendfile 到 io_uring:零拷贝的边界
零拷贝不是把拷贝变没,而是把拷贝从 CPU 手里挪到 DMA 或者内核内部。TLS、协议封装和缓冲区分片会在中途把这条链打断,理解边界比记住 API 更重要。
974 字
|
5 分钟
1
2