일부 환경에서 나타나는 메모리 부족 오류
CMS/프레임워크 | Rhymix 1.9 |
---|---|
개발 언어 | PHP 7.1 |
PHP Fatal Error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 16384 bytes) in classes/template/TemplateHandler.class.php on line 355
가끔은 로그인할 때, 가끔은 포인트 내역 보기를 시도할 때 등 전혀 관련이 없는 것 같은 환경에서 이러한 오류 메시지가 출력됩니다. XETOWN에서 찾아보면 php.ini에서 최대 RAM 사용량을 늘리라고 하는데, 현재 서버 RAM 용량이 8GB이고 PHP에서 최대로 사용할 수 있는 RAM을 이미 5GB까지 늘린 상태임에도 저 상태입니다.
그렇다고 사용 가능량을 -1로 설정해버리면 해당 작업 중에 점점 서버가 느려지더니 결국 멈추는 수준까지 갑니다. 뭐가 문젠지 도저히 모르겠는데 혹시 아시는 분 계신가요?
댓글 6
https://github.com/xpressengine/xe-core/pull/2377
위 패치 였습니다. 관련이 있는지는 모르겠습니다.
메모리 부족 오류는 디버깅하기가 무척 어렵습니다. 에러메시지에 나오는 소스 위치는 원인과 아무 관련이 없는 경우가 대부분이고, 게다가 메모리가 없으면 로그도 backtrace도 전혀 기록할 수가 없기 때문에...
XE는 기본적으로 memory_limit을 128MB만 주어도 충분히 잘 돌아갑니다. 이미지 처리 이외의 목적으로 그것보다 더 많은 메모리를 필요로 한다면 어딘가 쓸데없이 많은 정보를 한꺼번에 집어삼키려고 하는 서드파티 자료가 있는 것입니다. 애드온을 하나씩 꺼 보거나, 에러가 나는 화면에 끼어들 만한 모듈들을 하나씩 지워보는 수밖에요.
특정하기 어려운 상황이라면 혹시 라이믹스 파일누락도 의심해 볼 필요도 있을 것 같구요.
저는 패치적용할때 제가 제대로 못고친 부분이 있었길 바라고 있네요. 저 패치가 살제 코어에 반영이 되면 저는 어차피 다시 해봐야 할 것 같습니다.
xdebug의 profiler 기능으로 PHP 동작중의 메모리 사용량을 추적할 수 있습니다.
일단 xdebug 모듈을 설치하신 다음에 xdebug.ini 에서 profiler 관련 옵션을 켜세요.
그러면 정해진 파일명으로 프로파일 추적 내용이 저장됩니다.
이때 무조건 저장하게 할 수도 있고 Trigger라고 해서 쿠키에 특정명령이 포함되어
있어야만 저장하게 할 수 도 있습니다. 이미 돌아가는 사이트라면 Trigger 옵션을
on으로 하시고 크롬 확장 프로그램중에서 XDebug helper라는 것을 쓰시면
쉽게 on/off가 가능합니다.
하여튼 그렇게 저장된 프로파일을 툴을 사용해서 열어보시면 아마 금방 원인파악이
가능할겁니다.
PHPStorm같은걸 쓰시면 툴안에 프로파일 분석기가 내장되어 있어서 굉장히
쉬운데.. 그걸 안쓰시면..
https://kcachegrind.github.io/html/Download.html
https://xdebug.org/docs/profiler
이 문서를 보고 따라해보세요. 근데 이건 리눅스용 프로그램이라서..
윈도우에서 쓸 수 있는 뭔가 다른 프로파일 분석 프로그램이 있는지는 잘 모르겠습니다.
그냥 phpstorm을 1달만 쓸 수 있는 evaluation 버젼으로 설치하시는게 더 쉬울 수도 있겠네요
카운트가 설정된 값으로 안되고 무한대로 되어 메모리가 부족할 수 밖에 없는 상황이 나타나는게 지금 다양한 서드파티의 문제인지 아니면 코어에서 문제가 있는건지 확인이 필요해 보입니다. 코어에서 막아줄 수 있는 방법이 있다면 불특정한 서드파티 자료들에서 쿼리시 이런 무한 카운트 쿼리가 발생되지 않을 수 도 있지 않을까 하는 생각이 들었습니다. @기진곰 님 참조용으로 멘션 추가했습니다.