我需要convert
同时运行大量图像。该命令耗费了相当长的时间,但这并不困扰我。
问题是,该命令运行时(大约 15 分钟)导致我的计算机无法使用。
那么,是否可以直接从命令行限制命令的资源(处理器和内存)来限制命令?这只有在我添加一些内容时才有效到同一行按下之前,Enter因为一旦我启动该过程,计算机就会变得非常慢,以至于不可能例如切换到“系统监视器”并降低优先级。
编辑:top 和 iotop 结果
我设法在执行其中一个转换操作时运行了top
它sudo iotop >iotop.txt
。(生成的 iotop.txt 文件难以读取)
排名前列的结果:
PID 用户 PR NI VIRT RES SHR S %CPU %MEM TIME+ 命令 14275 用户名 20 0 4043m 3.0g 1448 D 7.0 80.4 0:16.45 转换
iotop的结果:
[?1049h[1;24r(B[m[4l[?7h[?1h=[39;49m[?25l[39;49m(B[m[H[2J磁盘总读取速度:1269.04 K/s | 磁盘总写入速度:[59G0.00 B/s (B[0;7m TID PRIO 用户磁盘读取磁盘写入 SWAPIN(B[0;1;7m IO>(B[0;7m 命令 [3;2H(B[m2516 be/4 用户名 350.08 K/s 0.00 B/s 0.00 % 0.00 % zeitgeist-datahub 7394 be/4 用户名 568.88 K/s 0.00 B/s 77.41 % 0.00 % --rendere~.530483991[5;1H14275 空闲用户名 350.08 K/s 0.00 B/s 37.49 % 0.00 % 转换 S~f test.pdf[6;2H2048 be/4 root[6;24H0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/3:2] [5G1 be/4 root[7;24H0.00 B/s 0.00 B/s 0.00 % 0.00 % 初始化
此外,即使该过程结束后,计算机也不会恢复到之前的性能。我找到了一种解决方法,即sudo swapoff -a
运行sudo swapon -a
答案1
man nice
,并且如果您需要 I/O 限制man ionice
。
我们来看一些简单的例子。
限制 CPU 使用率:
you@box:/$ nice -n 10 /usr/bin/convert blah.gif blah.jpg
但是,从您的描述来看,CPU 使用率几乎肯定不是您真正的问题。更可能的是,您遇到了严重的 I/O 争用。
限制磁盘使用量:
you@box:/$ ionice -c2 -n7 /usr/bin/convert blah.gif blah.jpg
-c2
是“尽力而为”,并且-n7
是最低的“尽力而为”优先级。因此,这将限制该作业的 I/O 优先级低于系统中的大多数其他任务。
you@box:/$ ionice -c3 /usr/bin/convert blah.gif blah.jpg
-c3
(无需优先级)表示“仅空闲”。设置为-c3
仅占用空闲磁盘调度时间的作业几乎不会对系统产生任何影响 - 但可能会相当您的作业的执行时间会更长,具体取决于系统其余部分的繁忙程度。
答案2
哦,天哪,我刚刚看到了这个...引用 OP 的话:
此外,即使该过程结束后,计算机也不会恢复到之前的性能。我找到了一种解决方法,即
sudo swapoff -a
运行sudo swapon -a
好的,这意味着您耗尽了系统上的可用 RAM,这意味着您只是试图convert
同时运行太多进程。我们需要查看您在 spawning 中的实际语法convert
才能提供建议,但基本上,您需要确保不要尝试打开比 RAM 能够轻松处理的更多的同时进程。
既然你说这是由 引起的convert *.tif blah.pdf
,那么发生的事情是每个 TIF 的内容及其转换为 PDF 的内容都被一次性塞入 RAM。你需要做的是将工作分开,这样就没有必要这样做了。一种可能性是,改为执行类似 的操作find . -iname '*.tif' | xargs -I% convert % %.pdf
,然后使用pdftk
或类似的东西将所有单独的 pdf 粘合在一起。如果你真的如果你想变得花哨,并且你有一个多核 CPU,这也让你有机会编写一个小脚本来批量运行转换n, 在哪里n是您的核心数量,并且可以更快地完成整个任务。:)
pdftk 使用方法:http://ubuntuhowtos.com/howtos/merge_pdf_files (基本上可以归结为sudo apt-get install pdftk; pdftk *.pdf cat output merged.pdf
)
答案3
这是一篇关于使用程序来cpulimit
限制任何进程的 CPU 使用率的非常好的文章:
http://maketecheasier.com/limit-cpu-usage-of-any-process-in-linux/2010/09/22
问题就像您说的,convert
在进程启动后找到其 PID。
启动后,convert
如果您仍然可以在终端中输入命令,则可以运行ps aux | grep convert
以找到它的 PID,然后sudo cpulimit -p PID -l CPU%
开始节流。
或者,如果启动时convert
终端被锁定,本文将向您展示如何作为后台守护进程运行cpulimit
,该守护进程将自动监视和限制超过一定 CPU 使用率的任何进程。祝您好运!