PHP 애플리케이션의 성능을 최적화하려면 스크립트가 실제로 얼마나 많은 시간을 소비하는지 정확히 파악하는 것이 중요합니다. 특히 CPU 연산에 걸린 시간과 시스템 호출에 소요된 시간을 구분해서 측정할 수 있다면 병목 지점을 찾는 데 큰 도움이 됩니다.
getrusage() 함수란?
PHP 7 이상 버전에서는 getrusage() 함수를 활용하여 프로세스의 자원 사용량을 확인할 수 있습니다. 이 함수는 운영체제에서 제공하는 리소스 통계 정보를 반환하며, 이를 통해 사용자 영역(user)의 연산 시간과 커널 영역(system)의 처리 시간을 밀리초 단위로 계산할 수 있습니다.
예제 코드
// 스크립트 시작 지점
$exec_start = getrusage();
// 기타 코드 로직 실행
// 스크립트 종료 지점
function rutime($ru, $rus, $index) {
return ($ru["ru_$index.tv_sec"]*1000 + intval($ru["ru_$index.tv_usec"]/1000))
- ($rus["ru_$index.tv_sec"]*1000 + intval($rus["ru_$index.tv_usec"]/1000));
}
$ru = getrusage();
echo "연산에 소요된 시간: " . rutime($ru, $exec_start, "utime") .
" ms\n";
echo "시스템 호출에 소요된 시간: " . rutime($ru, $exec_start, "stime") .
" ms\n";코드 동작 원리
1. 시작 시점 기록
스크립트가 시작될 때 getrusage()를 호출하여 초기 자원 사용량을 변수에 저장합니다.
2. rutime() 헬퍼 함수
이 함수는 두 시점의 자원 사용량 차이를 밀리초(ms) 단위로 계산합니다. 초 단위 값(tv_sec)은 1000을 곱하고, 마이크로초 값(tv_usec)은 1000으로 나누어 합산함으로써 정확한 경과 시간을 구합니다.
3. 결과 출력
utime(사용자 모드 CPU 시간)과 stime(커널 모드 시스템 호출 시간)을 각각 출력하여 어떤 작업이 더 많은 자원을 소모했는지 확인할 수 있습니다.
실행 결과
위 코드를 실행하면 다음과 같은 형태의 출력 결과를 얻을 수 있습니다.
The process used 1.563896 ms for the computations Spent 0.345628 ms during system calls
참고 사항
만약 테스트를 진행할 때마다 새로운 PHP 인스턴스(프로세스)를 생성한다면, 해당 인스턴스는 처음부터 자원 사용량을 카운트하므로 굳이 시점 간 차이를 계산할 필요가 없습니다. 즉, 스크립트 시작 시점의 값을 저장하지 않고도 마지막 getrusage() 호출 결과만으로 총 소요 시간을 확인할 수 있습니다.
마무리
getrusage() 함수는 단순한 벽시계(wall-clock) 시간 측정과 달리 실제 CPU가 소비한 시간을 정밀하게 분석해 줍니다. 대규모 데이터 처리나 성능 튜닝이 필요한 프로젝트에서 유용하게 활용해 보세요.