편집: 나중에 이것을 우연히 발견하는 사람을 위해: Imagemagick은 MP 라이브러리를 사용합니다. 사용 가능한 코어가 주변에 있으면 사용하는 것이 더 빠르지만 병렬 작업이 있으면 도움이 되지 않습니다.
다음 중 하나를 수행하십시오.
- 작업을 순차적으로 수행합니다(병렬 모드의 Imagemagick 사용).
- 문제의 imagemagick 바이너리 호출에 대해 MAGICK_THREAD_LIMIT=1을 설정하십시오.
Imagemagick이 하나의 스레드만 사용하도록 함으로써 테스트 사례에서 속도가 20~30% 느려졌지만 문제 없이 코어당 하나의 작업을 실행할 수 있어 성능이 크게 향상되었습니다.
원래 질문:
ImageMagick을 사용하여 일부 이미지를 변환하는 동안 다소 이상한 효과를 발견했습니다. xargs를 사용하는 것은 표준 for 루프보다 훨씬 느렸습니다. 단일 프로세스로 제한된 xargs는 for 루프처럼 작동해야 하므로 이를 테스트한 결과 거의 동일한 것으로 나타났습니다.
따라서 우리는 이 데모를 가지고 있습니다.
- 쿼드 코어(AMD Athalon X4, 2.6GHz)
- tempfs에서 전적으로 작업(총 16g RAM, 스왑 없음)
- 그 외 큰 부담은 없습니다
결과:
/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
이 프로그램의 두 인스턴스를 실행하는 데 실시간으로 두 배 이상의 시간이 걸리고 동일한 작업을 완료하는 데 프로세서 시간이 10배 이상 걸리는 이유를 생각할 수 있는 사람이 있습니까? 초기 히트 이후에는 더 많은 프로세스가 그다지 큰 영향을 미치지 않는 것 같습니다.
나는 이것이 디스크 검색과 관련이 있을 수 있다고 생각하여 해당 테스트를 전적으로 RAM에서 수행했습니다. 변환 작동 방식과 관련이 있을 수 있으며, 한 번에 두 개 이상의 복사본이 있다는 것은 프로세서 캐시를 효율적으로 사용할 수 없다는 것을 의미합니까?
편집: 1000x 769KB 파일로 완료하면 성능이 예상대로입니다. 흥미로운.
/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
L1 캐시와 비교할 때 변환하려는 파일의 크기는 얼마나 됩니까? L2 캐시?
내부를 자세히 살펴보지 않으면 다른 프로세스가 빠른 메모리에서 중요한 항목을 계속 쫓아내기 때문에 데이터가 다시 캐시되기를 기다리는 동안 캐시 경합으로 인해 CPU가 유휴 상태가 되는 것으로 의심됩니다.