我在 Ubuntu 11.10 和 Debian Wheezy 中都遇到了这个严重的性能问题:
如果一个进程占用了大量的 RAM(比如说,3900 MB 中 3700 MB),系统很快就会变得不可用,磁盘会不断抖动。它会达到窗口管理器不响应的程度,并且终止有问题的进程需要几分钟。(实际上是进入终端,发出 pkill,等待一段时间直到信号真正通过)
即使交换分区被完全禁用,也会出现此问题。
使用 iotop 进行调查后发现,大部分磁盘活动都是磁盘读取,转到 Google Chrome 和 X 窗口渲染器等进程。然而,这只是有限的信息,因为当系统处于全崩溃模式时,iotop 不再更新。
我的问题是:
1) 是什么原因导致大量磁盘读取? 2) 如何防止这种情况导致系统无法使用?
答案1
系统正在将 RAM 中的数据移入和移出硬盘,以便为 RAM 中的其他数据腾出空间。磁盘操作比 RAM 操作慢得多,导致系统速度明显变慢。当系统的物理内存不足时,系统会这样做以扩大可用的“虚拟”内存量,但会以牺牲性能为代价。这种情况称为鞭笞。
不幸的是,解决这个问题的唯一办法就是增加更多的 RAM。内存模块相对便宜;如果您不断达到可用物理内存的极限,则应该为计算机添加内存。
编辑:由于系统的物理内存不足,程序需要更频繁地从硬盘读取数据,因为 RAM 中的可用空间通常用于存储频繁或最近访问的文件,以减少磁盘读取。如果可用 RAM 较少,则可以缓存的文件较少,从而降低性能。对于 Chrome 等内存和 I/O 密集型应用程序尤其如此。再次强调,增加 RAM 可以提高性能。有关缓存的更多信息,请参阅维基百科文章。
答案2
如果导致问题的是已知进程,则可以使用以下方法限制它们,ulimit
例如,像这样编写应用程序启动器的脚本:
#!/bin/bash
ulimit -v 1048576
/usr/bin/greedyapp
在出现内存不足错误之前,您的应用只能获得 1 GiB 的虚拟内存。我已经在浏览器中尝试过,当达到限制时,它可以有效地保护您的 RAM,而不会立即关闭浏览器。但应用程序可能会出现奇怪的行为(例如停止响应用户输入),因此您可以先尝试使用非常严格的限制,看看它在内存不足时会做什么。不过,这比那些硬盘垃圾要好得多。
请注意,这ulimit
只会影响调用进程及其子进程,为该分支的所有进程设置限制。我不建议将其放入会话脚本中。
答案3
DragonLord 是正确的,问题在于操作系统不喜欢您使用过多的 RAM。您越接近 RAM 的最大值,系统就会进入开始使用虚拟内存的状态。在这种状态下,硬盘越快,计算机的速度就越快,但是您从中获得的性能是有限的。需要更多的 RAM 才能阻止这种情况发生。
显然,您已经意识到问题仅在使用某些程序时出现,其中一些程序是您创建的。根据提供的信息,可以合理地假设您的问题出在 RAM 上。