到目前为止,我测试过的所有 GNU/Linux 发行版都存在这样的问题:每当 RAM 写满并且系统开始交换时,整个桌面和图形用户界面就会变得反应迟钝,有时我必须在移动物理鼠标后等待大约 5-10 秒,直到鼠标指针真正移动。
这是一种令人讨厌的行为,尤其是在内存较低的系统上。
有没有什么办法可以让某些应用程序/作业(例如桌面环境等)比其他应用程序具有更高的优先级,使其留在内存中,以便实际占用所有内存的应用程序在桌面环境等之前进行交换?
编辑: 我说的是当整个 RAM 都被使用时的情况,因此如果未禁用,它将始终开始交换(我不希望进程被随机终止)。我不仅在低 RAM 环境中遇到此问题,而且在我的台式机上 8GiB RAM 时也遇到此问题,部分原因是许多虚拟机,部分原因是内存泄漏。ZRAM 也不是解决方案,因为它只是延迟了问题。我能想到的解决此问题的唯一方法是使用一些用户空间实用程序或内核 API,它们可以完全阻止某些作业被交换,或者至少使其不太可能被交换。有人知道其他解决方案或知道有关现有或正在计划中的此类工具或 API 的信息吗?
第二次编辑: 透過根据https://aur.archlinux.org/packages/ulatencyd-git/和https://wiki.archlinux.org/index.php/Ulatencyd。如果我理解正确的话,这可能是因为 systemd 从用户空间角度接管了 cgroups 的完全控制权。
答案1
据我所知,这不是 Linux 独有的问题,而是 SWAP(或虚拟内存)的工作方式。如果操作系统需要在硬盘而不是 RAM 中查找数据,它就会变慢。你对此无能为力,访问磁盘比访问 RAM 慢得多。
您将无法设置进程交换的优先级,这是由内核决定的,它将尝试最大化效率,您将无法做得更好。你能要做的是设置进程的 CPU 优先级,这可能会有所帮助。由于从/向 SWAP 读取所需的时间,您的系统速度被降低,这意味着 CPU 必须等待请求它的进程检索相关数据才能继续。如果您将 DE 设置为具有更高的 CPU 访问优先级,这应该会将其操作推到顶部并加快速度。
nice
因此,使用和命令设置 CPU 优先级renice
:
Renice alters the scheduling priority of one or more running processes.
The following who parameters are interpreted as process ID's, process
group ID's, or user names. Renice'ing a process group causes all pro‐
cesses in the process group to have their scheduling priority altered.
Renice'ing a user causes all processes owned by the user to have their
scheduling priority altered. By default, the processes to be affected
are specified by their process ID's.
优先级从 -20(最高优先级)到 20(最低优先级)。要更改正在运行的进程的优先级,您可以执行以下操作:
renice -15 $PID
哪儿$PID
是PID您要提高其优先级的进程。您可以使用pgrep
来找出是哪一个。例如:
renice -15 $(pgrep gnome-session)
另一个选项是设置系统的‘交换性’它决定了何时开始交换。swappiness 值为 1 表示它只会交换以避免内存不足错误。更高的值意味着即使仍有可用的物理内存,它也会开始交换。您可以将其设置为相对较低的值,以使您的系统交换尽可能少。将此行添加到/etc/sysctl.conf
:
vm.swappiness=1
注意:如果您没有很多 RAM,这不是一个好主意,交换通常是一件好事,您需要稍微调整一下这些值以找到适合您系统的平衡点。