oha เป็นโปรแกรมขนาดเล็กที่ส่งโหลดไปยังเว็บแอปพลิเคชัน และแสดง Tui แบบเรียลไทม์ที่ได้รับแรงบันดาลใจจาก rakyll/hey
โปรแกรมนี้เขียนด้วยภาษา Rust และขับเคลื่อนโดย tokio และ beautiful tui โดย ratatui
โปรแกรมนี้สร้างขึ้นบน Rust ที่เสถียร โดยมีข้อกำหนดเบื้องต้นทั้ง make
และ cmake
เพื่อติดตั้งผ่านทางคาร์โก้
cargo install oha
คุณสามารถเลือกสร้าง Oha เทียบกับ Native-TLs แทน Rustls ได้
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 env ใช้โอฮา
คุณยังสามารถสร้างและสร้างอิมเมจคอนเทนเนอร์รวมถึง oha ได้ด้วย
สร้างนักเทียบท่า -t example.com/hatoo/oha:latest
จากนั้นคุณสามารถใช้ oha ผ่านคอนเทนเนอร์ได้โดยตรง
นักเทียบท่ารัน -it example.com/hatoo/oha:latest https://example.com:3000
คุณสามารถสร้าง oha
ด้วย PGO ได้โดยใช้คำสั่งต่อไปนี้:
ขนมปังรัน pgo.js
และไบนารีจะพร้อมใช้งานที่ target/[target-triple]/pgo/oha
Linux - ทดสอบบน Ubuntu 18.04 gnome-terminal
Windows 10 - ทดสอบบน Windows Powershell
MacOS - ทดสอบบน iTerm2
ตัวเลือก -q
ทำงานแตกต่างจาก rakyll/เฮ้ โดยจะตั้งค่าการค้นหาโดยรวมต่อวินาที แทนที่จะเป็นสำหรับผู้ปฏิบัติงานแต่ละคน
Ohayou(おHAよう) โปรแกรมสร้างโหลด HTTP ซึ่งได้รับแรงบันดาลใจจาก rakyll/hey พร้อมแอนิเมชัน Tui การใช้งาน: โอ้ [ตัวเลือก]อาร์กิวเมนต์: 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 สร้าง URL โดยลัง rand_regex แต่จุดถูกปิดใช้งานสำหรับแต่ละแบบสอบถาม เช่น http://127.0.0.1/[az][az][0-9] รูปแบบไดนามิก โฮสต์ และพอร์ตที่มี Keep-alive ในปัจจุบันทำงานได้ไม่ดีนัก ดู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 ปิดใช้งาน Keep-alive ป้องกันการใช้การเชื่อมต่อ TCP ซ้ำระหว่างคำขอ HTTP ที่แตกต่างกัน ไม่รองรับ HTTP/2 --no-pre-lookup *ไม่ใช่* ทำการค้นหา DNS เมื่อเริ่มต้นเพื่อแคช --ipv6 Lookup only ipv6. --ipv4 ค้นหาเฉพาะ ipv4 --insecure ยอมรับใบรับรองที่ไม่ถูกต้อง --connect-to แทนที่ความละเอียด DNS และหมายเลขพอร์ตเริ่มต้นด้วยสตริงเช่น 'example.org:443:localhost:8443' --disable-color ปิดใช้งานรูปแบบสี --unix-socket เชื่อมต่อกับซ็อกเก็ต unix แทนโดเมนใน URL สำหรับ URL ที่ไม่ใช่ HTTPS เท่านั้น --stats-success-breakdown รวมรหัสสถานะการตอบสนองสำเร็จหรือไม่สำเร็จสำหรับฮิสโตแกรมเวลาและสถิติการกระจาย --db-url เขียนคำขอที่สำเร็จไปยัง URL ฐานข้อมูล sqlite EG test.db --debug ดำเนินการคำขอเดียว และดัมพ์คำขอและการตอบกลับ -h, --help Print help -V, --version Print version
oha
พิมพ์เอาต์พุต JSON เมื่อตั้งค่าตัวเลือก -j
สคีมาของเอาต์พุต JSON ถูกกำหนดไว้ใน schema.json
เราใช้ hyperfine
ในการเปรียบเทียบ oha
กับ rakyll/hey
บนเซิร์ฟเวอร์ภายในเครื่อง เซิร์ฟเวอร์ถูกเข้ารหัสโดยใช้โหนด คุณสามารถเริ่มต้นเซิร์ฟเวอร์ได้โดยการคัดลอกและวางไฟล์นี้แล้วเรียกใช้ผ่านโหนด หลังจากคัดลอกและวางไฟล์แล้ว คุณสามารถเรียกใช้การวัดประสิทธิภาพผ่าน hyperfine
ได้
คัดลอกและวางเนื้อหาลงในไฟล์จาวาสคริปต์ใหม่ที่เรียกว่า app.js
const http = need("http");const server = http.createServer((req, res) => { res.writeHead(200, { "ประเภทเนื้อหา": "ข้อความ/ธรรมดา" }); 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.8 ms ± 1.8 ms [ผู้ใช้: 5.7 ms, ระบบ: 11.7 ms]
ช่วง (ต่ำสุด…สูงสุด): 8.7 ms … 24.8 ms (107 รอบ)
เกณฑ์มาตรฐาน 2: เฮ้ http://localhost:3000
เวลา (เฉลี่ย ± σ): 14.3 ms ± 4.6 ms [ผู้ใช้: 12.2 ms, ระบบ: 19.4 ms]
ช่วง (ต่ำสุด … สูงสุด): 11.1 ms … 48.3 ms (88 รอบ)
ในเกณฑ์มาตรฐานนี้ พบว่า oha --no-tui http://localhost:3000
เร็วกว่า โดยทำงานเร็วกว่าประมาณ 1.32 ± 0.48 เท่า hey http://localhost:3000
oha
ใช้ตัวเลือกเริ่มต้นที่สืบทอดมาจาก rakyll/เฮ้ แต่คุณอาจต้องเปลี่ยนตัวเลือกเพื่อทดสอบความเครียดในสภาพที่สมจริงยิ่งขึ้น
ฉันแนะนำให้รัน oha
ด้วยตัวเลือกต่อไปนี้
โอ้ <-z หรือ -n> -c <จำนวนการเชื่อมต่อพร้อมกัน> -q <แบบสอบถามต่อวินาที> --latency-correction --disable-keepalive
--disable-keepalive
ในความเป็นจริงผู้ใช้ไม่ได้ค้นหา URL เดียวกันโดยใช้ Keep-Alive คุณอาจต้องการทำงานโดยไม่มี Keep-Alive
--การแก้ไขเวลาแฝง
คุณสามารถหลีกเลี่ยง Coordinated Omission Problem
โดยใช้ --latency-correction
คุณสามารถใช้ --burst-delay
พร้อมกับ --burst-rate
ตัวเลือกเพื่อแนะนำความล่าช้าระหว่างจำนวนคำขอที่กำหนด
โอ้ -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 แต่จุดของ regex ถูกปิดใช้งานเนื่องจากไม่มีประโยชน์สำหรับวัตถุประสงค์นี้ และจะไม่สะดวกมากหากจุดของ url ถูกตีความว่าเป็นจุดของ regex
คุณสามารถเลือกตั้งค่าตัวเลือก --max-repeat
เพื่อจำกัดจำนวนการทำซ้ำสูงสุดสำหรับแต่ละ regex เช่น http://127.0.0.1/[az]* ด้วย --max-repeat 4
จะสร้าง url เช่น http://127.0.0.1/[az]{0,4}
รูปแบบไดนามิก โฮสต์ และพอร์ตที่มี Keep-alive ในปัจจุบันทำงานได้ไม่ดีนัก
อย่าลังเลที่จะช่วยเรา!
ต่อไปนี้เป็นปัญหาที่ต้องปรับปรุง
เขียนแบบทดสอบ
ปรับปรุงการออกแบบตุย
แสดงข้อมูลเพิ่มเติม?
ตอนนี้ทุยเรียลไทม์ไม่มีสีแล้ว ฉันต้องการความช่วยเหลือจากคนที่มีความรู้สึกด้านสี
ปรับปรุงความเร็ว
ฉันยังใหม่กับโตเกียว ฉันคิดว่ามีพื้นที่บางส่วนในการเพิ่มประสิทธิภาพการตั้งเวลาสืบค้น