是否可以防止特定程序(例如rhythmbox及其依赖项)交换到磁盘上?
我问是因为当Chromium占用过多内存时音乐播放器出现打player的问题。有办法解决这个问题吗?在Windows中这不再是问题,因此大概有办法。
ps或top查看rhytmbox是否真的被交换了?我认为您的问题主要是由于排程不当造成的。您应该尝试Rhytmbox进程或更改其某些设置,例如音频缓冲区的大小。RSSRESrenice
是否可以防止特定程序(例如rhythmbox及其依赖项)交换到磁盘上?
我问是因为当Chromium占用过多内存时音乐播放器出现打player的问题。有办法解决这个问题吗?在Windows中这不再是问题,因此大概有办法。
ps或top查看rhytmbox是否真的被交换了?我认为您的问题主要是由于排程不当造成的。您应该尝试Rhytmbox进程或更改其某些设置,例如音频缓冲区的大小。RSSRESrenice
Answers:
我认为打ic问题不一定是交换引起的。如果某个程序正在播放某些内容,Linux应该注意这一点,而不要交换它。执行不多的程序是第一个被交换的程序。您可以通过查看ps或top中的RSS/ RES字段来检查程序是否真的被交换了。是常驻集大小,即任务正在使用的未交换物理内存(以千字节为单位)。RSS
我认为您的问题很可能是由于CPU和I / O调度不正确以及Rhythmbox效率低下引起的,从而使它对高系统负载敏感。可以使用nice和renice命令更改CPU优先级。可以使用ionice命令更改I / O优先级。只有超级用户可以使用高优先级。您还应该知道,Linux内核专家正在尝试通过各种低延迟补丁来提高台式机系统的响应能力,因此您可以考虑使用它们。其中之一是迈克·加尔布雷思(Mike Galbraith)撰写的大约200行的补丁,甚至给Linus留下了深刻的印象。此修补程序的替代方法是Lennart Poettering的cgroup技巧 我认为这将是Fedora 15中的默认设置。
无论如何,如果没有这些修补程序,则有两个选项:以高优先级启动程序或之后更改程序。对于第一个选项,您可以在Rhythmbox周围使用包装器脚本:
#!/bin/sh
# Run Rhytmbox with high CPU and I/O priorities
nice -n -10 ionice -c 1 -n 1 su -l -c rhythmbox alexei
您将需要以root身份运行。如果您不想仅以root用户身份登录,可以使用su或sudo。
至于事后更改优先级,如果您懒得无法以root用户身份登录来更改它,则可以尝试使用每5分钟运行一次并设置rhythmbox进程优先级的cron作业,但是我不建议您这样做:
#!/bin/sh
renice -n -10 -p `pidof rhythmbox`
ionice -c 1 -n 1 -p `pidof rhythmbox`
简短答案:您不能,也不应。
很久以前,可执行文件尊重粘性位+t,该位会告诉内核不要交换,但是今天它被忽略了。
如果内核决定必须交换,则肯定有正当的理由。Linux在内存使用方面非常积极,因为空闲的RAM是浪费的资源。
如果您确实不想交换,获取更多RAM或只是# swapoff -a(不建议这样做,如果您已经遇到问题,可能会使系统无法使用)。
Shouldn't当您正在开发某些应用并且完全不希望交换应用时,它就会消失。看看关于stackoverflow的这篇文章。
这似乎已经在这里得到回答:
/programming/578137/can-i-tell-linux-not-to-swap-out-a-particular-processes-memory
虽然共识是您可能不应该:/
有几种方法可以做到这一点。您可以尝试尝试“说”,以减少Linux 与swap的配合(通常):
echo 10 > /proc/sys/vm/swappiness
来自:https : //www.kernel.org/doc/Documentation/sysctl/vm.txt
交换性
该控件用于定义内核将交换内存页面的积极程度。较高的值将增加攻击性,较低的值将减少交换量。
默认值为60。
另一个选择是使用cgroups内核管理器,这是针对每个进程的,但是您将需要做一些“工作”:在这里回答:https ://unix.stackexchange.com/questions/10214/per-process-swapiness-for -linux#10227
您可以使用mlockall()syscall。mlockall()强制驻留内存进程(=不进行交换,不进行过量使用等)。AFAIK,没有外壳程序命令可以执行此操作,但是很容易创建一个。它看起来像:
if (mlockall(MCL_FUTURE | MCL_CURRENT))
perror("mlockall");
execvp(argv[0], argv);
注意,您必须是root才能调用mlockall()。
但是,正如其他答案所述,我认为这并不是您真正想要的。