如何防止特定程序交换?


23

是否可以防止特定程序(例如rhythmbox及其依赖项)交换到磁盘上?

我问是因为当Chromium占用过多内存时音乐播放器出现打player的问题。有办法解决这个问题吗?在Windows中这不再是问题,因此大概有办法。


假小子也有同样的问题。这是某些人改用GNote的原因之一。
Cristian Ciupitu 2011年

1
我认为打ic问题不一定是交换引起的。如果程序正在播放某些内容,Linux应该注意这一点,而不要交换它。执行不多的程序是第一个被交换的程序。您是否通过检查/ 字段来运行pstop查看rhytmbox是否真的被交换了?我认为您的问题主要是由于排程不当造成的。您应该尝试Rhytmbox进程或更改其某些设置,例如音频缓冲区的大小。RSSRESrenice
Cristian Ciupitu 2011年

1
谢谢!有没有办法设置程序的初始初始值?/ etc / nicetab还是什么?:)
Alexei Averchenko

Answers:


10

我认为打ic问题不一定是交换引起的。如果某个程序正在播放某些内容,Linux应该注意这一点,而不要交换它。执行不多的程序是第一个被交换的程序。您可以通过查看pstop中的RSS/ RES字段来检查程序是否真的被交换了。是常驻集大小,即任务正在使用的未交换物理内存(以千字节为单位)。RSS

我认为您的问题很可能是由于CPU和I / O调度不正确以及Rhythmbox效率低下引起的,从而使它对高系统负载敏感。可以使用nicerenice命令更改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用户身份登录,可以使用susudo

至于事后更改优先级,如果您懒得无法以root用户身份登录来更改它,则可以尝试使用每5分钟运行一次并设置rhythmbox进程优先级的cron作业,但是我不建议您这样做:

#!/bin/sh
renice -n -10 -p `pidof rhythmbox`
ionice -c 1 -n 1 -p `pidof rhythmbox`

5

简短答案:您不能,也不应。

很久以前,可执行文件尊重粘性位+t,该位会告诉内核不要交换,但是今天它被忽略了。

如果内核决定必须交换,则肯定有正当的理由。Linux在内存使用方面非常积极,因为空闲的RAM是浪费的资源。

如果您确实不想交换,获取更多RAM或只是# swapoff -a(不建议这样做,如果您已经遇到问题,可能会使系统无法使用)。

Shouldn't当您正在开发某些应用并且完全不希望交换应用时,它就会消失。看看关于stackoverflow的这篇文章


2
我认为保留约100 MiB不会杀死我的系统。也许还有另一种方法可以解决我的特定问题(请参阅已编辑的问题)?
2011年

1
如果您打算使一个流程比其他流程具有更高的响应速度,那么答案是不错的(您必须是root用户才能这样做)。如果您不想弄脏您的内存,那么不容易进行内存分页(触摸代码,重新编译,甚至LD_PRELOADING一个自定义库来愚弄进程并调整用于分配内存的功能-再次,不建议这样做) 。忠告?降低进程,获取更多RAM或停止打开标签;)
Torian

5
“如果内核决定必须进行交换,则肯定有正当的理由”,这是不正确的。今天,我有1,3G的可用内存。Linux内核将我的httpd进程放入交换区(370M)。
bluszcz 2012年

@bluszcz(嗯,鉴于注释的年代久远,其他人都在阅读此书):这可能是因为它决定了httpd服务的文件的磁盘缓存比httpd本身很少使用的部分更为重要-请参阅其他答案提到“幸福感”。
Jan Schejbal

@JanSchejbal多数民众赞成是因为linux,至少在没有人告诉它的情况下,不知道哪些进程很重要。在服务器环境中,您应该能够告诉系统哪些进程很重要,哪些不重要。“我不在乎其他事情,但是这些过程对于此服务器的运行而言是最重要的”
Rahly


3

有几种方法可以做到这一点。您可以尝试尝试“说”,以减少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


1
这会全局影响交换,而不是特定于过程。
洛伦佐·冯·马特洪峰

1
是的,您可能已经注意到我写的“(通常)”。每个进程的选项是使用cgroups到其他答案的链接。
ceinmart

那没有帮助,是吗?
肯·夏普

肯·夏普(Ken Sharp):这个答案是唯一直接链接到(至少乍看之下)看起来是解决问题的最佳方法的链接。所以...与您所说的完全相反。
菲尔斯(Phils)

@phils您不知道它是如何工作的。
肯·夏普

0

您可以使用mlockall()syscall。mlockall()强制驻留内存进程(=不进行交换,不进行过量使用等)。AFAIK,没有外壳程序命令可以执行此操作,但是很容易创建一个。它看起来像:

if (mlockall(MCL_FUTURE | MCL_CURRENT))
     perror("mlockall");
execvp(argv[0], argv);

注意,您必须是root才能调用mlockall()

但是,正如其他答案所述,我认为这并不是您真正想要的。


1
该代码根本不起作用,因为execvp是execve的前端,它撤消了mlockall。请参见mlock手册页上的“注释”部分。
Johannes Matokic
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.