J-한솔넷

메모리 프로파일링? 본문

프로그래밍/PHP

메모리 프로파일링?

jhansol 2023. 11. 9. 02:59

오늘 제가 작업중인 프로젝트를 외주업체와 협업을 위해 테스트서버에 설치하는 작업을 했습니다. 이 과정에 몇가지 문제가 있었고, 일부는 해결이 되지 않아 급히 커뮤니티에 내용을 욜렸습니다. 해당 내용에 답을 해주신 분이 "메모리 프로파일링부터 해봐야 원인을 알수 있을 것 같다"는 메시지와 함께 링크를 하나 올려주셨습니다.

해당 링크를 따라 시도를 해보고 있었습니다. 이 과정에서 문제가 해결되어 더 이상 진행하지는 않고, 추 후 공부를 위해 메모를 해두려고 합니다.

발생했던 문제들

패키지 설치 과정에서 maatwebsite/excel 패키지로 인한 오류가 발생했습니다.

이 오류의 원인은 psr/simple-cache가 설치되지 않아 생긴 문제로 이 패키지를 설치하고 다시 설치를 시도하니 문제가 해소되었습니다.

Monolog 문제

위 과정에서 패키지는 모두 설치가 되었는데, 아래의 명령 실행 중에 Monolog 관련하여 오류가 발생했습니다. 테스트 서버에는 PHP 8.1 설치되어 있었는데, PHP 8.2을 추가 설치하여 실행 버전을 8.2로 변경한 후 다시 시도하니 역시 문제가 해소된 듯 했습니다.

php artisan migrate

웹브라우즈에서 Monolog 오류 발생(메모리 부족 현상)

다 설정이 끝났다고 생각하고 웹 브라우즈를 통해 사이트에 접속하니 아래와 화면과 같은 오류가 발생했습니다.

위 화면을 보니 이 역시 Monolog의 LineFormatter에서 발생하고, 쌩뚱 맞게도 메모리 부족 오류가 발생했습니다. 개발환경에서는 전혀 문제가 없어 생각지도 못한 에러가 나와 급한 마음에 커뮤니티에 글을 올렸는데, 하나의 회신이 있어 공부거리가 되겠다 싶어 이부분에 대한 메모를 남길깧삽니다.

알고보니 권한 문제

위 문제는 알고보니 가장 기본적인 작업을 안해서 생긴 문제였습니다. bootstrap/cache 폴더와 storage 폴더에 쓰기 권한을 추가하지 않아 생긴 문제로 권한을 추가하니 오류 메시지가 거짓말 같이 없어졌습니다. 하지만 권한 문제가 아닌 메모리 부족 메시지가 뜨는 것은 이해가 가지 않습니다. 물론 내부적으로 제가 알지 못하는 문제가 있을 것입니다만 권한 문제를 지적해주었더라면 더 좋았을텐데 하는 생각을 해봅니다.

메모리 프로파일링

답변 글을 읽고, 이런 것도 있었구나!! 알아보면 공부가 되겠다 라는 생각으로 답변에 올라온 아래 링크를 타고 들어가봤습니다.

답변 링크

위 링크를 타고 들어가니 PHP의 메모리 프로파일링을 위한 라이브러리 철치 방법과 프로파일링 코드, 결과를 시각화하는 툴에 대한 간단한 설명이 있었습니다.

라이브러리 설치

원로 코드는 PHP 5.x를 기준으로 기술되어 있었습니다. 저는 8.2가 설치되어 있는 관계로 아래와 같이 해당 코드를 수정하여 적용했습니다. 문제없이 설치되었습니다.

sudo apt-get install libjudy-dev libjudydebian1
sudo pecl install memprof
echo "extension=memprof.so" > /etc/php/8.2/mods-available/memprof.ini
sudo phpenmod memprof
service apache2 restart

시각화 툴 KCachegrind를 위한 코드

KCachegrind 라는 시각화 도구를 이용을 위한 코드는 아래와 같습니다.

<?php
memprof_enable();

// do your stuff
memprof_dump_callgrind(fopen("/tmp/callgrind.out", "w"));

안내 내용에는 KCachegrind 도구를 이용하여 확인해보라고 되어 있는데, 이 도구는 KDE 환경에서 동작하는 것으로 보입니다. 안타깝게되 이 부분은 해보질 못했습니다. (시간 될 때 다시 해볼 것입니다.)

그리고 위 코드 살짝 바꿔 웹으로 출력하도록 해보니 아래와 같은 내용이 나오는데, 뭔 내용인지 알 수가 없네요. 암튼 아래 내용은 위 코드의 결과물입니다.

version: 1
cmd: unknown
positions: line
events: MemorySize BlocksCount

fl=/todo.php
fn=fopen
1 587 7

fl=/todo.php
fn=memprof_dump_callgrind
1 32 1

fl=/todo.php
fn=root
1 0 0
cfl=/todo.php
cfn=fopen
calls=1 1
1 587 7
cfl=/todo.php
cfn=memprof_dump_callgrind
calls=1 1
1 32 1

total: 619 8

Google gperftools 을 이용

안내에서는 이 도구를 권장하고 있습니다. Debian 계열에서 적용 가능 할 것 같습니다. (아직 시도를 못해봤습니다.)

sudo apt-get update
sudo apt-get install libunwind-dev -y
./configure
make
make install

그리고 아래와 같이 코드를 작성하고 실행합니다.

memprof_enable();
// do your magic
memprof_dump_pprof(fopen("/tmp/profile.heap", "w"));

마지막으로 아래와 같이 확인할 수가 있다고 합니다.

pprof --web /tmp/profile.heap

메모를 하고 난 후의 느낌

아직 제대로 실행을 해보지 못해 뭐라 말하기는 일러 보입니다. 하지만 살펴볼 가치가 있을 것으로 생각됩니다. 시간이 날 때 다시 한번 살펴보고 추가 메모를 하도록 하겠습니다.

'프로그래밍 > PHP' 카테고리의 다른 글

삽질의 연속  (0) 2024.04.20
ChatGPT를 이용한 코딩?  (0) 2023.10.26
WSL2를 쓰야하나!!!  (0) 2023.09.14
나의 API 문서화 전략  (0) 2023.09.11