SameOS ~/tools/load-test-plan.md

작은 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 옵션으로 가변 길이를 허용하세요.

한 번에 하나씩 바꾸고 비교하기

  1. 같은 URL·요청 수·동시성을 기록하고 기준 결과를 저장합니다. 캐시가 차기 전과 후를 구분합니다.
  2. 느린 데이터베이스 쿼리, 반복 파일 읽기, 페이지 캐시 중 실제 병목 하나를 수정합니다.
  3. 같은 조건에서 다시 실행해 p95·오류·CPU·메모리를 비교합니다. 정적 CSS와 PHP 본문 결과를 따로 기록하면 범위를 좁히기 쉽습니다.
  4. 오류·타임아웃이 생기거나 평소 사용에 지장을 주면 중단합니다. 낮은 부하로 되돌려 PHP-FPM 대기, 애플리케이션 로그, 디스크 상태부터 확인합니다.

Apache 공식 문서: ab 옵션과 출력 항목

CPU·메모리·디스크 상태 기록하기 대용량 응답의 버퍼·타임아웃 확인