0

我想自动限制一些(imagemagick 图像处理)批处理作业在单个逻辑处理器上的后台运行,以尽量减少对其他实时应用程序性能的影响。

我拼凑起来的方法是使用命令行参数作为标志。当批处理文件首次启动时没有命令行参数(也没有关联),它将再次启动自身,并将关联设置为最后一个逻辑处理器,添加一个虚拟参数以指示关联已设置并继续执行主体批处理作业:

REM START OF THISBATCHFILE.CMD
IF NOT [%1]==[] GOTO AFFINITY_SET
SET LAST_PROCESSOR=1
FOR /L %%I IN (2,1,%NUMBER_OF_PROCESSORS%) DO SET /A LAST_PROCESSOR*=2
PROCESSOR = %LAST_PROCESSOR%
START /B /AFFINITY %LAST_PROCESSOR% THISBATCHFILE.CMD DUMMY_ARGUMENT
EXIT 0
:AFFINITY_SET

REM Batch Job Starts Here
REM ImageMagick command 1
REM ImageMagick command 2
REM ...
REM ImageMagick command N
REM Batch Job Ends Here
EXIT 0

这似乎在我的 4 核 Win8.1 系统上运行良好,可以将批处理作业限制在最后一个(第 4 个)逻辑处理器上。我的问题是 - 有没有“更好”的方法来做到这一点?

4

1 回答 1

0

您可以通过 3 种不同的方式控制 ImageMagick 使用的资源……在您启动进程时通过命令行、通过环境变量和通过配置文件。对于您的用例,我建议您使用环境变量,这比更改每次调用更容易,convert并且比编辑系统配置文件更灵活,无论您的实时应用程序是否正在运行,都会始终限制 ImageMagick。

您可以通过运行以下命令查看可以更改的资源及其当前值:

identify -list resource

输出

Resource limits:
  Width: 214.7MP
  Height: 214.7MP
  Area: 17.18GP
  Memory: 8GiB
  Map: 16GiB
  Disk: unlimited
  File: 192
  Thread: 1
  Throttle: 0
  Time: unlimited

我怀疑您可能希望减少线程数(并行性)并设置少量时间来偶尔放弃 CPU。您还可以更改 ImageMagick 允许使用的内存。

所以,具体来说,我会尝试在一堆 ImageMagick 命令之前设置限制:

...
...
SET MAGICK_THREAD_LIMIT=1
SET MAGICK_THROTTLE=50

REM Batch Job Starts Here
REM ImageMagick command 1
REM ImageMagick command 2
REM ...

或者,您可以在每次调用时指定限制,convert如下所示:

convert -limit thread 1 input.png ... <processing> ... output.png

如果您查看我的初始限制列表中的文件数,您会发现它是192. 2我可以通过将数字文件限制为单个命令的持续时间来证明我在说什么,我使用的命令是列出限制的命令......

convert -limit file 2 -list resource info:

Resource limits:
  Width: 214.7MP
  Height: 214.7MP
  Area: 17.18GP
  Memory: 8GiB
  Map: 16GiB
  Disk: unlimited
  File: 2             <--- 2 files only
  Thread: 1
  Throttle: 0
  Time: unlimited

因此,在列出我可以打开多少文件的命令的持续时间内,我限制了打开文件的数量,2它显示了这一点。

于 2016-01-18T09:09:02.820 回答