[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fKy-jb857vVY9f32JfIgEMdzK9OVP2-OZbYqO3ihX9S8":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},"6ced249d-9a51-438b-b51a-8ebb9a27a949","article","NUMA：同一台机器上的内存，为什么有的更近更快？","numa-non-uniform-memory-access","NUMA 把多路服务器的 CPU 与内存看成多个距离不同的节点，本地访问通常更快，线程与数据的放置会直接影响吞吐和尾延迟。","在多路 CPU 服务器里，“内存”并不是一整块距离相同的池子。NUMA（Non-Uniform Memory Access，非一致内存访问）把机器看成多个节点：每个节点拥有处理器和本地内存，访问本地内存通常更快，访问另一个节点的内存则要经过互连链路。\n\n可以把它想成一座由多个园区组成的大学。每个园区都有自己的图书馆，学生在本园区取书最快；如果要去远处园区借书，需要走更长的路，还会占用园区之间的通道。所有图书馆仍然属于同一所大学，但距离决定了访问延迟和可用带宽。\n\nNUMA 的性能问题往往不是单次访问慢，而是数据和线程长期“住错地方”。如果一个线程在节点 A 上运行，却反复读取节点 B 的大数组，就会产生跨节点流量；多个线程还可能争用同一条互连。操作系统和运行时会尝试使用本地分配、线程绑核、页面迁移和内存策略，把计算和数据放在相近的节点上。\n\n对开发者来说，数组、对象池、缓存和数据库页的布局都可能暴露 NUMA 影响。线程池如果随意在所有 CPU 间迁移，线程本地缓存会失效；任务如果被调度到远端节点，理论上的并行度可能换来实际的内存瓶颈。反过来，把线程和数据过度绑定，也可能导致一个节点内存耗尽、其他节点闲置。\n\nNUMA 不是“内存分成了几块就完事”，而是一种需要把拓扑纳入性能模型的架构事实。观察节点间延迟、带宽、线程亲和性和页面归属，往往比单纯增加 CPU 核心更能解释大型服务的尾延迟。\n\n排查 NUMA 问题时，平均 CPU 利用率往往不够。更有用的线索包括远端内存访问比例、每个节点的内存压力、线程迁移和跨节点互连带宽。只有把这些指标与请求延迟、缓存命中和任务分布放在一起看，才能判断瓶颈究竟来自计算、内存容量，还是节点之间的交通。\n\n资料来源：[Linux Kernel Documentation：NUMA Memory Policy](https:\u002F\u002Fdocs.kernel.org\u002Fmm\u002Fnuma.html)","\u002Fuploads\u002F2026-09-26\u002F1bf98759-c58b-4537-a274-ebc889f06f89.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},"4c2bbea6-eab7-40a8-8447-1de478ff7749","分析","analyse",null,"Linux Kernel Documentation：NUMA Memory Policy","https:\u002F\u002Fdocs.kernel.org\u002Fmm\u002Fnuma.html","published",false,48,0,"2026-09-27T00:00:00.000Z","2026-09-26T16:26:03.813Z",[45,53,62],{"id":46,"type":6,"title":47,"slug":48,"summary":49,"coverUrl":50,"authorName":14,"sno":51,"publishedAt":42,"createdAt":52},"5e0c84da-6011-41e8-b1f7-726c8bf0b30a","RCU：读多写少的系统，为什么敢让读者几乎不加锁？","rcu-read-copy-update-explained","RCU 把共享数据的更新与旧版本回收拆开，让读者以极低成本读取，同时等待所有旧读者离开后再释放内存。本文用导览图解释它的读侧、宽限期与适用边界。","\u002Fuploads\u002F2026-09-26\u002F3398ce37-ca4f-4cc3-84b3-fe931d2f055d.jpg",41,"2026-09-26T16:25:40.784Z",{"id":54,"type":6,"title":55,"slug":56,"summary":57,"coverUrl":58,"authorName":14,"sno":59,"publishedAt":60,"createdAt":61},"0bc79f1c-f305-4d64-a9f8-589d1d6da0b3","EEVDF：Linux 如何判断哪个任务“最该先用 CPU”？","eevdf-linux-fair-cpu-scheduling","EEVDF 是 Linux 调度器的一种公平调度思路：先判断任务是否获得了应有份额，再按虚拟截止时间安排运行机会。本文用共享厨房的比喻，解释它如何兼顾长期公平与短期响应，并澄清它并非硬实时保证。","\u002Fuploads\u002F2026-10-13\u002Fdc59d374-8c78-41ba-bdfe-a6f0e62ab246.jpg",43,"2026-10-13T00:00:00.000Z","2026-10-13T02:13:28.103Z",{"id":63,"type":6,"title":64,"slug":65,"summary":66,"coverUrl":67,"authorName":14,"sno":68,"publishedAt":42,"createdAt":69},"23b5596a-29ab-4ff8-8237-1fd34d8e0bd1","Seqlock：读者不加锁，为什么还能读到一份一致的数据？","seqlock-sequence-counter-explained","Seqlock 让读者先后读取序列号并在变化时重试，以校验快照是否被写者打断，适合读多写少且字段可安全复制的数据。","\u002Fuploads\u002F2026-09-26\u002Fe6a9caee-7551-469f-9b16-d27fcc97f034.jpg",44,"2026-09-26T16:25:51.305Z"]