![Linux 使用 ImageMagick 转换实用程序负载过高,服务器冻结(附有 blktrack 输出)](https://linux22.com/image/604913/Linux%20%E4%BD%BF%E7%94%A8%20ImageMagick%20%E8%BD%AC%E6%8D%A2%E5%AE%9E%E7%94%A8%E7%A8%8B%E5%BA%8F%E8%B4%9F%E8%BD%BD%E8%BF%87%E9%AB%98%EF%BC%8C%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%86%BB%E7%BB%93%EF%BC%88%E9%99%84%E6%9C%89%20blktrack%20%E8%BE%93%E5%87%BA%EF%BC%89.png)
我正在使用 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/s r/s w/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/s r/s w/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/s r/s w/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)
使用带有 -A 选项的 btt 显示以下内容:
==================== 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 调度程序:
# cat /sys/block/sd*/queue/scheduler
noop anticipatory deadline [cfq]
noop anticipatory deadline [cfq]
所以我的问题是为什么平均值(AVG)季度价值如此之高转变(ImageMagick)实用程序,当我将其与限制选项一起使用时:
convert 0.085368267 9.765798951 24.050329666 3
当我使用时,我没有看到负载过高的问题转变(ImageMagick)无-限制选项,所以你能帮我解释一下为什么当我尝试使用以下方法限制 ImageMagick 的转换实用程序使用的资源时,负载会突然升高-限制选项以及如何解决该问题。
答案1
我运行了您的确切命令行(尽管我猜想图片有所不同 ;-)),带和不带限制选项。我明白了问题所在:限制选项的单位是字节。这是什么意思?
您将最大内存设置为 256B,将文件映射设置为 512B。这样,您就不必读取大量的缓冲区,而是读取 FS 块的大小(如果您的硬盘是 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 活动或多或少相同。
答案2
服务器负载过高并不总是坏事,因为平均负载反映了 CPU 排队执行的工作量。例如,如果这些进程正在等待磁盘 IO,而磁盘恰好很慢,则会导致平均负载过高,但不会对性能产生任何明显影响。
不仅如此,查看您的 CPU 使用率,似乎 CPU 除了运行 Image magik 之外没有做太多其他事情。如果某个进程是唯一运行的重要进程,则该进程占用大部分 CPU 时间是完全正常的。
如果您确实想确保它不会占用 CPU,那么请使用 nice 命令来提高其优先级。但同样,如果它是唯一正在运行的进程,那么即使是 recnice 也不会带来太大影响。
结果:如果转换过程不会对其他程序的性能产生不利影响,请不要担心!
答案3
当 Q2Q 升高时,意味着应用程序连续向设备队列发出的请求之间存在时间间隔。应用程序发出一个 IO,它不会从磁盘的下一个扇区发出下一个 IO,磁盘头会去其他地方寻找,当它找到合适的扇区时,应用程序才会发出下一个 IO。这种 IO 称为随机 IO。随机 IO 会增加 Q2Q 时间或发送到块层的请求之间的时间。
您没有展示没有 --limit 选项的比较 blktrace,但我认为当与 limit 一起使用时,convert 命令不会执行随机 IO,或者至少随机性会在一定程度上降低。
从 iostat 中查看此行。sdb3 0.00 1138.00 0.00 410.00 0.00 8700.00 42.44 141.31 119.61 2.44 100.20
您会看到 await 为 119.61,而 svctm 为 2.44,%util 为 100.20。请注意,avrqu-sz 很大,达到 141.31,非常大。因此,IO 在块层中等待处理,我们看到 avgqu-sz 值很高,这也意味着有待处理的 IO 也意味着要进入块层。再次表明,我们看到的不是连续的 IO 流,而是随机块,这就是为什么 svctm 完全正常,而 await 和 avgqu-sz 很高。
因此,归根结底还是应用程序如何发出 IO。我认为您无法控制太多。因此,请尝试不限制转换命令,看看是否可以获得连续 IO 流。
另外,您能否告诉我磁盘的吞吐量是多少(用磁盘供应商的术语来说,IOPS)。这样我就能知道您的磁盘是否已饱和。
顺便说一句,blktrace 输出效果很好。您可能还想继续使用 seekwatcher 实用程序制作 pdf。
答案4
从您对 ImageMagick 的参数来看,您似乎想要一个 200x200 的 TIFF 文件……但您的 iotop 输出显示以 70MB/s 的速度写入您的 RAID 阵列,并且每秒的 I/O 事务数量极高。
以下是我对正在发生的事情的猜测,尽管我对 ImageMagick 了解不够多,无法证实这一点。通过将内存量限制为 512 字节,为了处理图像,ImageMagick 被迫使用磁盘作为中间存储方法,因为它无法使用内存。结果,它在分页进出块时最终消耗了大量 I/O 吞吐量,导致系统锁定。
你为什么要把限制设置得这么低——事实上,你为什么要有这些限制?把它们设置得更高会减少 ImageMagick 必须进行的分页量显著地。如果您不信任传入的图像并且试图防止图像消耗过多的资源,请对允许转换的图像大小设置上限,将内存限制设置为指定上限的 2-4 倍,限制同时转换的数量,并且为了更加谨慎,请限制命令执行时间以防止故意畸形的图像永远循环。