惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Cisco Blogs
Schneier on Security
Schneier on Security
T
Tor Project blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tenable Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Threat Research - Cisco Blogs
C
CERT Recently Published Vulnerability Notes
Security Latest
Security Latest
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
NISL@THU
NISL@THU
L
Lohrmann on Cybersecurity
Scott Helme
Scott Helme
Webroot Blog
Webroot Blog
Project Zero
Project Zero
Google Online Security Blog
Google Online Security Blog
The Last Watchdog
The Last Watchdog
Spread Privacy
Spread Privacy
Hacker News: Ask HN
Hacker News: Ask HN
PCI Perspectives
PCI Perspectives
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
W
WeLiveSecurity
Attack and Defense Labs
Attack and Defense Labs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
N
News | PayPal Newsroom
Help Net Security
Help Net Security
The Hacker News
The Hacker News
H
Heimdal Security Blog
O
OpenAI News
S
Security @ Cisco Blogs
N
News and Events Feed by Topic
Cyberwarzone
Cyberwarzone
Simon Willison's Weblog
Simon Willison's Weblog
G
GRAHAM CLULEY
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园 - 叶小钗
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Tailwind CSS Blog
大猫的无限游戏
大猫的无限游戏
A
Arctic Wolf
I
Intezer
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
Security Affairs
P
Proofpoint News Feed
S
Secure Thoughts
腾讯CDC
Google DeepMind News
Google DeepMind News
量子位
罗磊的独立博客

土法炼钢兴趣小组的算法知识备份

国密算法与国密 TLS 系列索引 【系统架构设计】架构质量属性:不只是"高可用高性能" 【系统架构设计百科】告警策略:如何避免"狼来了" 【系统架构设计】CQRS:读写分离的架构哲学 【系统架构设计】空间架构:极端扩展场景的解法 【系统架构设计】微服务架构深度审视:优势、代价与适用边界 【系统架构设计】扩展性原理:水平、垂直与对角扩展 【系统架构设计】无状态设计:扩展的第一步也是最难的一步 【系统架构设计】缓存架构:从本地到分布式的多级缓存体系 【系统架构设计】管道与过滤器:Unix 哲学的架构表达 【系统架构设计】复杂性管理:架构的核心战场 【系统架构设计】消息队列架构:异步解耦的设计与陷阱 【系统架构设计】CDN 架构:全球加速的设计原理 【系统架构设计】连接池设计:被忽视的性能杀手 【系统架构设计】弹性设计模式:熔断器、舱壁与超时 【系统架构设计】高可用设计模式:冗余、故障转移与仲裁 【系统架构设计】容量规划:从拍脑袋到数据驱动 【系统架构设计】数据库扩展:分库分表的工程实践与替代方案 【系统架构设计】SLO 工程:可靠性的量化管理 【系统架构设计】性能建模:用数学思维分析系统瓶颈 【系统架构设计】混沌工程:主动验证系统的韧性 【系统架构设计】零拷贝与内存映射:数据搬运的极致优化 【系统架构设计】线程模型:从 thread-per-request 到协程 【系统架构设计】容灾架构:多活与灾备设计 【系统架构设计】数据库性能模式:索引、查询与连接管理 【系统架构设计】数据建模:从关系范式到文档模型的真实权衡 【系统架构设计】吞吐量优化:批处理、流水线与并发模型 【系统架构设计】流处理架构:从批处理到实时的范式迁移 【系统架构设计】搜索引擎架构:倒排索引之上的系统设计 【系统架构设计】时序数据架构:监控与 IoT 的存储设计 【系统架构设计】数据迁移与版本化:在线不停机的数据演进 【系统架构设计】数据湖与数据仓库:分析架构的演进路线 【系统架构设计】API 网关设计:入口层的职责边界 【系统架构设计】应用层数据一致性模式:在正确性与性能之间走钢丝 【系统架构设计】多模数据库选型:Polyglot Persistence 的工程实践 【系统架构设计】服务发现与注册:动态拓扑的基础设施 【系统架构设计】配置管理架构:从配置文件到配置中心 【系统架构设计】全链路压测:大规模系统的性能验证 【系统架构设计】幂等性设计:分布式环境下的安全重试 【系统架构设计】契约测试与 Schema 演进:服务间的信任协议 【系统架构设计】长连接与推送架构:WebSocket、SSE 与 MQTT 【系统架构设计】延迟分析:从 P50 到 P999 的全链路追踪 【系统架构设计百科】DDD 战术模式:聚合、实体与值对象 【系统架构设计百科】防腐层与开放主机服务:系统集成的 DDD 方案 【系统架构设计百科】领域事件与事件风暴:从业务到架构的桥梁 【系统架构设计百科】CQRS + Event Sourcing 完整实战:从领域建模到部署 【系统架构设计百科】DDD 与微服务:用领域模型划分服务边界 【系统架构设计】DDD 战略设计:限界上下文与上下文映射 【系统架构设计百科】认证架构:从 Session 到 JWT 到 OIDC 【系统架构设计】API 设计哲学:REST vs GraphQL vs gRPC 的真实权衡 排序算法专题:从 TimSort 到并行排序 【密码学百科】国密算法体系:SM2/SM3/SM4/SM9 全景解读 【密码学百科】承诺方案:Pedersen 承诺、向量承诺与多项式承诺 【密码学百科】不经意传输与隐私信息检索:OT、OT 扩展与 PIR 【密码学百科】门限密码学:门限签名、门限解密与分布式密钥生成 完美哈希:从理论到 gperf 实践 【密码学百科】安全多方计算:从 Yao 的混淆电路到实用 MPC 【密码学百科】同态加密:从 Paillier 到全同态加密(FHE) 【密码学百科】零知识证明系统:zk-SNARKs、zk-STARKs 与 Bulletproofs 【密码学百科】概率论与密码分析:生日攻击、差分分析与线性分析 【密码学百科】计算复杂性与归约:密码安全性证明的基石 【密码学百科】秘密共享:Shamir 方案、VSS 与安全多方计算入口 【密码学百科】椭圆曲线代数:Weierstrass 方程、点群运算与曲线选择 【密码学百科】离散对数与配对密码学:从 DLP 到 BLS 签名 【密码学百科】格密码数学基础:SVP、LWE 与格基约化 【密码学百科】抽象代数:群、环、域的密码学视角 【密码学百科】有限域算术:GF(2^n) 运算与在 AES/ECC 中的应用 【密码学百科】数论进阶:二次剩余、椭圆曲线上的 Weil 配对 【密码学百科】密码学简史:从凯撒密码到量子时代 【密码学百科】威胁模型与安全目标:CIA 三要素之外 【密码学百科】Kerckhoffs 原则与现代密码设计哲学 【密码学百科】随机性:密码学的基石 【密码学百科】信息论入门:熵、完美保密与 Shannon 定理 【密码学百科】分组密码原理:Feistel 网络与 SPN 结构 【密码学百科】AES 逐步拆解:SubBytes 到 MixColumns 的数学 【密码学百科】分组密码工作模式全览:ECB/CBC/CTR/OFB/CFB 【密码学百科】流密码:RC4 的兴衰与 ChaCha20 的崛起 【密码学百科】密码学哈希函数:MD5→SHA-2→SHA-3 的进化之路 【密码学百科】MAC 与 HMAC:消息认证的正确姿势 【密码学百科】认证加密(AEAD):GCM、ChaCha20-Poly1305 与 OCB 【密码学百科】密钥派生函数:HKDF、PBKDF2、Argon2 与密码存储 【密码学百科】公钥密码的数论基础:模运算、群、原根 【密码学百科】RSA 从原理到攻击:教科书 RSA 为什么不安全 【密码学百科】Diffie-Hellman 密钥交换与离散对数问题 【密码学百科】椭圆曲线密码学(ECC):从几何直觉到点群运算 【密码学百科】数字签名:ECDSA、EdDSA 与 Schnorr 签名 【密码学百科】现代密钥交换:X25519、ECDHE 与前向保密 【密码学百科】混合加密与 KEM/DEM 范式:ECIES 与 HPKE 【密码学百科】填充方案:PKCS#1 v1.5、OAEP 与 PSS 【密码学百科】TLS 协议全解析:从握手到 0-RTT 【密码学百科】PKI 与数字证书:信任链的构建与崩塌 【密码学百科】密码认证协议:从 SRP 到 OPAQUE 【密码学百科】零知识证明入门:如何证明你知道而不泄露 【密码学百科】安全信道构造:Noise 协议框架与 Signal 协议 【密码学百科】密钥管理工程:HSM、KMS 与密钥生命周期 【密码学百科】侧信道攻击:从时序攻击到功耗分析 【密码学百科】密码学实现陷阱:三层漏洞分类、审计工具链与系统性预防 密码敏捷性:如何设计可升级的密码系统 【密码学百科】OpenSSL/BoringSSL 架构剖析:ENGINE、Provider 与 FIPS 模块 排序基准测试:用数据说话
【操作系统百科】用户态分配器
2026-05-07 · via 土法炼钢兴趣小组的算法知识备份

内核提供 mmap/brk,用户态分配器在上面管理堆:切小块、复用释放块、还页给内核。glibc ptmalloc2、Google tcmalloc、Facebook jemalloc、Microsoft mimalloc 四家各有侧重。

一、先看图

flowchart TD
    APP[malloc 请求] --> ALLOC[分配器<br/>thread cache]
    ALLOC -->|小块 < 256K| TCACHE[thread-local cache<br/>→ arena → sbrk/mmap]
    ALLOC -->|大块 ≥ 256K| MMAP[直接 mmap]
    FREE[free 释放] --> BACK[归还 thread cache]
    BACK -->|积累够了| MADV[madvise DONTNEED/FREE<br/>返还 OS]
    classDef fast fill:#3fb95022,stroke:#3fb950,color:#adbac7;
    classDef slow fill:#f0883e22,stroke:#f0883e,color:#adbac7;
    class TCACHE,BACK fast
    class MMAP,MADV slow

二、glibc ptmalloc2

2.1 核心概念

  • arena:每个线程可能绑定不同 arena(默认 arena 数量 = 8 × core 数)
  • chunk:分配单元;inline metadata(size + flags)
  • bins:按大小的空闲链表(fast bins、small bins、large bins、unsorted bin)
  • fast bins:小块单链表,不合并,最快路径

2.2 大小分界

  • < 128KB:从 arena heap(brk/mmap 的连续区域)
  • ≥ 128KB(M_MMAP_THRESHOLD):直接 mmap,free 时 munmap

2.3 弱点

  • arena 锁争抢(多线程密集 malloc)
  • 碎片化严重(合并不够及时)
  • 内存不及时返还 OS → RSS 膨胀

2.4 调参

mallopt(M_ARENA_MAX, 4);           // 限制 arena 数
mallopt(M_MMAP_THRESHOLD, 65536);  // 降 mmap 阈值
malloc_trim(0);                     // 手动缩 heap

三、tcmalloc(Google)

3.1 哲学

per-thread cache 消除锁争抢。三层:

  1. thread cache:每线程按 size class 的空闲链表
  2. central cache:全局按 size class 的 span 管理
  3. page heap:按页管理底层

3.2 size class

把所有大小归为 ~88 个 class(8, 16, 32, 48, 64, … 262144)。减少碎片。

3.3 优势

  • 小块分配几乎无锁
  • 碎片控制好
  • 自动返还(MallocExtension::ReleaseMemoryToSystem

3.4 使用

LD_PRELOAD=/usr/lib/libtcmalloc.so ./app
# 或 链接时 -ltcmalloc

环境变量调优:TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES

四、jemalloc(Facebook/FreeBSD)

4.1 哲学

多 arena + 细粒度 size class + 积极返还。FreeBSD 默认分配器。

4.2 结构

  • arena:默认 4 × core 数
  • bin:每 arena 按 size class;每个 bin 管理 slab
  • extent:大块管理(对标 tcmalloc 的 span)

4.3 碎片治理

  • size class 更密集(~200+ 个),内部碎片更小
  • decay:定时把空闲 dirty page 用 madvise(MADV_FREE) 返还 OS
  • muzzy:中间态——MADV_FREE 后内核还没真回收的页

4.4 使用

LD_PRELOAD=/usr/lib/libjemalloc.so ./app

# mallctl 接口
export MALLOC_CONF="background_thread:true,dirty_decay_ms:1000"

Redis、Rust(默认分配器)都用 jemalloc。

五、mimalloc(Microsoft)

5.1 哲学

简单 + 极致性能。per-thread 的 page 管理(不是 arena)。

5.2 特点

  • 对象分配 1-2 条指令
  • free-list 紧凑(in-page free list)
  • 碎片低
  • 安全模式:double-free 检测、guard page

5.3 性能

在多线程小对象工作负载下经常比 tcmalloc/jemalloc 快 5-15%。

六、MADV_FREE vs MADV_DONTNEED

分配器返还内存给 OS 的两种方式:

  • MADV_DONTNEED:立即释放物理页;下次访问触发零页 fault
  • MADV_FREE(4.5+):标记”可回收”;如果 OS 需要内存就收走,否则保留

jemalloc 默认用 MADV_FREE(lazy 返还,减少 fault)。tcmalloc 也支持。

glibc 的 malloc_trim 用 MADV_DONTNEED。

7.1 症状

进程 RSS 远大于”活跃堆大小”。free 了但 RSS 不降。

7.2 原因

  • 内部碎片:size class 不够密
  • 外部碎片:空闲块散布,无法合并成可返还的整页
  • 返还不及时:分配器 hold 住空闲页

7.3 诊断

# jemalloc
MALLOC_CONF="stats_print:true" ./app

# tcmalloc
# pprof 或 MallocExtension::GetStats

# 通用
pmap -x $PID | tail -1   # total RSS
cat /proc/$PID/smaps_rollup

7.4 缓解

  • 换分配器(tcmalloc/jemalloc 通常比 glibc 碎片低)
  • 调 decay/trim 参数
  • 对象池(application-level arena)

八、选择指南

场景 推荐
通用 Linux 服务 jemalloc(碎片控制 + 返还)
Google 生态 / Go runtime tcmalloc
高频小对象 mimalloc
嵌入式 / 最小依赖 glibc ptmalloc
Rust 默认 jemalloc(可换)
Redis jemalloc(官方推荐)
PostgreSQL glibc(内部有自己的 MemoryContext)

九、观察

# 当前使用哪个分配器
ldd ./app | grep -E 'malloc|jemalloc|tcmalloc'

# glibc malloc stats
MALLOC_STATS=1 ./app

# jemalloc 实时统计
MALLOC_CONF="stats_print:true"

# tcmalloc 页级统计
pprof --text ./app heap.prof

十、小结

  • 四大分配器各有哲学:ptmalloc2(标准)、tcmalloc(per-thread)、jemalloc(arena+decay)、mimalloc(极简)
  • MADV_FREE/DONTNEED 是分配器返还 OS 的关键
  • 碎片/RSS 膨胀靠换分配器 + 调参 + 对象池
  • 生产选 jemalloc 或 tcmalloc 一般优于默认 glibc

至此子系列 E(内核内存分配器)完结,共 6 篇(41-46)。下一子系列 F:文件系统与 VFS(8 篇,47-54)将讲 VFS 四层抽象、路径解析、ext4 深入、btrfs/XFS、overlayfs、IO_uring 文件操作。


参考文献

  • Berger et al. “Hoard: A Scalable Memory Allocator for Multithreaded Applications.” ASPLOS 2000
  • Jason Evans, “jemalloc.” 2006
  • Sanjay Ghemawat & Paul Menage, “TCMalloc: Thread-Caching Malloc.” 2005
  • Daan Leijen, “mimalloc: Free List Sharding in Action.” MSR 2019
  • glibc malloc internals wiki

工具

  • LD_PRELOAD
  • pprof(tcmalloc/Go)
  • jemalloc_stats
  • malloc_info(0, stdout)(glibc)
  • valgrind --tool=massif

延伸阅读


上一篇内核内存调试 下一篇VFS 四层抽象

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-04-06 · algorithms

内存分配器对决:jemalloc vs tcmalloc vs mimalloc

你的服务在线上跑了三天,RSS 从 2GB 涨到了 6GB,free 显示内存快爆了,但业务量没变。你重启'修好了',然后下周又涨回去。问题不在你的代码里——问题在 malloc 里。

2026-04-27 · os

【操作系统百科】内存回收

Linux 内存回收是 VM 最复杂的子系统之一。本文讲 active/inactive LRU、kswapd 与 direct reclaim、watermark 三线、swappiness 的真实含义、MGLRU 改造、memcg 回收与 PSI。

2026-04-28 · os

【操作系统百科】交换

swap 还值得开吗?本文讲 swap area 基础、swap cache、zram 压缩内存、zswap 前端压缩池、swappiness 的真实含义、容器里的 swap 策略,以及为什么现代 Android 全靠 zram 不靠磁盘。