
LWN 159110: 更多有关避免内存碎片化的报道(More on fragmentation avoidance)
原文:More on fragmentation avoidance 原创:By corbet @ Nov. 8, 2005 翻译:By simowce of TinyLab.org 校对:By unicornx
Last week’s article on fragmentation avoidance concluded with these famous last words:
But there are legitimate reasons for wanting this capability in the kernel, and the issue is unlikely to go away. Unless somebody comes up with a better solution, it could be hard to keep Mel's patch out forever.
上周关于避免碎片化的文章在最后提到:
但是我们真的有那么多的理由为内核添加这种功能啊,所以这个问题不太可能就此结束。除非有人提出更好的解决方案,否则我相信 Mel 的补丁迟早还是会被合入内核主线的。
One thing which can keep a patch out of the kernel, however, is opposition from Linus, and that is what has happened in this case. His position is that fragmentation avoidance is “totally useless,” and he concludes:
Don't do it. We've never done it, and we've been fine.
当然只有一种情况能够阻止一个补丁进入内核主线,那就是 Linus 先生也对此表示反对,而在这件事上他确实也这么做了。Linus 认为避免碎片化是 “完全没用的”,他的原话如下:
别这么干。我们从来没有这么做过,也没见出过什么问题。
The right solution, according to Linus, is to create a special memory zone on the (rare) systems which need to be able to free up large, contiguous blocks of memory. Kernel memory allocations would not be allowed in that zone, so it would only contain user-space pages. Those pages are relatively easy to move when the need arises, so most needs would be satisfied. A certain amount of kernel tuning would be required, but that is the price to be paid for running highly-specialized applications.
Linus 认为,正确的解决方案是针对那些(少数)需要清理出大量物理上连续的内存块的系统创建一个特殊的域(zone)。这个域中不允许分配内核地址空间的页框,因此只会有用户地址空间的页框。当需要分配物理上连续的大内存时,这些页框相对来说比较容易迁移,从而满足大部分的需求。采用这种方案需要一些额外的,内核上的调优,但这也是为了满足这种特定需求所必须付出的代价。
This approach is not pleasing to everybody involved. Andi Kleen noted:
You have two choices if a workload runs out of the kernel allocatable pages. Either you spill into the reclaimable zone or you fail the allocation. The first means that the huge pages thing is unreliable, the second would mean that all the many problems of limited lowmem would be back.
可是 Linus 的这个方案并没有让所有人满意。Andi Kleen 指出:
当内核可分配内存耗尽时你现在有两个选择,要么是从这个特殊的域(zone)中分配页框,要么就让本次内存分配失败。采用第一种方式意味着针对巨页的分配请求并不能被可靠地满足(译者注,之所以不可靠,即参考上面 Linus 的想法,这个特殊的 zone 里的页必须要满足是可回收的,即必须是用于用户空间的,那么对于如果请求分配的巨页是用于内核空间的情况就会失败。),而第二种方式则意味着我们又得重新面对类似原先处理有限的低端内存时所遇到的那些问题。
Others have noted that it can be hard to tune a machine for all workloads, especially on systems with a large number of users. Objections notwithstanding, it begins to look like active fragmentation avoidance is not likely to go into the 2.6 kernel anytime soon.
其他人还指出,针对一台设备的所有工作负载情况进行调优是非常困难的,特别是那些有大量用户的系统。因此,尽管 Linus 的提议遭到了不少反对(译者注,这些反对的声音实际上起到了支持 Mel 先生的作用),但是 Mel 的主动避免内存碎片(active fragmentation avoidance)补丁看上去还是不会很快被 2.6 版本的内核所接纳。
支付宝打赏 ¥9.68元 | 微信打赏 ¥9.68元 | |
![]() | ![]() 请作者喝杯咖啡吧 | ![]() |
Read Album:
- LWN 520076: 软中断对实时性的影响
- LWN 452884: 实时 Linux 中的 Per-CPU 变量处理
- LWN 302043: 中断线程化
- LWN 296419: SCHED_FIFO 和实时任务抑制(throttling)
- LWN 271817: 实时自适应锁
- LWN 178253: 内核中的 “优先级继承(Priority Inheritance)”
- LWN 146861: 实时抢占补丁综述
- “LWN 中文翻译计划” 二周年工作小结
- LWN 106010: 实现 “实时(realtime)” Linux 的多种方法
- LWN 433904: 一个 “组调度(group scheduling)” 的运行实例
- LWN 418884: 针对 “组调度”(Group scheduling)的不同分组方案
- LWN 415740: 基于 TTY 的组调度
- LWN 428230: CFS 带宽控制
- LWN 230574: 内核调度器替换方案的激烈竞争
- LWN 668126: 更加可靠(reliable)和更可预期(predictable)的 OOM 处理机制
- LWN 562211: 更加可靠的 OOM 处理
- LWN 391222: 重写(rewrite)OOM Killer
- LWN 517465: 为 “巨页”(huge page)增加一个 “零页”(zero page)
- LWN 423584: 对 2.6.38 版本中新增的 “透明巨页(Transparent Huge Pages)” 特性的介绍
- LWN 359158: 透明巨页(Transparent Hugepages)
- LWN 758677: 优化巨页(huge page)交换(swapping)的终极之役
- LWN 717707: 页交换(swap)的改进计划
- LWN 240474: CFS 组调度
- LWN 704478: 让页交换(swapping)更具扩展性(scalable)
- LWN 439298: 可靠地通过网络执行页交换(swapping)
- LWN 334649: Compcache,一种基于内存实现压缩交换(compressed swapping)的技术
- LWN 83588: 内核 2.6 版本的交换(swapping)行为
- LWN 550463: 更好的 Shrinker 机制
- LWN 495543: 一种更好的平衡 active/inactive 链表长度的算法(Refault Distance 算法)
- LWN 333742: 降低存放可执行指令的页框被换出的可能性
- LWN 286472: 页框回收处理中着眼于可扩展性能(scalability)改进的最新介绍
- LWN 257541: 大容量内存系统的页框回收处理
- LWN 226756: 改进页框回收(page replacement)
- LWN 712467: 页缓存(page cache)的未来
- LWN 372384: 改善文件预读(readahead)
- LWN 235164: 按需预读(On-demand readahead)
- LWN 155510: 自适应(Adaptive)文件预读(readahead)算法
- LWN 685894: 后台回写(Background writeback)
- LWN 682582: 改进后台回写(writeback)引入的延迟
- LWN 648292: 回写(Writeback)和控制组(control groups)
- LWN 456904: 避免磁盘回写(writeback),抑制(throttling)缓存(page cache)写入
- LWN 405076: 动态回写抑制(Dynamic writeback throttling)
- LWN 396561: 解决 direct reclaim 中的 writeback 问题
- LWN 384093: 有关 “回写”(writeback)的问题讨论
- LWN 326552: 一种替代 pdflush 的新方案
- LWN 717656: 主动(proactive)内存规整(compaction)
- LWN 684611: 连续内存分配器(Contiguous Memory Allocator)和内存规整(compaction)
- LWN 591998: 内存规整(memory compaction)所存在的问题
- LWN 368869: 内存规整(compaction)
- LWN 211505: 避免和解决内存碎片化
- LWN 158211: 避免内存碎片化(fragmentation avoidance)
- LWN 121618: 另一种避免内存碎片化(memory fragmentation)的方法
- LWN 105021: 主动内存碎片整理
- LWN 101230: Kswapd 和 “高阶”(high-order)内存申请
- LWN 155344: 有关 `gfp_t`
- LWN 320556: 为页框分配器(page allocator)加速
- LWN 565097: 对 `struct page` 的进一步改进
- LWN 335768: 我们究竟可以为物理页定义多少个状态标志?
- LWN 121845: 内核 2.6 中地址空间的随机化
- LWN 91829: 重新组织地址空间(address space)的布局
- LWN 753267: 针对页表遍历方式进行改造的讨论
- LWN 717293: 五级页表
- LWN 117749: 合入四级页表功能
- LWN 116810: 对四级页表设计的再思考
- LWN 106177: 四级页表
- LWN 761215: 关于内核初始化早期阶段内存分配管理机制的发展回顾
- LWN 387083: 针对 x86 平台移植 LMB(Logical Memory Block)内存分配器
- LWN 382559: `NO_BOOTMEM` 补丁
- LWN 383162: 案例分析,复杂设计下的匿名页反向映射处理
- LWN 75198: 虚拟内存专题二:基于对象的反向映射(object-based reverse mapping,简称 objrmap)的回归
- LWN 23732: 虚拟内存之基于对象的反向映射技术(object-based reverse-mapping)
- LWN 558284: 整个系统都空闲了吗?
- LWN 574962: 时钟广播框架(The tick broadcast framework)
- LWN 549580: 3.10 版本开始支持(接近)完全无周期时钟(full tickless)
- LWN 223185: 时钟事件(Clockevents)和动态时钟(dynamic tick)
- LWN 149877: 动态时钟补丁的最新状况
- LWN 145973: HZ 值应该多少合适
- LWN 138969: 动态时钟(dynamic tick)补丁
- LWN 70465: 引入 kgdb 到 2.6
- LWN 120850: 一个新的内核时间管理计时子系统
- LWN 167897: 高精度定时器编程接口
- LWN 156325: ktimers 补丁进展情况
- LWN 152436: 一种实现内核定时器的新方法
- LWN 184750: 一个新的通用中断(IRQ)框架
- LWN 532748: 名字空间实作,第四章:更多有关 PID 名字空间的介绍
- LWN 531114: 名字空间实作,第一章:名字空间(namespaces)概述
- LWN 531419: 名字空间实作,第三章:PID 名字空间
- LWN 531381: 名字空间实作,第二章:名字空间的 API
- LWN 718803: 文件系统的管理接口
- LWN 577961: Btrfs 同多设备协作
- LWN 616859: 设备树动态叠加技术
- LWN 465358: (部分)就绪的 IIO
- LWN 577218: Btrfs 入门
- LWN 357487: 内核峰会 2009: 通用设备树
- LWN 533632: 内核 GPIO 子系统的未来发展方向
- LWN 468759: 引脚控制子系统
- LWN 532714: 内核中的 GPIO 子系统介绍
- LWN 576276: Btrfs文件系统介绍
- LWN 222860: 资源管理编程接口
- LWN 215996: 设备资源管理
- LWN 448502: 平台设备和设备树
- LWN 448499: 平台设备 API