4

РЕДАКТИРОВАТЬ: Для тех, кто сталкивается с этим в будущем: Imagemagick использует библиотеку MP. Быстрее использовать доступные ядра, если они рядом, но если у вас есть параллельные задания, это бесполезно.

Выполните одно из следующих действий:

  • делайте свою работу поочередно (с Imagemagick в параллельном режиме)
  • установите MAGICK_THREAD_LIMIT = 1 для вашего вызова рассматриваемого двоичного файла imagemagick.

Благодаря тому, что Imagemagick использует только один поток, в моих тестовых примерах он замедляется на 20-30%, но это означает, что я могу выполнять одно задание на ядро без проблем, что значительно увеличивает производительность.

Оригинальный вопрос:

При преобразовании некоторых изображений с помощью ImageMagick я заметил несколько странный эффект. Использование xargs было значительно медленнее, чем стандартное для цикла. Поскольку xargs, ограниченный одним процессом, должен действовать как цикл for, я проверил это и обнаружил, что он примерно такой же.

Таким образом, у нас есть эта демонстрация.

  • Четырехъядерный процессор (AMD Athalon X4, 2,6 ГГц)
  • Работа полностью на tempfs (16 грамм оперативной памяти; без свопа)
  • Никаких других основных нагрузок

Результаты:

/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 1 convert -auto-level

real        0m3.784s
user        0m2.240s
sys         0m0.230s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 2 convert -auto-level

real        0m9.097s
user        0m28.020s
sys         0m0.910s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 10 convert -auto-level

real        0m9.844s
user        0m33.200s
sys         0m1.270s

Может кто-нибудь придумать причину, по которой запуск двух экземпляров этой программы в реальном времени занимает более чем вдвое больше времени процессора и более чем в десять раз больше времени для выполнения одной и той же задачи? После этого первоначального попадания больше процессов, по-видимому, не оказывают столь существенного влияния.

Я подумал, что это может быть связано с поиском дисков, поэтому я сделал этот тест полностью в оперативной памяти. Может ли это иметь какое-то отношение к тому, как работает Convert, и наличие более чем одной копии одновременно означает, что он не может использовать кэш процессора так же эффективно или что-то в этом роде?

РЕДАКТИРОВАТЬ: Когда сделано с файлами 1000x 769 КБ, производительность соответствует ожидаемой. Интересно.

/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 1 convert -auto-level

real    3m37.679s
user    5m6.980s
sys 0m6.340s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 1 convert -auto-level

real    3m37.152s
user    5m6.140s
sys 0m6.530s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 2 convert -auto-level

real    2m7.578s
user    5m35.410s
sys     0m6.050s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 4 convert -auto-level

real    1m36.959s
user    5m48.900s
sys     0m6.350s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 10 convert -auto-level

real    1m36.392s
user    5m54.840s
sys     0m5.650s

1 ответ1

4

Насколько большие файлы вы хотите конвертировать по сравнению с вашим кешем L1? Ваш L2 кеш?

Если бы я не заглянул внутрь, я бы заподозрил, что конкуренция в кеше приводит к бездействию ваших процессоров, пока они ожидают повторного кэширования данных, потому что другие процессы продолжают выбрасывать важные вещи из быстрой памяти.

Смотрите также этот ответ, который я дал на переполнение стека.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .