작은 PHP 사이트 부하테스트 안전하게 하는 방법
부하테스트는 사이트를 망가뜨리려고 하는 작업이 아니라, 동시 요청(여러 방문자가 같은 순간에 접속하는 상황)이 어느 정도일 때 응답 시간이 흔들리는지 확인하는 작업입니다. 처음에는 운영 서버가 아닌 내 컴퓨터(로컬)에서 낮은 수치로 시작해야 합니다.
권장 순서
먼저 정적 파일(이미지·CSS처럼 늘 같은 내용을 주는 파일)과 루트 페이지를 대상으로 50에서 200회 요청을 보냅니다. 오류율이 0%이고 95퍼센타일(요청 100개를 빠른 순으로 세웠을 때 95번째) 응답 시간이 안정적이면 동시 요청 수를 조금씩 올립니다. 로그인 영역이나 파일 다운로드 영역은 공개 테스트 대상에서 제외합니다.
로컬 테스트 명령
# Ubuntu / Debian: ApacheBench 설치
sudo apt-get install apache2-utils
# 자신이 운영하는 로컬 테스트 서버가 8080 포트에서 실행 중이어야 합니다.
curl -I http://127.0.0.1:8080/
ab -n 50 -c 1 http://127.0.0.1:8080/
ab -n 100 -c 5 http://127.0.0.1:8080/
볼 지표
평균 응답 시간보다 95퍼센타일이 중요합니다. 평균은 낮아도 일부 요청이 2초 이상 튀면 실제 사용자는 느리다고 느낄 수 있습니다. 오류 코드가 5xx(서버 쪽에 문제가 있다는 뜻의 응답 코드)로 나오면 PHP-FPM, Nginx worker, 디스크 IO, 로그 쓰기부터 확인합니다.
실행 전에 확인할 조건
위 명령은 저장소 내부 파일 없이 실행할 수 있습니다. 8080은 예시 포트이므로 내 테스트 서버 포트로 바꾸세요. curl 결과가 200인지 확인하고, 301·302라면 이동한 최종 주소를 테스트합니다. 그렇지 않으면 본문 처리보다 리다이렉트 성능만 측정하게 됩니다. 이름 기반 가상 호스트를 로컬 IP로 검사할 때는 ab에 -H "Host: 내도메인"을 추가할 수 있습니다.
localhost에서 발생시킨 부하는 인터넷 구간이나 CDN을 포함하지 않습니다. 부하를 만드는 프로그램과 서버가 같은 CPU를 사용하므로 결과가 서로 영향을 받습니다. PHP 내장 개발 서버의 수치도 실제 Nginx·PHP-FPM의 처리량으로 해석하면 안 됩니다. 여기서는 변경 전후 비교부터 시작하세요.
출력 예시를 읽는 법
다음은 설명을 위한 가상 결과이며 SameOS 서버의 실측값이 아닙니다.
Complete requests: 100
Failed requests: 0
Requests per second: 25.00 [#/sec] (mean)
Percentage of the requests served within a certain time (ms)
50% 120
95% 400
100% 800 (longest request)
이 예시의 p95는 400ms입니다. 초당 25회라는 평균 처리량이 높아져도 p95나 실패가 함께 늘면 개선이라고 단정할 수 없습니다. Failed requests만 보지 말고 Non-2xx responses와 서버 로그도 확인하세요. 동적 페이지는 정상 응답이어도 길이가 달라 Length 실패로 집계될 수 있습니다. 실제 응답이 정상임을 확인한 뒤에만 ab의 -l 옵션으로 가변 길이를 허용하세요.
한 번에 하나씩 바꾸고 비교하기
- 같은 URL·요청 수·동시성을 기록하고 기준 결과를 저장합니다. 캐시가 차기 전과 후를 구분합니다.
- 느린 데이터베이스 쿼리, 반복 파일 읽기, 페이지 캐시 중 실제 병목 하나를 수정합니다.
- 같은 조건에서 다시 실행해 p95·오류·CPU·메모리를 비교합니다. 정적 CSS와 PHP 본문 결과를 따로 기록하면 범위를 좁히기 쉽습니다.
- 오류·타임아웃이 생기거나 평소 사용에 지장을 주면 중단합니다. 낮은 부하로 되돌려 PHP-FPM 대기, 애플리케이션 로그, 디스크 상태부터 확인합니다.