如何自动限制在单个逻辑处理器上运行的批处理文件?

时间:2016-01-17 17:59:10

标签: windows multithreading batch-file single-threaded

我希望自动将一些(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个)逻辑处理器上。我的问题是 - 有更好的方法吗?

1 个答案:

答案 0 :(得分: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并显示出来。