交换时增加Linux上的桌面响应能力


15

到目前为止,我测试过的所有GNU / Linux发行版都存在一个问题,即当填满ram且系统开始交换时,整个桌面和图形用户界面都变得无响应,以至于有时我不得不等待大约5-10秒移动了物理鼠标,直到鼠标指针实际移动为止。

这是一种令人讨厌的行为,尤其是在低内存的系统上。

有什么方法可以赋予某些应用程序/作业(例如桌面环境等)比其他应用程序更高的优先级,使其在ram中停留,从而使实际占用所有内存的应用程序在桌面环境等之前被交换?

编辑: 我说的是使用整个RAM的情况,因此如果未禁用它,它将始终开始交换(我不希望进程被随机杀死)。我不仅在低内存环境中遇到此问题,在台式机上还存在内存8GiB的问题,部分原因是由于许多虚拟机,部分原因是内存泄漏。ZRAM也不是解决方案,因为它只会延迟问题。对于这个问题,我能想到的唯一解决方案是某些用户空间实用程序或内核API,该实用程序或内核API可以防止某些作业完全被交换,或者至少使其变得不太可能。是否有人知道其他解决方案或对现有或正在计划中的此类工具或API有所了解?

第2次编辑: 根据https://aur.archlinux.org/packages/ulatencyd-git/https://wiki.archlinux.org/index.php/Ulatencyd的说法,ulatencyd似乎不适用于较新版本的systemd 。这可能是因为,如果我正确理解的话,systemd从用户空间的角度接管了cgroup的完全控制权。


3
cgroups(如果启用了内存cgroup)并启用了交换记帐(cgroup_enable=memory swapaccount=1在内核命令行上;请注意,这会降低性能成本)。示例实现:ulatencyd
derobert 2013年

@derobert太好了,这似乎正是我在寻找的东西。我一有时间就会开始尝试这个。
FSMaxB 2013年

太棒了,有能力甚至还提供了AUR软件包,我很幸运成为Archlinux用户。
FSMaxB 2013年


如果我可以投票,我会更喜欢这个Q!真的没有直接的方法可以告诉GUI和很少的关键程序留在RAM中,从而使其保持响应状态吗?我的意思是,给Linux用户提供此选项的最坏情况是什么?电脑死机了?之前还没有做过?:)我的意思是有时,由于无法正确添加(RAM编号),我不小心启动了太多的VM,然后将状态恢复到永远需要永久。告诉GUI甚至终端将其保留在RAM中将解决此问题吗?拜托,有人回答这个!
达蒙

Answers:


1

据我所知,这不是Linux特有的问题,而是SWAP(或虚拟内存)工作的方式。如果操作系统需要在硬盘驱动器(而不是RAM)中查找数据,则会降低速度。您无能为力,访问磁盘比访问RAM慢得多。

您将无法设置进程交换的优先级,而该优先级是由内核决定的,它将尝试使效率最大化,您将无法做得更好。您可以做的是设置进程的CPU优先级,这可能会有所帮助。由于从SWAP读取数据或从SWAP读取数据需要花费时间,因此这使系统处于低速运行状态,这意味着CPU必须等待请求进程检索相关数据,然后才能继续。如果将DE设置为具有较高的CPU访问优先级,则应该将其操作推至最高位置并加快速度。

因此,使用nicerenice命令设置CPU优先级:

 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

您要增加其优先级的进程$PIDPID在哪里。您可以使用pgrep找出哪个。例如:

renice -15 $(pgrep gnome-session)

另一个选择是设置系统的“ swappiness”,以决定何时开始交换。swappiness值为1意味着它将仅进行交换以避免内存不足错误。较高的值表示即使仍有可用的物理内存,它也会开始交换。您可以将此值设置为相对较低的值,以使系统交换尽可能少。将此行添加到/etc/sysctl.conf

vm.swappiness=1

小心:如果您没有太多的RAM,那不是一个好主意,swap通常是一件好事,您需要多花一点时间才能找到合适的系统平衡。


如您所言,这可以在内核空间中解决,这意味着它非常适合Linux。更改可交换性不会更改任何内容,因为在使用整个RAM时,系统仍会进行交换。而且,进程的优先级不会改变它的内存管理,但是只有cpu调度程序的行为和cpu时间对加速磁盘访问并没有真正的帮助。
FSMaxB 2013年

@FSMaxB CPU优先级可能会有所帮助,因为它将优先级DE,如果DE本身在交换,它将无济于事,但是如果有其他原因在阻塞CPU,从而降低计算机速度,它将没有帮助。
terdon 2013年

当DE空闲一段时间后,以我的经验,当内存用完时,DE总是会被交换。
FSMaxB 2013年

@FSMaxB是的,这很有意义,因为DE是内存消耗。不过,增加其优先级可能会有所帮助,至少调度程序不会阻止它。
terdon 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.