oha는 웹 애플리케이션에 일부 로드를 전송하고 rakyll/hey에서 영감을 받은 실시간 tui를 표시하는 작은 프로그램입니다.
이 프로그램은 Rust로 작성되었으며 tokio와 beautiful tui by ratatui에 의해 구동됩니다.
이 프로그램은 안정적인 Rust를 기반으로 구축되었으며, make
및 cmake
전제 조건이 모두 화물을 통해 설치됩니다.
cargo install oha
Rustls 대신에 Native-TLS에 대해 선택적으로 oha를 빌드할 수 있습니다.
cargo install --no-default-features --features rustls oha
vsock
기능을 활성화하여 VSOCK 지원을 활성화할 수 있습니다.
cargo install --features vsock oha
pacman -S oha
brew install oha
winget install hatoo.oha
echo "deb [signed-by=/usr/share/keyrings/azlux-archive-keyring.gpg] http://packages.azlux.fr/debian/ stable main" | sudo tee /etc/apt/sources.list.d/azlux.list sudo wget -O /usr/share/keyrings/azlux-archive-keyring.gpg https://azlux.fr/repo.gpg apt update apt install oha
x-cmd로 설치할 수 있습니다.
x 환경을 사용하세요 오하
oha를 포함한 컨테이너 이미지를 빌드하고 생성할 수도 있습니다.
도커 빌드 . -t example.com/hatoo/oha:최신
그런 다음 컨테이너를 통해 직접 oha를 사용할 수 있습니다.
docker run -it example.com/hatoo/oha:latest https://example.com:3000
다음 명령을 사용하여 PGO로 oha
빌드할 수 있습니다.
롤빵 실행 pgo.js
그리고 바이너리는 target/[target-triple]/pgo/oha
에서 사용할 수 있습니다.
Linux - Ubuntu 18.04 gnome-terminal에서 테스트됨
Windows 10 - Windows Powershell에서 테스트됨
MacOS - iTerm2에서 테스트됨
-q
옵션은 rakyll/hey와 다르게 작동합니다. 각 작업자 대신 초당 전체 쿼리를 설정합니다.
Ohayou(일본어), tui 애니메이션의 rakyll/hey에서 영감을 받은 HTTP 로드 생성기입니다. 사용법: oha [OPTIONS]인수: 대상 URL. 옵션: -n 실행할 요청 수입니다. [기본값 : 200] -c 동시에 실행할 연결 수입니다. 더 큰 `-c`에 대해서는 열린 파일 수 제한을 늘려야 할 수도 있습니다. [기본값 : 50] -p HTTP/2에서 보낼 병렬 요청 수입니다. `oha`는 총 c * p개의 동시 작업자를 실행합니다. [기본값: 1] -z 요청을 보내는 애플리케이션의 기간입니다. 기간을 지정하면 n은 무시됩니다. HTTP/1에서 기간에 도달하면 진행 중인 요청이 중단되고 "기한으로 인해 중단됨"으로 계산됩니다. `-w` 옵션을 사용하여 이 동작을 변경할 수 있습니다. 현재 HTTP/2에서는 기간에 도달하면 진행 중인 요청이 대기됩니다. `-w` 옵션은 무시됩니다. 예: -z 10s -z 3m. -w, --기한 후 진행 중인 요청 대기 기간에 도달하면 진행 중인 요청이 대기됩니다. -q 초당 쿼리 수(QPS)로 모든 속도 제한 --burst-delay 사전 정의된 요청 수 사이에 지연을 도입합니다. 참고: qps를 지정하면 버스트가 무시됩니다. --burst-rate 버스트 요청 비율입니다. 기본값은 1입니다. 참고: qps를 지정하면 버스트가 무시됩니다. --rand-regex-url rand_regex 상자로 URL을 생성하지만 점은 각 쿼리에 대해 비활성화됩니다(예: http://127.0.0.1/[az][az][0-9]). 현재 동적 구성표, 연결 유지 기능이 있는 호스트 및 포트는 제대로 작동하지 않습니다. 구문에 대한 자세한 내용은 https://docs.rs/rand_regex/latest/rand_regex/struct.Regex.html을 참조하세요. --max-repeat '--rand-regex-url'에 대한 매개변수입니다. max_repeat 매개변수는 x*, x+ 및 x{n,} 연산자가 될 최대 추가 반복 횟수를 제공합니다. [기본값: 4] --dump-urls 디버깅을 위해 대상 URL 회 덤프 --rand-regex-url --대기 시간 수정 조정된 누락 문제를 방지하려면 대기 시간을 수정하세요. -q가 설정되지 않으면 무시됩니다. --no-tui 실시간 없음 tui -j, --json 결과를 JSON으로 인쇄합니다. --fps tui의 초당 프레임입니다. [기본값: 16] -m, --method HTTP 메서드 [기본값: GET] -H 사용자 정의 HTTP 헤더입니다. 예: -H "foo: bar" -t 각 요청에 대한 시간 초과입니다. 기본값은 무한입니다. -A HTTP 수락 헤더. -d HTTP 요청 본문. -D 파일의 HTTP 요청 본문입니다. -T 콘텐츠 유형. -a 기본 인증, 사용자 이름:비밀번호 --http-version HTTP 버전입니다. 사용 가능한 값은 0.9, 1.0, 1.1입니다. --http2 HTTP/2를 사용합니다. --http-version=2 --host HTTP 호스트 헤더의 약어 --disable-compression 압축을 비활성화합니다. -r, --redirect 리디렉션 횟수 제한입니다. 리디렉션하지 않으려면 0을 설정합니다. HTTP/2에는 리디렉션이 지원되지 않습니다. [기본값: 10] --disable-keepalive 연결 유지를 비활성화하여 서로 다른 HTTP 요청 간의 TCP 연결 재사용을 방지합니다. HTTP/2에서는 지원되지 않습니다. --no-pre-lookup 캐시를 시작할 때 DNS 조회를 수행하지 *않음* --ipv6 ipv6만 조회합니다. --ipv4 ipv4만 조회합니다. --insecure 유효하지 않은 인증서를 수락합니다. --connect-to 'example.org:443:localhost:8443'과 같은 문자열로 DNS 확인 및 기본 포트 번호를 재정의합니다. --disable-color 색 구성표를 비활성화합니다. --unix-socket URL의 도메인 대신 Unix 소켓에 연결합니다. HTTPS가 아닌 URL에만 해당됩니다. --stats-success-breakdown 시간 히스토그램 및 분포 통계에 대한 응답 상태 코드 성공 또는 실패 분석 포함 --db-url 성공한 요청을 sqlite 데이터베이스 URL에 쓰기 EG test.db --debug 단일 요청 수행 요청과 응답을 덤프합니다. -h, --help 도움말 인쇄 -V, --version 인쇄 버전
oha
-j
옵션이 설정되면 JSON 출력을 인쇄합니다. JSON 출력의 스키마는 Schema.json에 정의되어 있습니다.
우리는 로컬 서버의 rakyll/hey
에 대해 oha
벤치마킹하기 위해 hyperfine
사용했습니다. 서버는 node.js를 사용하여 코딩되었습니다. 이 파일을 복사하여 붙여 넣은 다음 node.js를 통해 실행하면 서버를 시작할 수 있습니다. 파일을 복사하여 붙여넣은 후 hyperfine
통해 벤치마크를 실행할 수 있습니다.
내용을 app.js라는 새 자바스크립트 파일에 복사하여 붙여넣습니다.
const http = require("http");const 서버 = http.createServer((req, res) => { res.writeHead(200, { "Content-Type": "text/plain" }); res.end("Hello Worldn");});server.listen(3000, () => { console.log("http://localhost:3000/에서 실행 중인 서버");});
node app.js
실행
다른 터미널 탭에서 hyperfine 'oha --no-tui http://localhost:3000' 'hey http://localhost:3000'
실행합니다.
벤치마크 1: oha --no-tui http://localhost:3000
시간(평균±σ): 10.8ms ± 1.8ms [사용자: 5.7ms, 시스템: 11.7ms]
범위(최소 ~ 최대): 8.7ms ~ 24.8ms(107회 실행)
벤치마크 2: 안녕하세요 http://localhost:3000
시간(평균 ± σ): 14.3ms ± 4.6ms [사용자: 12.2ms, 시스템: 19.4ms]
범위(최소 ~ 최대): 11.1ms ~ 48.3ms(88회 실행)
이 벤치마크에서 oha --no-tui http://localhost:3000
hey http://localhost:3000
보다 약 1.32 ± 0.48배 더 빠르게 실행되는 것으로 나타났습니다.
oha
rakyll/hey에서 상속된 기본 옵션을 사용하지만 보다 현실적인 조건에서 스트레스 테스트를 위해 옵션을 변경해야 할 수도 있습니다.
다음 옵션을 사용하여 oha
실행하는 것이 좋습니다.
oha <-z 또는 -n> -c <동시 연결 수> -q <초당 쿼리> --latency-correction --disable-keepalive <대상 주소>
--disable-keepalive
실제로 사용자는 Keep-Alive를 사용하여 동일한 URL을 쿼리하지 않습니다. Keep-Alive
없이 실행하고 싶을 수도 있습니다.
--대기 시간 수정
--latency-correction
사용하면 Coordinated Omission Problem
방지할 수 있습니다.
--burst-rate
옵션과 함께 --burst-delay
사용하여 정의된 요청 수 사이에 지연을 도입할 수 있습니다.
oha -n 10 --burst-delay 2s --burst-rate 4
이 특정 시나리오에서는 2초마다 4개의 요청이 처리되고, 6초 후에는 총 10개의 요청이 처리됩니다. 참고: --burst-rate
옵션을 설정하지 않으면 기본값은 1입니다.
--rand-regex-url
옵션을 사용하여 각 연결에 대해 임의의 URL을 생성할 수 있습니다.
오하 --rand-regex-url http://127.0.0.1/[az][az][0-9]
각 URL은 rand_regex 상자에 의해 생성되지만 정규식의 점은 이 목적에 유용하지 않고 URL의 점이 정규식의 점으로 해석되면 매우 불편하기 때문에 비활성화됩니다.
선택적으로 --max-repeat
옵션을 설정하여 각 정규 표현식의 최대 반복 횟수를 제한할 수 있습니다. 예를 들어 --max-repeat 4
사용하는 http://127.0.0.1/[az]*는 http://127.0.0.1/[az]{0,4}와 같은 URL을 생성합니다.
현재 동적 구성표, 연결 유지 기능이 있는 호스트 및 포트는 제대로 작동하지 않습니다.
우리를 도와주세요!
개선해야 할 몇 가지 문제는 다음과 같습니다.
테스트 작성
tui 디자인을 개선하세요.
추가 정보를 표시하시겠습니까?
이제 실시간 tui에는 색상이 없습니다. 색감이 좀 있으신 분의 도움을 받고 싶습니다.
속도 향상
저는 tokio를 처음 사용합니다. 쿼리 스케줄링을 최적화할 여지가 있다고 생각합니다.