Linux启动内存分配器提速五千多倍
报价宝综合消息Linux启动内存分配器提速五千多倍
Linux 7.4 内核合入一组 memblock 改进,其中最亮眼的一笔:把早期启动阶段物理内存分配器的线性查找换成二分查找,在一个重度内存碎片化的场景下,把内核交接(KHO)的内存检索时间从约 268 秒压缩到约 50 毫秒——五千多倍。

memblock 是页面分配器就位之前管理物理内存的早期机制。Google 工程师塔伦·萨胡发现,mm/memblock.c 里的 memblock_add_range() 与 memblock_isolate_range() 在寻找候选内存区域时用的是线性扫描;当 KHO(内核交接机制,被 Live Update Orchestrator 等热升级设施使用)带来数十万个互不相交的内存块时,这段扫描的代价被急剧放大。
改用二分查找后,最坏复杂度从平方级降到 N 乘以对数 N,顺序追加时保持线性。萨胡的测试里,约 39.3 万页的 KHO 内存检索从 268 秒量级直接跌到 50 毫秒。另一位开发者董力在单路 32 核、关闭透明大页的环境下做了对照:打上补丁后,启动日志中两个相邻标记的时间间隔从 38.36 秒缩到 0.26 秒。
对绝大多数台式机和服务器来说,这段早期启动路径只占开机时间的一小部分,日常用户基本无感;但对依赖 KHO 做内核热升级(不重启机器换内核)的大型内存机器而言,这是分钟级到毫秒级的差别,热升级窗口越短,业务停顿越少。
该优化已随 memblock 拉取请求进入 Linux 7.4 合并窗口。7.4 正式版预计年底发布——前提是正在度假的 Torvalds 没有把合并窗口拖长。
编译自 Phoronix,原标题:"Linux's Early Boot-Time Physical Memory Allocator Sees Big Speed-Up: 268s To 50ms"