我已经使用 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)
对于任何针对性能进行调整的服务,我认为了解其资源使用的上限是首先调整它的关键,在这种情况下,您知道自己需要多少资源。
我无法想象在很多情况下(有一些,但不是很多),你会暂停一个正在运行的进程,它可以交换来为其他事情腾出空间,但如果你这样做,你仍然会失去你的套接字,所以强制通过 gcc 进行核心转储或手动复制内存在功能上是等效的。
我绝对不想在嵌入式系统上进行交换(即使它可能有较小的可用内存),如果你用完了内存,我宁愿让我的进程死掉,也不愿撕毁每扇区一百万次写入的闪存通过将扇区磨损均衡到核心来驱动一个周末。
任何 Unix 胡须都有令人信服的理由来保持交换吗?
更新答案&&分析:
确认的?- fork() 需要子进程与父进程相同的内存量
现代的 fork() 是写时复制对于使用 POSIX 的儿童(一般来说),但是Linux和自由BSD具体来说,我通过推断假设 OSX。我认为这部分是交换所携带的不合时宜的行李。
奇怪的是,这篇 Solaris 文章声称即使 Solaris 使用带有 fork() 的 Copy-on-Write,您至少应该有2x(!)父进程在可用虚拟内存中的大小,以便 fork() 不会在中间崩溃。而 Solaris 元素有些打破了交换是不合时宜的论点——我认为足够多的操作系统以这样的方式正确地实现了 CoW,消除这个神话比将其标记为交换的进一步理由更重要。自从。面对现实吧。现在真正使用Solaris的人可能只是Oracle的人。无意冒犯索拉里斯!
确认的- 当 tmpfs/ramfs 填满时,tmpfs/ramfs 文件可以方便地进行交换
不要使用无限制的 tmpfs/ramfs!始终明确定义您希望 tmpfs/ramfs 使用的 ram 数量。
合理- 进行一点交换“以防万一”
我的一位前老板曾经有一句名言,“你不知道你不知道什么”——本质上,你不能根据你还不知道的信息做出决定。然而,对于我来说,这是一个合理的交换论据 - 我怀疑您为检测应用程序是否正在交换而执行的操作类型比检查 malloc() 是否成功或捕获异常更重失败的 new()。
当您运行桌面并发生一堆随机事情时,这可能很有用,但即使如此 - 如果出现问题,我宁愿 OOM 收获,也不愿陷入交换地狱。这就是我。
被捕!- 在索拉里斯, 交换是出于以下几个原因很重要
临时文件系统- 状态tmpfs 可用的可用空间量取决于系统中未分配的交换空间量。 tmpfs 文件系统的大小会增长以容纳写入其中的文件,但对于 tmpfs 的大量用户来说,存在一些固有的权衡。 Tmpfs 与执行程序的数据段和堆栈段共享资源。如果 tmpfs 文件系统接近其允许的最大大小,则非常大的程序的执行可能会受到影响。 Tmpfs 可以自由分配除 4MB 之外的所有系统交换空间。
Solaris 关于交换的事实和神话- 状态如今的虚拟内存由物理 RAM 和磁盘上的交换空间的总和组成。 Solaris 根本不需要配置任何交换空间。如果选择此选项,一旦 RAM 已满,您将无法启动新进程。。
我不确定这是否意味着您可以创建的最大虚拟地图是内存+交换,或者如果你仍然可以做类似 mmap() 的事情,一个比 ram 更大的文件并依赖 mmap() 的延迟初始化。虽然现在你可能可以在没有交换的情况下很好地运行 Solaris,但它似乎比它更不友好其他 POSIXy 操作系统。
被捕!流行的 Linux 休眠工具似乎依赖于交换
默认情况下,冰上燕尾服看起来它依赖于休眠交换 - 尽管存在其他后端。然而,如果你没有运行需要休眠的机器,我仍然支持“交换在 Linux 上是不合时宜的”这一说法。
答案1
不要混淆交换(作为磁盘区域)和交换(作为将内存页面从 RAM 移动到磁盘以及相互移动的方法)。
出于性能原因,应该避免过多的交换,但拥有交换区域不一定是问题。
在像Linux这样的系统上,过度使用内存,即允许进程分配比可用内存更多的内存,用完RAM而没有足够的交换空间来处理这种情况将触发OOM杀手。您必须信任用于选择要终止的“正确”进程的算法,并接受一个或多个进程被终止,而没有机会正确关闭。这里有一个著名的比喻这就解释了为什么 OOM 杀手可能根本不是一个好主意。
在像Solaris这样的系统上,不会过度使用内存,即确保内存预留始终由虚拟内存支持,无论是在RAM中还是在磁盘上,拥有足够的交换区域是绝对必要的,否则RAM的潜在重要部分将被占用。浪费了。
答案2
我无法从技术上补充讨论,但我可以举几个例子。我的旧笔记本(2GB RAM kunbuntu lucid)通常在交换为 0 的情况下运行。当我运行传输(bittorrent 客户端)并使用多个 torrent(总共可以使用 100 个连接)时,我的交换可能会大幅上升。当我运行一个使用 1GB 实际内存的 XP 虚拟机时,情况会变得更糟。
我看到其他人评论说图形渲染等内存密集型进程也可能会占用交换空间。如果您只是偶尔这样做,那么这不是问题。
就 OOM 问题而言,交换实际上可以成为救星,因为它可以为您在识别问题和出现问题之间赢得时间。很多事情几乎使用了我所有的内存,所以我没有注意到这一点,但是当交换开始运行时,我注意到了这一点并开始寻找问题 - 在它咬我之前。
答案3
交换空间有一个非常好的应用程序:RAM 扩展,通过将交换空间放置在使用 RAM 的存储设备上,以克服可安装系统 RAM 的限制
看看这个小玩意http://techreport.com/articles.x/16255 它基本上是从 S-ATA 到 DDR2-RAM 的接口。您可以将高达 64GB 的 RAM 装入其中。通过将交换空间放置在其中之一上,您将获得一些重要的额外 RAM。当然,它不如常规系统 RAM 快。但它有点将系统 RAM 变成了一种额外的缓存层。
答案4
在我的系统上,如果 /tmp 占用了太多 RAM,它就会溢出到交换区。
这比使用 /tmp 的真实文件系统要快得多。