我已经思考这个问题很长时间了,我想我可以尝试在这里问一下。
设想:
我使用了一个占用大量资源的应用程序(例如图像批处理或编译/运行大量应用程序)
关闭占用大量资源的应用程序
Ubuntu 的速度仍然比启动资源密集型应用程序之前慢得多*
* 我的意思是,“top”表示 CPU 使用率低,直到我做了一些事情(比如打开一个标签或其他事情)并且我的 CPU 使用率立即飙升。我在我拥有的多个 Ubuntu 机器上注意到了这一点。
我发现唯一的解决办法就是重启。这背后的原因是什么?
编辑:关于我的笔记本电脑的更多信息:Dell Studio 1558、Intel i5、8GB DDR3 Ram、7200 rpm HDD
答案1
这确实是一种典型情况,最可能的原因是内存交换。查看内存使用情况。
您的资源密集型任务 A 可能已占用大量 RAM。因此,另一个应用程序 B 已交换到磁盘。CPU 可以快速将其上下文从 A 切换回 B,退出 A 后您不会感觉到 CPU 负载造成的任何延迟。但是,应用程序 B 不再完全占用物理 RAM。因此,A 中的琐碎任务可能需要将应用程序 A 使用的内存加载回物理 RAM。
由于 Linux 通常使用内存来缓存磁盘 I/O,因此当资源密集型任务从 HDD 读取和写入许多/大文件时,也会发生类似的情况。(这意味着,任务 A 将在文件提交到物理 HDD 之前退出。缓慢的写入过程被延迟,直到 Linux 需要为其他应用程序释放内存。)
这两个过程(交换和磁盘缓存)都是 I/O 密集型的(受限于 HDD 读写速率,而不是 CPU)。但是,它们可能会导致一定的计算开销。
理论上,退出 A 一段时间后,应用程序 B 应该会自动恢复正常速度。重新启动应用程序 B 可能比重新启动更有帮助。
答案2
造成这种情况的原因可能有几个。如果您使用的是单核处理器且 RAM 相对较低,则更有可能发生这种情况。
可能发生的情况是:
- 当 RAM 超载时,您的系统开始使用交换,在您关闭重型应用程序之前,它可能会出现“抖动”(将 RAM 转储到磁盘),然后很难恢复。
- 您可能正在经历高水平的 I/O 等待(处理器等待响应)。
- 您退出的繁重应用程序将被清理。最好的办法是让系统休息一会儿 - 然后等待它恢复。
答案3
如果您的系统交换过于频繁,调整该swappiness
值可能会有所帮助。如果您实际上内存不足并且内核被迫进行交换,则调整该值不会有帮助,但是如果您有足够的内存并且内核开始不必要地进行交换,则调整该值可能会有帮助。
看Ubuntu SwapFaq. 摘录如下:
swappiness 参数控制内核将进程从物理内存移出并移至交换磁盘的趋势。由于磁盘比 RAM 慢得多,因此如果进程过于频繁地移出内存,这会导致系统和应用程序的响应时间变慢。
- swappiness 的值可以在 0 到 100 之间
- swappiness=0 告诉内核尽可能避免将进程交换出物理内存
- swappiness=100 告诉内核积极地将进程从物理内存中交换出来,并将其移至交换缓存
Ubuntu 中的默认设置是 swappiness=60。降低 swappiness 的默认值可能会提高典型 Ubuntu 桌面安装的整体性能。建议使用 swappiness=10,但您可以随意尝试。注意:Ubuntu 服务器安装与桌面系统的性能要求不同,默认值 60 可能更合适。
答案4
关于消耗所有内存,有一个类似的问题这里。
正如有人回答的那样,
看来,一旦 Ubuntu 开始使用交换,即使操作完成后它也不会轻易释放 RAM。
要强制系统将交换分区中的所有内容释放回内存,有许多类似的答案可以做到这一点:
- 磁盘操作消耗所有内存 - 询问 Ubuntu
- 可以使用什么命令强制将交换分区中的所有内容释放回内存? - Unix & Linux Stack Exchange
- 永久关闭交换是否安全? - 询问 Ubuntu
根据以上答案,您可以通过以下方式清除交换:
sudo swapoff -a
sudo swapon -a
这将禁用交换,在此期间交换中的任何内容都会转移到 RAM 中,然后重新启用它。计算机的性能现在应该恢复正常了。
有关swapoff
和 的更多信息swapon
,请参见以下链接中的手册页: