질문/조언질답게시판

라이믹스로 전환하면서 이미지 리사이즈를 이미지 프로세스 모듈에서 라이믹스 기본기능으로 전환한지 오래되었습니다

 

일단 이미지프로세스 모듈에서 GD, Imagic 선택이 가능했었는데 현재 라이믹스 코어 기능으로 전환하면서 GD를 이용하는 것으로 되어있어 GD가 이미지 처리할때 필요한 리소스가 어떻게 되는지 궁금해졌습니다.

 

이유는 대략 10M 정도 되는 이미지가 업로드될때 이미지 처리가 실패하는 것 같습니다.(리사이즈,섬네일)

 

서버에서 보통 메모리 리밋을 256M 좀더 공격적으로는 512M 까지 설정을 하는데요.

 

10M 의 원본 이미지가 업로드 될때 메모리가 부족해서 처리가 안된다고 가정한다면 원본 용량대비 몇배의 이미지가 필요하건지 혹은 용량과 비례해서 요구되는 다른 리소스가 필요한건지 궁금해졌는데요. CPU 부족하다고 보기에는 조금 어려워 보이긴 합니다. 아주 바쁜 CPU도 아닌 상황이라서요.

  • profile

    용량보다는 원본 이미지의 화소 수에 더 직접적으로 영향을 받습니다.
    용량이 작더라도 압축률이 높은 이미지는 원본의 화소 수가 많아서 문제가 될 수 있지요.

    XE/라이믹스에서 GD로 이미지를 리사이즈할 수 있을지 판단하는 기준은 아래와 같습니다.
    아래의 기준에 맞지 않으면 처리 도중 메모리 리밋을 초과하여 뻗어버릴 가능성이 높기 때문에
    아예 리사이즈 시도도 하지 않습니다.

    (화소 수 × 4바이트 × 2) < (메모리 리밋 - 코어와 기타 자료들이 이미 사용중인 메모리 - 약간의 여유분)

    화소당 4바이트인 이유는 대부분의 이미지가 화소당 3~4채널(RGB 또는 RGBA)을 사용하기 때문이고,
    2를 곱하는 이유는 원본뿐 아니라 리사이즈 작업중인 사본도 메모리에 적재해야 하기 때문입니다.

    이 기준을 적용했을 때 메모리 리밋이 128M로 설정된 일반적인 웹서버에서
    GD로 리사이즈할 수 있는 가장 큰 이미지는 1200만~1300만 화소 정도가 됩니다.

    만약 무거운 모듈을 많이 사용하거나, 대량의 문서를 불러와서 처리하는 애드온이 있다면
    "코어와 기타 자료들이 이미 사용중인 메모리" 부분이 늘어나서 화소 수 제한은 더 줄어듭니다.

  • profile profile

    결국 메모리에서 제한이 되는군요.
    Imagic은 메모리제한에서 더 자유롭다는데 맞나요?

  • profile profile
    특정 포맷에 적정한 설정 용량 자체를 넘는 업로드는 차단할 수 있으면 좋겠다는 생각이 듭니다. 아래 게시글로 쓴 내용이죠.(jpg,png,jpeg 한정)
  • profile profile

    PHP의 메모리 리밋은 적용되지 않지만, 지나치게 큰 이미지를 던져주면 서버의 RAM을 모두 소진하고 뻗어버릴 위험이 있는 것은 마찬가지입니다. 폭탄을 다른 데로 돌리는 것 뿐이지요.

    그러나 imagick은 GD와 달리 처리 효율을 다소 희생하더라도 일정량 이상의 메모리를 사용하지 않도록 하는 안전장치가 있으므로, 이 옵션을 활용하면 큰 이미지를 적당히 처리할 수 있으면서도 서버 안정성에 영향을 주지 않을 것으로 보입니다.

  • profile profile
    용량과 화소 수는 정비례하지 않으므로 안정적인 해결책이 아닙니다.
  • profile profile
    네. 알지만 미봉책...
  • profile profile

    Imagick 이 대안이 될 수 있는데 이미지프로세서 모듈은 다시 적용하고 싶지는 않네요.