使用ImageMagick转换实用程序和服务器的Linux高负载冻结(附带blktrack输出)

我使用ImageMagick将JPG转换为TIF文件,并使用Imagemagick的限制选项,如下所示:

/usr/bin/convert -limit memory 256 -limit map 512 subjectfile.jpg -colorspace Gray -depth 8 -resample 200x200 output.tif 

当我运行上面的命令时,服务器上的负载突然变得非常高,CPU在大部分时间处于等待状态,如下所示:

 Tasks: 245 total, 3 running, 241 sleeping, 0 stopped, 1 zombie Cpu0 : 0.0%us, 0.0%sy, 0.0%ni, 0.0%id,100.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu1 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu2 : 1.0%us, 1.0%sy, 0.0%ni, 0.0%id, 93.1%wa, 0.0%hi, 5.0%si, 0.0%st Cpu3 : 6.9%us, 1.0%sy, 0.0%ni, 90.1%id, 0.0%wa, 1.0%hi, 1.0%si, 0.0%st Mem: 4148160k total, 3980380k used, 167780k free, 18012k buffers Swap: 4096552k total, 96k used, 4096456k free, 3339884k cached 

此期间的iostat显示如下:

 Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util sda 0.00 7361.00 62.00 137.00 3712.00 37180.00 410.97 128.13 120.48 5.04 100.20 sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda3 0.00 7361.00 62.00 137.00 3712.00 37180.00 410.97 128.13 120.48 5.04 100.20 sdb 0.00 7368.00 0.00 144.00 0.00 33136.00 460.22 133.84 203.48 6.96 100.20 sdb1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sdb2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sdb3 0.00 7368.00 0.00 144.00 0.00 33136.00 460.22 133.84 203.48 6.96 100.20 md1 0.00 0.00 61.00 17711.00 3648.00 70844.00 8.38 0.00 0.00 0.00 0.00 md0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util sda 0.00 1193.00 0.00 470.00 0.00 14200.00 60.43 91.07 216.34 2.02 95.00 sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda3 0.00 1193.00 0.00 470.00 0.00 14200.00 60.43 91.07 216.34 2.02 95.00 sdb 0.00 1138.00 0.00 410.00 0.00 8700.00 42.44 141.31 119.61 2.44 100.20 sdb1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sdb2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sdb3 0.00 1138.00 0.00 410.00 0.00 8700.00 42.44 141.31 119.61 2.44 100.20 md1 0.00 0.00 0.00 5226.00 0.00 20904.00 8.00 0.00 0.00 0.00 0.00 md0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util sda 0.00 1472.28 0.00 483.17 0.00 7821.78 32.38 5.52 11.43 0.52 25.05 sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda3 0.00 1472.28 0.00 483.17 0.00 7821.78 32.38 5.52 11.43 0.52 25.05 sdb 0.00 1511.88 0.00 410.89 0.00 10047.52 48.91 143.60 171.46 2.42 99.31 sdb1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sdb2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sdb3 0.00 1511.88 0.00 410.89 0.00 10047.52 48.91 143.60 171.46 2.42 99.31 md1 0.00 0.00 0.00 778.22 0.00 3112.87 8.00 0.00 0.00 0.00 0.00 md0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 

我不是很熟悉Linux I / O性能,但通过在互联网上阅读,我设法从blktrace得到一些统计数据,这显示为:

 ==================== All Devices ==================== ALL MIN AVG MAX N --------------- ------------- ------------- ------------- ----------- Q2Q 0.000000499 0.000486353 1.158217913 172004 Q2G 0.000000258 0.000059510 0.198865402 343500 S2G 0.000128922 0.010945336 0.198863747 1840 G2I 0.000000214 0.000000517 0.000168407 343504 Q2M 0.000000190 0.000000519 0.000122999 344516 I2D 0.000000879 0.016310824 0.305521347 342948 M2D 0.000000951 0.007473560 0.205691209 344492 D2C 0.000083899 0.002041770 0.160452919 171859 Q2C 0.000092851 0.013953825 0.317186332 171859 ==================== Device Overhead ==================== DEV | Q2G G2I Q2M I2D D2C ---------- | --------- --------- --------- --------- --------- ( 8, 0) | 0.8524% 0.0074% 0.0075% 233.2591% 14.6323% ---------- | --------- --------- --------- --------- --------- Overall | 0.8524% 0.0074% 0.0075% 233.2591% 14.6323% ==================== Device Merge Information ==================== DEV | #Q #D Ratio | BLKmin BLKavg BLKmax Total ---------- | -------- -------- ------- | -------- -------- -------- -------- ( 8, 0) | 343516 343516 1.0 | 8 16 1024 5650976 ==================== Device Q2Q Seek Information ==================== DEV | NSEEKS MEAN MEDIAN | MODE ---------- | --------------- --------------- --------------- | --------------- ( 8, 0) | 172005 27058614.9 0 | 0(123703) ---------- | --------------- --------------- --------------- | --------------- Overall | NSEEKS MEAN MEDIAN | MODE Average | 172005 27058614.9 0 | 0(123703) ==================== Device D2D Seek Information ==================== DEV | NSEEKS MEAN MEDIAN | MODE ---------- | --------------- --------------- --------------- | --------------- ( 8, 0) | 343516 9204796.3 0 | 0(310240) ---------- | --------------- --------------- --------------- | --------------- Overall | NSEEKS MEAN MEDIAN | MODE Average | 343516 9204796.3 0 | 0(310240) 

使用btt和-A选项显示,这个:

 ==================== Per Process ==================== Q2Qdm MIN AVG MAX N --------------- ------------- ------------- ------------- ----------- Q2Adm MIN AVG MAX N --------------- ------------- ------------- ------------- ----------- Q2Cdm MIN AVG MAX N --------------- ------------- ------------- ------------- ----------- Q2Q MIN AVG MAX N --------------- ------------- ------------- ------------- ----------- convert 0.085368267 9.765798951 24.050329666 3 md1_raid1 0.000000730 0.000493657 1.158217913 169459 mysqld 0.000001386 0.018154085 14.221072636 2146 sh 0.005889458 0.322064972 1.423632298 5 Q2A MIN AVG MAX N --------------- ------------- ------------- ------------- ----------- Q2G MIN AVG MAX N --------------- ------------- ------------- ------------- ----------- convert 0.000000539 0.000003194 0.000005260 16 md1_raid1 0.000000258 0.000060580 0.198865402 333440 mysqld 0.000000270 0.000028381 0.058359194 8476 sh 0.000000506 0.000000827 0.000001610 24 S2G MIN AVG MAX N --------------- ------------- ------------- ------------- ----------- md1_raid1 0.000128922 0.010842039 0.198863747 1836 mysqld 0.058358625 0.058358625 0.058358625 4 

我正在使用下面的I / O Schedular:

 # cat /sys/block/sd*/queue/scheduler noop anticipatory deadline [cfq] noop anticipatory deadline [cfq] 

所以我的问题是为什么平均(AVG) Q2Q值是如此高的转换 (ImageMagick)工具,当我使用它与限制选项:

 convert 0.085368267 9.765798951 24.050329666 3 

当我使用convert (ImageMagick)没有-limit选项时,我没有看到负载高度的问题,所以你可以帮我解释为什么当我尝试限制ImageMagick的转换工具使用的资源与-limit选项的负载高射击和我该如何解决这个问题。

我已经运行了你的确切的命令行(尽pipe用不同的图片,我假定;-))有和没有限制选项。 我明白了这个问题:限制选项单位是以字节为单位。 这是什么意思?

您将内存中的最大内存设置为256B,将文件映射设置为512B。 因此,读取FS块的大小(或更less,如果你有一个4K的硬盘),而不是有很大的缓冲区读取大块。 这是会产生大量不必要的IO的东西。

你想要做的是设置256MiB和512MiB(注意尊重案例MiB而不是mib或MIB!):

 /usr/bin/convert -limit memory 256MiB -limit map 512MiB subjectfile.jpg -colorspace Gray -depth 8 -resample 200x200 output.tif 

使用这个命令,我可以获得与不使用限制时相同的实时性,而且我的IO活动或多或less与没有限制选项的活动相同。

高服务器负载并不总是坏消息,因为负载平均值反映了CPU已经排队做多less工作。 如果这些进程正在磁盘IO上等待,而且磁盘相当慢,那么将导致高负载平均,但对性能没有任何明显的影响。

不仅如此,但看看你的CPU使用情况,除了运行Image magik之外,CPU并没有出现其他的东西。 如果一个进程唯一重要的进程正在运行,那么一个进程占用大部分CPU时间是非常正常的。

如果你真的想确保它不占用CPU,那么使用nice命令来增加它的好处。 但是,如果它是唯一运行的过程,那么赔率甚至不会造成太大的变化。

Upshot:如果转换过程不会对其他程序的性能产生负面影响,请不要担心!

当Q2Q变高时,意味着从应用程序到设备队列的连续请求之间存在时间差。 应用程序发出一个IO,它不会从磁盘的下一个扇区发出下一个IO,磁头会去寻找其他地方,当它find合适的一个扇区时,应用程序将发出下一个IO。 这种IO被称为随机IO。 随机IO增加了发送到块层的请求之间的Q2Q时间或时间。

你没有显示一个没有–limit选项的比较blktrace,但我会假设,当使用限制时,转换命令不是做随机IO或至less随机性在一定程度上减less。

从iostat看到这一行。 sdb3 0.00 1138.00 0.00 410.00 0.00 8700.00 42.44 141.31 119.61 2.44 100.20

你看到的是119.61,而svctm是2.44,%util是100.20。 请注意,avrqu-sz很大,在141.31相当大。 因此,在服务之前,IO正在块层中等待,并且我们看到avgqu-sz的值很高,这也意味着有待处理的IO也意味着到块层。 再次表明,我们没有看到连续的IO数据stream,而是随机的数据块,这就是为什么svctm在await和avgqu-sz高的时候是非常好的。

所以,归结为应用程序如何发出IO。 我不认为你可以控制太多。 所以,不要限制convert命令,看看你是否可以得到一个顺序的IOstream。

另外,请问磁盘供应商的术语IOPS是多less? 所以我也可以告诉你是否正在饱和磁盘。

顺便说一句,与blktrace输出很好。 您可能还想继续使用seekwatcher实用程序来制作pdf。

从ImageMagick的参数来看,你需要一个200×200的TIFF文件…但是你的iotop输出显示出你的RAIDarrays有70MB / s的输出,而且每秒input/输出事务的数量非常高。

以下是我对发生的事情的怀疑,尽pipe我对ImageMagick不够了解。 通过将内存量限制为512字节,为了处理映像ImageMagick被迫使用磁盘作为中介存储方法,因为它不能使用内存。 因此,当页面块进入和退出页面时,会消耗大量的I / O吞吐量,从而导致系统locking。

你为什么把这个极限设置得这么低 – 实际上,你为什么要这么做呢? 将它们设置得更高将减lessImageMagick必须大量分页的数量。 如果您不相信进入的图像,并且您正试图使图像消耗过多的资源,请对允许转换的图像大小设置上限,将内存限制设置为例如2-4倍限制同时转换的次数,并且为了增加偏执狂,限制命令执行时间以防止有意地格式错误的图像永远循环。