oha adalah program kecil yang mengirimkan beberapa muatan ke aplikasi web dan menampilkan tui waktu nyata yang terinspirasi oleh rakyll/hei.
Program ini ditulis dalam Rust dan didukung oleh tokio dan tui cantik dari ratatui.
Program ini dibangun di atas Rust yang stabil, dengan prasyarat make
dan cmake
untuk dipasang melalui kargo.
cargo install oha
Secara opsional, Anda dapat membuat oha dengan native-tls, bukannya rusticl.
cargo install --no-default-features --features rustls oha
Anda dapat mengaktifkan dukungan VSOCK dengan mengaktifkan fitur 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
Anda dapat menginstal dengan x-cmd.
x env gunakan oha
Anda juga dapat membuat dan membuat image container termasuk oha
membangun buruh pelabuhan. -t example.com/hatoo/oha:terbaru
Kemudian Anda bisa menggunakan oha langsung melalui wadahnya
jalankan buruh pelabuhan -it example.com/hatoo/oha:latest https://example.com:3000
Anda dapat membangun oha
dengan PGO dengan menggunakan perintah berikut:
bun jalankan pgo.js
Dan biner akan tersedia di target/[target-triple]/pgo/oha
.
Linux - Diuji pada terminal gnome Ubuntu 18.04
Windows 10 - Diuji pada Windows Powershell
MacOS - Diuji pada iTerm2
Opsi -q
berfungsi berbeda dari rakyll/hei. Ini menetapkan kueri keseluruhan per detik, bukan untuk setiap pekerja.
Ohayou(おはよう), generator beban HTTP, terinspirasi oleh rakyll/hey dengan animasi tui. Penggunaan: oha [PILIHAN]Argumen: URL target. Pilihan: -n Jumlah permintaan yang akan dijalankan. [standar: 200] -c Jumlah koneksi yang dijalankan secara bersamaan. Anda mungkin harus menambah batas jumlah file yang terbuka untuk `-c` yang lebih besar. [standar: 50] -p Jumlah permintaan paralel untuk dikirim pada HTTP/2. `oha` akan menjalankan c * p pekerja secara bersamaan secara total. [standar: 1] -z Durasi aplikasi untuk mengirim permintaan. Jika durasi ditentukan, n diabaikan. Di HTTP/1, Ketika durasinya tercapai, permintaan yang sedang berlangsung dibatalkan dan dihitung sebagai "dibatalkan karena tenggat waktu" Anda dapat mengubah perilaku ini dengan opsi `-w`. Saat ini, di HTTP/2, Ketika durasinya tercapai, permintaan yang sedang berlangsung akan menunggu. Opsi `-w` diabaikan. Contoh: -z 10s -z 3m. -w, --tunggu-permintaan-berkelanjutan-setelah-tenggat waktu Ketika durasinya tercapai, permintaan yang sedang berlangsung akan menunggu -q Batas tarif untuk semua, dalam kueri per detik (QPS) --burst-delay Memperkenalkan penundaan antara sejumlah permintaan yang telah ditentukan sebelumnya. Catatan: Jika qps ditentukan, burst akan diabaikan --burst-rate Tarif permintaan untuk burst. Standarnya adalah 1 Catatan: Jika qps ditentukan, burst akan diabaikan --rand-regex-url Hasilkan URL dengan peti rand_regex tetapi titik dinonaktifkan untuk setiap kueri misalnya http://127.0.0.1/[az][az][0-9]. Saat ini skema dinamis, host dan port dengan keep-alive tidak berfungsi dengan baik. Lihat https://docs.rs/rand_regex/latest/rand_regex/struct.Regex.html untuk detail sintaksis. --max-repeat Parameter untuk '--rand-regex-url'. Parameter max_repeat memberikan jumlah pengulangan ekstra maksimum yang akan dihasilkan oleh operator x*, x+ dan x{n,}. [standar: 4] --dump-urls Buang Url target kali untuk melakukan debug --rand-regex-url --koreksi latensi Perbaiki latensi untuk menghindari masalah kelalaian terkoordinasi. Ini diabaikan jika -q tidak disetel. --no-tui Tidak ada tui realtime -j, --json Cetak hasil sebagai JSON --fps Frame per detik untuk tui. [default: 16] -m, --method Metode HTTP [default: GET] -H Header HTTP khusus. Contoh: -H "foo: bar" -t Batas waktu untuk setiap permintaan. Defaultnya adalah tak terbatas. -Sebuah Header Terima HTTP . -d isi permintaan HTTP. -D isi permintaan HTTP dari file. -T Tipe Konten. -a Otentikasi dasar, nama pengguna: kata sandi --versi http versi HTTP. Nilai yang tersedia 0.9, 1.0, 1.1. --http2 Gunakan HTTP/2. Singkatan dari --http-version=2 --host HTTP Host header --disable-compression Nonaktifkan kompresi. -r, --redirect Batas jumlah Redirect. Tetapkan 0 untuk tidak ada pengalihan. Pengalihan tidak didukung untuk HTTP/2. [standar: 10] --nonaktifkan-keepalive Nonaktifkan keep-alive, cegah penggunaan kembali koneksi TCP antara permintaan HTTP yang berbeda. Ini tidak didukung untuk HTTP/2. --no-pre-lookup *Tidak* melakukan pencarian DNS di awal untuk menyimpannya dalam cache --ipv6 Cari hanya ipv6. --ipv4 Cari hanya ipv4. --insecure Menerima sertifikat yang tidak valid. --connect-to Ganti resolusi DNS dan nomor port default dengan string seperti 'example.org:443:localhost:8443' --disable-color Nonaktifkan skema warna. --unix-socket Hubungkan ke soket unix alih-alih domain di URL. Hanya untuk URL non-HTTPS. --stats-success-breakdown Sertakan kode status respons perincian berhasil atau tidak berhasil untuk histogram waktu dan statistik distribusi --db-url Tulis permintaan yang berhasil ke url database sqlite EG test.db --debug Lakukan satu permintaan dan membuang permintaan dan tanggapan -h, --help Cetak bantuan -V, --version Versi cetak
oha
mencetak keluaran JSON ketika opsi -j
disetel. Skema keluaran JSON ditentukan di skema.json.
Kami menggunakan hyperfine
untuk membandingkan oha
dengan rakyll/hey
di server lokal. Server diberi kode menggunakan node. Anda dapat memulai server dengan menyalin dan menempelkan file ini dan kemudian menjalankannya melalui node.js. Setelah menyalin-menempelkan file, Anda dapat menjalankan benchmark melalui hyperfine
.
Salin-tempel konten ke dalam file javascript baru bernama app.js
const http = memerlukan("http");const server = http.createServer((req, res) => { res.writeHead(200, { "Tipe Konten": "teks/polos" }); res.end("Halo Dunia");});server.listen(3000, () => { console.log("Server berjalan di http://localhost:3000/");});
Jalankan node app.js
Jalankan hyperfine 'oha --no-tui http://localhost:3000' 'hey http://localhost:3000'
di tab terminal yang berbeda
Tolok ukur 1: oha --no-tui http://localhost:3000
Waktu (rata-rata ± σ): 10,8 mdtk ± 1,8 mdtk [Pengguna: 5,7 mdtk, Sistem: 11,7 mdtk]
Jangkauan (min… maks): 8,7 mdtk … 24,8 mdtk (107 putaran)
Tolok ukur 2: hai http://localhost:3000
Waktu (rata-rata ± σ): 14,3 mdtk ± 4,6 mdtk [Pengguna: 12,2 mdtk, Sistem: 19,4 mdtk]
Jangkauan (min … maks): 11,1 mdtk … 48,3 mdtk (88 putaran)
Dalam benchmark ini, oha --no-tui http://localhost:3000
ditemukan lebih cepat, berjalan sekitar 1,32 ± 0,48 kali lebih cepat daripada hey http://localhost:3000
.
oha
menggunakan opsi default yang diwarisi dari rakyll/hey tetapi Anda mungkin perlu mengubah opsi ke stress test dalam kondisi yang lebih realistis.
Saya menyarankan untuk menjalankan oha
dengan opsi berikut.
oha <-z atau -n> -c-q --koreksi latensi --disable-keepalive
--nonaktifkan-keepalive
Sebenarnya, pengguna tidak menanyakan URL yang sama menggunakan Keep-Alive. Anda mungkin ingin berlari tanpa Keep-Alive
.
--koreksi latensi
Anda dapat menghindari Coordinated Omission Problem
dengan menggunakan --latency-correction
.
Anda dapat menggunakan opsi --burst-delay
bersama dengan --burst-rate
untuk menimbulkan penundaan di antara sejumlah permintaan yang ditentukan.
oha -n 10 --burst-delay 2s --burst-rate 4
Dalam skenario khusus ini, setiap 2 detik, 4 permintaan akan diproses, dan setelah 6 detik, total 10 permintaan akan diproses. CATATAN: Jika Anda tidak menyetel opsi --burst-rate
, jumlah defaultnya adalah 1
Anda dapat menggunakan opsi --rand-regex-url
untuk menghasilkan url acak untuk setiap koneksi.
oha --rand-regex-url http://127.0.0.1/[az][az][0-9]
Setiap Url dihasilkan oleh peti rand_regex tetapi titik regex dinonaktifkan karena tidak berguna untuk tujuan ini dan sangat merepotkan jika titik-titik url ditafsirkan sebagai titik regex.
Secara opsional, Anda dapat mengatur opsi --max-repeat
untuk membatasi jumlah pengulangan maksimal untuk setiap ekspresi reguler. misalnya http://127.0.0.1/[az]* dengan --max-repeat 4
akan menghasilkan url seperti http://127.0.0.1/[az]{0,4}
Saat ini skema dinamis, host dan port dengan keep-alive tidak berfungsi dengan baik.
Jangan ragu untuk membantu kami!
Berikut beberapa masalah yang perlu diperbaiki.
Tes tulis
Tingkatkan desain tui.
Tampilkan informasi lebih lanjut?
Tidak ada warna dalam tui waktu nyata sekarang. Saya ingin bantuan dari seseorang yang memiliki indra warna.
Tingkatkan kecepatan
Aku baru mengenal Tokyo. Saya pikir ada beberapa ruang untuk mengoptimalkan penjadwalan kueri.