[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fUufL4zRoH7cOUpIucpVW3B0j6MCPl7XXSjCYOQhTBcM":3},{"item":4,"related":44},{"id":5,"type":6,"title":7,"slug":8,"summary":9,"body":10,"coverUrl":11,"productScreenshots":12,"productLinks":13,"authorName":14,"authorUrl":15,"authorSubject":16,"category":17,"tags":22,"sourceLabel":35,"sourceName":36,"sourceUrl":37,"status":38,"seoTitle":7,"seoDescription":9,"canonicalUrl":35,"isFeatured":39,"sno":40,"sortOrder":41,"publishedAt":42,"updatedAt":43,"createdAt":43},"f7eef407-0285-46bf-8dc0-88a221d74ef9","article","KSM：虚拟机里重复的内存页，能不能只保留一份？","linux-ksm-kernel-samepage-merging","Linux KSM 会合并内容相同的内存页，并在有人写入时通过写时复制分开。本文解释它如何节省内存，以及扫描成本何时会抵消收益。","如果一台服务器同时运行许多相似的虚拟机，它们可能在内存里保存完全相同的只读内容：相同的系统库、相同的启动模板，甚至尚未改动的零填充页。Linux KSM（Kernel Samepage Merging，内核同页合并）会扫描可合并的内存页，寻找内容相同的页，并让多个进程共享一份物理页。\n\n关键在于“内容相同”而非“用途相同”。内核不能仅凭两个地址看起来相似就合并；它会比较页面内容。合并后，共享页通常被设为写保护。当某个进程尝试修改它时，内核通过写时复制为该进程准备独立页面，这样其他共享者不会被意外改变。可把它想成图书馆里许多人先借阅同一本只读资料，某人要在上面做笔记时，再给他一份个人复印件。\n\n节省的内存不是凭空而来。扫描本身需要 CPU 时间，跟踪可合并页面也要消耗内核资源；大量页面被频繁修改时，合并和随后拆分的开销可能抵消收益。KSM 更适合内容重复度高、共享页面相对稳定的环境，例如某些虚拟化或沙箱工作负载，而不是所有通用服务器都应该无条件开启。\n\n还有一个容易混淆的点：KSM 不会自动扫描系统里任意进程的全部内存。应用或运行环境需要把可合并范围交给内核，并且管理员可以配置扫描速度、页数等参数。Linux 内核文档也强调，KSM 的行为和可用选项应结合具体内核与系统配置理解。安全边界方面，写时复制必须正确工作，内存共享策略也要符合租户隔离要求。\n\n如果要评估，先观察页面重复度、扫描 CPU 成本、实际驻留内存变化，以及写入后的拆分频率。只看“合并页数量”并不能证明整体获益：如果节省少量内存却持续占用核心，或者页面很快被改写，就未必划算。应在同类负载下比较开启前后的内存峰值和响应时间，并保留关闭或调整扫描策略的方案。\n\nKSM 展示了内存优化的一种聪明办法：既不要求应用之间提前协商，也不永久强迫它们共享可写数据，而是先合并相同页、在写入时再分开。它适合有重复数据的场景，却需要用扫描成本和写入模式来证明价值。\n\n来源：[Linux 内核文档：Kernel Samepage Merging](https:\u002F\u002Fdocs.kernel.org\u002Fadmin-guide\u002Fmm\u002Fksm.html)","\u002Fuploads\u002F2026-10-06\u002Ff5334e84-6620-47bc-b200-d6bd45763a93.jpg",[],[],"Foundit","https:\u002F\u002Ffoundit.cn","foundit-ai-editorial",{"id":18,"name":19,"slug":20,"description":21},"6179d3b6-dc34-4483-9ded-3cd9f1b37a47","科普","abbreviation","介绍各领域新兴概念",[23,27,31],{"id":24,"name":25,"slug":26},"144abe77-0dc6-4f66-a176-20bddb1c0bfa","编程","coding",{"id":28,"name":29,"slug":30},"7c76bfc2-f80f-4ee0-a95d-27bd8708b434","技术","slug",{"id":32,"name":33,"slug":34},"a202d639-99a6-488a-a712-4d4c6ffd7e15","开发","dev",null,"Linux Kernel Documentation：Kernel Samepage Merging","https:\u002F\u002Fdocs.kernel.org\u002Fadmin-guide\u002Fmm\u002Fksm.html","published",false,59,0,"2026-10-06T00:00:00.000Z","2026-10-06T07:51:22.113Z",[45,54,61],{"id":46,"type":6,"title":47,"slug":48,"summary":49,"coverUrl":50,"authorName":14,"sno":51,"publishedAt":52,"createdAt":53},"4ce57934-2b23-41a1-800e-bb2d8ab36684","Wasm Component Model：不同语言写的模块怎样用同一套接口协作？","wasm-component-model-wit-interfaces","WebAssembly Component Model 用有类型的接口描述组件如何交换数据与调用功能，WIT 则帮助表达这些接口。本文用模块化电器说明跨语言组合的意义，也指出它不代表程序脱离运行时就能在任何环境原样运行。","\u002Fuploads\u002F2026-10-17\u002F0eb1c88d-dc1f-486d-8194-54f72dd215ec.jpg",45,"2026-10-17T00:00:00.000Z","2026-10-17T03:08:52.474Z",{"id":55,"type":6,"title":56,"slug":57,"summary":58,"coverUrl":59,"authorName":14,"sno":51,"publishedAt":42,"createdAt":60},"07fe8e6e-82b0-46cc-9015-c6d027564430","pidfd：进程号会被重用，怎样才能稳定指向一个进程？","linux-pidfd-stable-process-reference","Linux pidfd 用文件描述符稳定引用一个进程，避免退出后的 PID 被重用而误操作新进程。本文介绍它的等待、信号用途和版本边界。","\u002Fuploads\u002F2026-10-06\u002F699e59f8-693f-47cb-87b1-c51764d1a679.jpg","2026-10-06T07:51:27.054Z",{"id":62,"type":6,"title":63,"slug":64,"summary":65,"coverUrl":66,"authorName":14,"sno":51,"publishedAt":67,"createdAt":68},"15988123-6303-4ab1-ba01-dcc41f36329f","Futex：Linux 的锁为什么大多数时候根本不需要进内核？","futex-fast-userspace-locking","Futex 把无竞争时的锁操作留在用户态，只有真正需要睡眠和唤醒时才进入内核，是 Linux 高性能锁的关键低层构件。","\u002Fuploads\u002F2026-09-26\u002F90e98cc8-e57b-4dea-afc7-2afe7550d483.jpg","2026-09-27T00:00:00.000Z","2026-09-26T16:25:54.119Z"]