<div align="center">
<img src="https://raw.githubusercontent.com/omarmhaimdat/pepe/HEAD/assets/logo.svg" width="112" alt="Pepe, a pixel-art chili pepper">
pepe
테스트하는 서버보다 비용이 적게 들도록 구축된 라이브 대시보드를 갖춘 HTTP 부하 생성기.
CI Release Downloads License: MIT Rust 1.85+
Install · Quick start · What it does · Scripts, CI and agents · How it compares · Documentation · Roadmap
</div>
pepe load-testing a server: the live dashboard, the request log, and the verdict
pepe는 요청하는 만큼의 수만큼 URL에 요청을 보내고, 발생하는 대로 무엇이 돌아왔는지 보여줍니다: 처리량(throughput), 지연 시간 백분위수(latency percentiles) 및 히트맵, 상태 코드, 원인별 실패 횟수, 그리고 모든 요청을 열어볼 수 있는 로그를 제공합니다. 실행이 끝나면 평범한 말로 결론을 내리고 시간이 어디에 쓰였는지 알려줍니다. curl 명령어를 입력으로 받아 부하를 점진적으로 증가시켜 대상 서버가 어느 지점에서 따라가지 못하는지 찾고, OpenAPI 사양의 모든 엔드포인트를 부하 테스트하며, 접근 로그를 재생하고, 각 단계가 다음 단계로 연결되는 요청 흐름을 실행합니다. pepe ping은 초당 한 번의 요청으로 동일한 엔진을 사용합니다: URL의 시간 경과에 따른 지연 시간을 그래프로 보여주며, 각 핑(ping)은 DNS, connect, TLS, 첫 바이트(first byte), 다운로드(download)로 분할되어 무엇을 봐야 할지 알려줍니다.
또한 가볍습니다. Apple M4 Pro에서는 초당 160k 요청을 보내고 Linux에서는 400k 요청을 보내는데, 이는 wrk보다 적은 CPU와 메모리를 사용하며, oha의 CPU 대비 1/4에서 1/2 수준, 메모리 대비 1/10 이하로 작동합니다. 그리고 pepe는 누가 한계인지(대상 서버인지 자신인지) 알려줍니다.
Install
Windows에서는 PowerShell을 사용합니다: powershell -ExecutionPolicy Bypass -c "irm https://pepe.mhaimdat.com/install.ps1 | iex". 모든 릴리스에는 체크섬과 서명된 출처(signed provenance)를 갖춘 macOS, Linux 및 Windows용 바이너리가 제공되며, 셸 완성 기능(shell completions)과 man 페이지도 포함됩니다. pepe self-update를 실행하면 최신 릴리스가 설치되고, pepe는 하루에 한 번 최신 버전을 확인하며 실행이 끝날 때 알려줍니다. 자세한 내용은 설치 페이지에서 확인할 수 있습니다.
빠른 시작 (Quick start)
pepe https://example.com
pepe -z 30s -c 50 -m POST -H 'Content-Type: application/json' -d '{"key":"value"}' https://httpbin.org/post
pepe -z 30s --curl -- curl 'https://api.example.com/items' -H 'Authorization: Bearer …'
...
대시보드에서는 space를 누르면 일시 정지되고, +와 -는 동시성(concurrency)을 변경하며, tab은 뷰를 전환하고, enter는 요청을 검사하며, ?는 모든 키 목록을 보여주고, q는 종료하면서 결과를 셸에 남깁니다.
기능 (What it does)
| 명령어 | 용도 | 문서 |
|---|
pepe URL | 실시간 대시보드를 갖춘 부하 테스트: 부하의 형태(--number, --duration, --concurrency, --rate, --warmup, --threads), 모든 헤더, 본문 또는 메서드, curl 명령어, 코드 옆의 pepe.toml, --snapshot을 사용한 침지(soak) 실행 | 부하 테스트, 대시보드 |
| ... | | |
모든 명령어의 플래그는 명령어 참조에 있으며, man pepe에도 동일하게 있습니다.
스크립트, CI 및 에이전트 (Scripts, CI and agents)
모든 모드는 화면 없이 실행되며 프로그램에 의해 호출되도록 구축되었습니다:
--json을 사용한 버전 관리 JSON 보고서 (schema_version: 1; pepe schema는 각 보고서의 JSON Schema를 출력), 여기에 판정(verdict)과 그 발견 사항이 포함됩니다. --json 없이 파이프라인으로 연결하면, 텍스트 형태의 판정이 나옵니다.
- 의미가 있는 종료 코드: 요청 시 0, 시작 불가 또는 응답 없음은 1, 사용 오류 또는 가드레일 위반은 2, 제한 초과(예:
--fail-if 'p99 > 300ms', 핑의 --slo)는 4입니다.
- 사전 검사되는 가드레일: 아무것도 전송되기 전에 확인됩니다.
--allow-host .example.com, --max-requests, --max-rate, --max-concurrency, 그리고 무엇이 전송될지 보여주고 실제로는 아무것도 보내지 않는 --dry-run 등이 있습니다. 이들은 pepe.toml에 저장할 수 있습니다.
- 테스트를 실행하고, 숫자를 작업 요약 및 출력에 기록하며,
pepe compare로 기본 브랜치에 풀 리퀘스트(pull request)를 걸고, 결과를 주석 처리하며, 작업을 실패시킬 수 있는 GitHub Action입니다: CI 및 Docker.
- 소크런(soak run)이나 긴 핑 테스트를 위해
--metrics :9100을 사용하는 Prometheus 메트릭스입니다. Grafana에서 사용 가능합니다.
- 시작 시 적용된 가드레일 하에 모드를 에이전트용 도구로 제공하는 MCP 서버(
pepe mcp)입니다; AGENTS.md는 에이전트가 가장 먼저 읽는 내용입니다.
- uses: omarmhaimdat/pepe@v0
with:
url: https://staging.example.com/api/health
...
pepe 비교 방법
로컬 서버(메모리에서 응답)를 대상으로 bench/의 스위트와 함께 측정되었습니다. 따라서 비용으로 측정되는 것은 클라이언트입니다. 각 도구가 보고한 요청당 CPU 밀리초, 최대 메모리 사용량, 초당 요청 수치입니다:
| 워크로드 | pepe | oha | vegeta |
|---|
| GET, 64 연결 | 6.2 ms · 9 MB · 160k req/s | 23.0 ms · 78 MB · 161k req/s | 90.4 ms · 26 MB · 76k req/s |
| ... | | | |
이 수치들은 Apple M4 Pro에서 pepe를 단일 스레드로 실행했을 때의 수치이며, 이 경우 루프백은 초당 약 175k 요청까지 최대치를 기록합니다. Linux 환경(4-vCPU arm64 VM, 출시된 musl 빌드)에서 wrk가 한 스레드를 사용하는 경우 다음과 같습니다:
| 워크로드 (Workload) | pepe | wrk | oha |
|---|
| GET, 64 connections | 2.4 ms · 4.0 MB · 398k req/s | 3.5 ms · 4.5 MB · 282k req/s | 6.8 ms · 67 MB · 305k req/s |
| ... | | | |
모든 워크로드에서 pepe가 우세하거나 (1,000 connections, 16 KB bodies over TLS와 같은 느린 목표치) 다른 도구보다 앞서지 못하는 경우, glibc 빌드가 k6의 프로파일과 방식을 어떻게 바꾸는지 bench/README.md에서 확인할 수 있습니다. 대상이 여러 스레드를 필요로 하는 경우, pepe가 이를 알려주며 --threads auto 옵션으로 추가합니다. | | | |
문서 (Documentation)
모든 옵션과 예제를 페이지별로 담은 매뉴얼은 pepe.mhaimdat.com/docs에서 확인할 수 있습니다. 소스는 docs/ 아래의 Markdown 파일이며, 명령어 참조 (command reference)는 명령어 정의로부터 생성되므로 바이너리(binary)와 불일치할 수 없습니다. 각 릴리스에서 변경된 내용은 CHANGELOG.md에, 다음에 올 내용 순서는 ROADMAP.md에 담겨 있습니다.
기여 (Contributing)
이슈(Issues)와 풀 리퀘스트(pull requests)를 환영합니다. CONTRIBUTING.md에는 빌드, 테스트, 생성된 파일, 녹화 기록, 벤치마크 및 릴리스 방법이 담겨 있습니다.
라이선스 (License)
MIT. LICENSE를 참조하십시오.
감사의 말씀 (Acknowledgements)
tokio, rustls, httparse, h2 및 요청(requests)을 위해 reqwest, 대시보드(dashboard)를 위해 ratatui와 crossterm, 커맨드 라인(command line)을 위해 clap를, 그리고 벤치마크 테이블에서 좋은 동료가 되어준 oha, vegeta, wrk 및 k6에 감사드립니다.