限制特定进程的 I/O 活动 - Linux

限制特定进程的 I/O 活动 - Linux

convert *.tif bla.pdf有时会运行一个包含 60 张图片的命令。现在,这会导致我的计算机无法使用,直到它完成为止。

我尝试使用niceionice但没有太大帮助。

有没有办法将资源(磁盘读/写,也许还有 CPU)限制到转换命令?

答案1

实际上,问题在于所有 tiff 文件都同时加载到 RAM 中。问题与 CPU 使用率无关,也与磁盘的读写操作无关(好吧,有点类似)。问题在于 RAM(4Gb)已满,然后使用了交换空间。

所以,正如某人所建议的我将这个过程分为两个步骤。

  1. find . -iname '*.tif' | xargs -I% convert % %.pdf分别转换每幅图像
  2. pdftk *.pdf cat output merged.pdf && rm *.tif.pdf合并 pdf 文件并删除单个 pdf。

总体来说速度比较快,而且电脑没有被堵塞。

答案2

尝试安装并使用“cpulimit”。我认为此类进程(convert/imagemagick 批处理)的不利影响更可能是由于 CPU 负载而不是 I/O,至少这是我的印象。我不确定 RAM;实际上我不确定 convert 是否会一次性将所有内容加载到 RAM 中。例如,即使您使用 imagemagick 转换 PDF,它也会首先使用 gs 并逐页提取,然后将 /tmp 上的 PGN 页面转换为您在 imagimagick/convert 上给出的任何规范和格式(但另一方面,这是“相反的做法”,从 PDF 中提取图像而不是生成 PDF,所以我不知道)。

我有印象cpulimit 对于长期存在的进程或给定进程的“内生”批处理进程更有效(例如 imagemagick 所做的任何事情),但它在处理 bash 循环中重复调用的某些内容时效果不佳(除非它在脚本上,并且 cpulimit 是限制该脚本的 CPU 使用率的问题)。为了减少重复运行进程的 CPU 负载,我认为最好的方法是在循环内添加一些任意延迟(睡眠)(它可以以某种方式自适应,例如通过从“top”之类的东西中获得的某个数字来调节睡眠时间,或者最好是其他一些不太占用 CPU 的东西(/proc/stat 上的某个东西?),指示 CPU 使用率)。

相关内容