如果我使用一些 IO 密集型应用程序(如 Virtualbox、Steam 数据验证甚至dd
),我的系统几乎无响应。尽管所有应用程序都以正常优先级启动,但它们会使桌面非常缓慢,并大大延迟其他应用程序的启动。
我知道我可以使用类似的方法ionice
来将优先级改为空闲,但是在 Virtualbox 产生许多进程的情况下,这会变得困难。
我可以向系统提供某种提示,以便在启动某些特定应用程序时以最低的 IO 优先级启动它们吗?
答案1
注意:此解决方案仅适用于 cfq 调度程序,如前所述这里。您应该通过发出以下命令来检查使用的是哪一个
cat /sys/block/sda/queue/scheduler
和改变如果有必要的话。
如果我理解正确的话,你希望ionice
每次启动命令时都应用一些设置。你可以这样做:
echo 'ionice -c 3 /usr/bin/VirtualBox "$@"' > VirtualBox
chmod a+x VirtualBox
sudo mv VirtualBox /usr/local/bin/
第一个命令创建一个文件VirtualBox
,文件内容为单引号内的文本。该文件应该包含程序的完整路径,因为如果只指定路径,VirtualBox
程序就会将其解释为我们刚刚创建的文件,并创建一个“循环”。
第二条命令使它可执行,第三条命令将这个新文件移动到“系统”bin 文件夹前面的文件夹中/usr/bin
,因此我们的新文件将被执行,而不是原始文件。“$@”部分包含调用命令的所有参数,因此它们将被转发到真正的 VirtualBox 命令。
根据对这个超级用户问题的回答(“是”)子进程是否从其父进程继承 ionice 优先级?如何检查正在运行的进程的 IO 优先级?ionice
,对于父进程来说应该足够了,就像这样:
ionice -c 3 VirtualBox
从ionice
手册页,有以下 I/O 调度类值可用:
- 0 表示无
- 1 表示实时
- 2 表示尽力而为
- 3 表示空闲(用于上例)
可以使用数字或类名。
此外,-n level
该选项适用于实时和尽力而为类别,其中 0-7 作为有效数据(优先级)。
答案2
您可以使用“renice”命令来对进程进行优先排序:
renice -<priority> <application's pid>
也可能是您的驱动器旋转得太慢,因此当您想要启动 Virtualbox 之类的应用程序时,它必须先旋转起来,然后您才能开始工作(这可能需要一段时间)。