我使用 unix 已经有一段时间了,在过去的几年里,我觉得交换是一个时代错误,但我很好奇其他人的想法。
我的论点大致是这样的(假设没有全局 ulimit 或 OOM 设置的摆弄):
There is little value in swap because if you need to swap out to disk,
odds are it's going to be a vicious cycle where an app will continue
to eat not only real memory, but swap as well until it gets OOM
reaped (_if_ it gets OOM reaped).
If you have swap enabled, it will only prolong this death march to
the detriment of other processes - and in the worst case where the
process is not OOM reaped in a timely manner, grind the system to
a halt.
Without swap, it will probably get OOM reaped sooner (if at all)
Run Code Online (Sandbox Code Playgroud)
对于任何针对性能进行调整的服务,我认为首先了解其资源使用的上限是调整它的关键,在这种情况下,您知道需要多少。
我无法想象在很多情况下(一些,但不是很多),您会暂停正在运行的进程并且它可以交换出来为其他事情腾出空间,但是如果这样做,您仍然会丢失套接字,因此强制执行通过 gcc 进行核心转储或手动复制内存在功能上是等效的。
我绝对不希望在嵌入式系统上进行交换(即使它可能有较小的可用内存),如果你的内存用完了,我宁愿让我的进程死掉而不是撕毁每扇区百万次写入的闪存通过将扇区磨损均衡到小块来度过一个周末。
任何unix-beards有什么令人信服的理由来保持交换?
更新答案&分析:
确认的?- fork() 需要与父进程相同的子进程内存量
现代 fork() 是针对 POSIX上的儿童的写时复制(一般而言),但特别是Linux和FreeBSD,我假设是 OSX 外推。我认为这是交换随身携带的过时行李的一部分。
奇怪的是,这篇 Solaris 文章声称,即使 Solaris 使用带有 fork() 的 Copy-on-Write,您也应该在可用虚拟内存中至少有2倍(!)父进程大小,以便 fork() 不会在中间。虽然 Solaris 元素在某种程度上推翻了交换是不合时宜的论点 - 我认为足够多的操作系统正确地实现了 CoW,因此消除神话比将其标记为交换的进一步理由更重要。自从。面对现实吧。在这一点上,实际使用 Solaris 的人可能只是 Oracle 人员。没有冒犯Solaris!
已确认- tmpfs/ramfs 文件可以在 tmpfs/ramfs 填满时方便地交换
不要使用无限制的 tmpfs/ramfs!始终明确定义您希望 tmpfs/ramfs 使用的 ram 数量。
PLAUSABLE - 有一点交换“以防万一”
我的一位老老板曾经说过一句好话,“你不知道你不知道什么”——本质上,你不能根据你还没有的信息做出决定。然而,这对我来说是交换的一个合理的论点 - 我怀疑您为检测应用程序是否换出而要做的事情类型比检查 malloc() 是否成功或从失败的 new()。
这在您运行桌面并有一堆随机事情发生的情况下可能很有用,但即使如此 - 如果出现问题,我宁愿它是 OOM 收获而不是潜入交换地狱。这就是我。
击破!- 在Solaris 上,swap很重要有几个原因
tmpfs - 状态tmpfs可用的可用空间量取决于系统中未分配的交换空间量。tmpfs 文件系统的大小会增加以容纳写入其中的文件,但对于 tmpfs 的重度用户来说,存在一些固有的权衡。Tmpfs 与执行程序的数据和堆栈段共享资源。如果 tmpfs 文件系统接近其允许的最大大小,则非常大的程序的执行可能会受到影响。Tmpfs 可以自由分配除 4MB 之外的所有系统交换空间。
Solaris 关于交换的事实和神话- 状态今天的虚拟内存包括物理 RAM 和磁盘上交换空间的总和。Solaris 根本不需要配置任何交换空间。如果选择此选项,一旦 RAM 已满,您将无法启动新进程。.
我不确定这是否意味着您可以创建的最大虚拟地图是ram+swap,或者您是否仍然可以执行诸如 mmap() 之类的比 ram 大的文件并依赖 mmap() 的延迟初始化.. 而您这些天可以在没有交换的情况下很好地运行 Solaris,它似乎不像其他 POSIXy 操作系统那样友好。
击破!流行的 Linux 休眠工具似乎依赖于交换
默认情况下,TuxOnIce看起来像是依赖交换来休眠——尽管存在其他后端。但是,如果您没有运行需要休眠的机器,我仍然会支持“交换在 linux 上是不合时宜的”这一说法
jll*_*gre 30
不要混淆(the)swap(作为磁盘区域)和(to)swap(作为一种将内存页面从RAM移动到磁盘并相互移动的方法)。
出于性能原因,应避免过度交换,但拥有交换区不一定是问题。
在像 Linux 这样的系统上,过度使用内存,即允许进程分配比可用内存更多的内存,用完 RAM 而没有足够的交换来处理这种情况将触发 OOM 杀手。您必须信任用于选择要终止的“正确”进程的算法,并接受一个或多个要终止的进程而没有机会正确关闭。这是一个著名的类比,解释了为什么 OOM 杀手可能根本不是一个好主意。
在像 Solaris 这样的系统上,不会过度使用内存,即确保内存预留总是由虚拟内存支持,无论是在 RAM 中还是在磁盘上,拥有足够的交换区是绝对必要的,否则 RAM 的潜在重要部分将被浪费了。
从技术上讲,我无法添加到讨论中,但我可以举几个例子。我的旧笔记本(2GB RAM kunbuntu lucid)通常以 0 的交换运行。当我使用可以共同使用 100 个连接的大量种子运行传输(bittorrent 客户端)时,我的交换可以上升。当我运行使用 1GB 实内存的 XP 虚拟机时,情况会变得更糟。
我看到其他人评论说图形渲染等内存密集型进程也可以进入交换。如果你只是偶尔这样做,那么这不是问题。
就 OOM 问题而言,交换实际上可以成为救星,因为它可以在确定问题和事情恶化之间为您争取时间。很多事情几乎占用了我所有的记忆,所以我没有注意到这一点,但是当交换开始运行时,我注意到这一点并开始寻找问题 - 在它咬我之前。
有一个非常好的交换空间应用程序:通过将交换空间放在使用 RAM 的存储设备上来扩展 RAM,以克服可安装系统 RAM 的限制
看看这个小工具http://techreport.com/articles.x/16255 它基本上是从 S-ATA 到 DDR2-RAM 的接口。您最多可以将 64GB 的 RAM 装入其中。通过在其中之一上放置交换空间,您将获得一些重要的额外 RAM。当然,它不如常规系统 RAM 快。但它有点将系统 RAM 变成了一种额外的缓存层。