oha هو برنامج صغير يرسل بعض التحميل إلى تطبيق ويب ويعرض tui في الوقت الفعلي مستوحى من rakyll/hey.
هذا البرنامج مكتوب بلغة Rust ومدعوم من طوكيو وجميل توي من راتاتوي.
تم بناء هذا البرنامج على نظام 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
يمكنك أيضًا إنشاء وإنشاء صورة حاوية تتضمن oha
بناء عامل ميناء . -t example.com/hatoo/oha:latest
ثم يمكنك استخدام أوها مباشرة من خلال الحاوية
تشغيل عامل ميناء -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/hey. يتم تعيين الاستعلام العام في الثانية بدلاً من كل عامل.
Ohayyou(おはよう)، مولد تحميل HTTP، مستوحى من rakyll/hey مع الرسوم المتحركة tui. الاستخدام: oha [خيارات]الوسائط: عنوان 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, --wait-ongoing-requests-after-deadline عند الوصول إلى المدة، يتم انتظار الطلبات الجارية -q حد المعدل للجميع، بالاستعلامات في الثانية (QPS) --burst-delay يقدم تأخيرًا بين عدد محدد مسبقًا من الطلبات. ملاحظة: إذا تم تحديد QPS، فسيتم تجاهل الاندفاع - معدل الاندفاع معدلات طلبات الاندفاع. الافتراضي هو 1 ملاحظة: إذا تم تحديد QPS، فسيتم تجاهل الاندفاع --rand-regex-url قم بإنشاء عنوان URL بواسطة صندوق rand_regex ولكن يتم تعطيل النقطة لكل استعلام، على سبيل المثال 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 مهلة لكل طلب. الافتراضي إلى ما لا نهاية. - رأس قبول HTTP . -d نص طلب HTTP. -D نص طلب HTTP من الملف. -T نوع المحتوى. - مصادقة أساسية ، اسم المستخدم: كلمة المرور --إصدار http إصدار 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 تعطيل الاستمرارية، ويمنع إعادة استخدام اتصالات TCP بين طلبات HTTP المختلفة. وهذا غير مدعوم لـ HTTP/2. --no-pre-lookup *Not* قم بإجراء بحث DNS في البداية لتخزينه مؤقتًا --ipv6 Lookup فقط ipv6. --ipv4 بحث IPv4 فقط. - غير آمن قبول الشهادات غير الصالحة. --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 مساعدة الطباعة -V, --version نسخة الطباعة
يقوم oha
بطباعة مخرجات JSON عند ضبط الخيار -j
. يتم تعريف مخطط إخراج JSON في schema.json.
لقد استخدمنا hyperfine
لقياس أداء oha
مقابل rakyll/hey
على خادم محلي. تم ترميز الخادم باستخدام العقدة. يمكنك بدء تشغيل الخادم عن طريق نسخ ولصق هذا الملف ثم تشغيله عبر العقدة. بعد نسخ الملف ولصقه، يمكنك تشغيل المعيار عبر hyperfine
.
انسخ المحتويات والصقه في ملف جافا سكريبت جديد يسمى app.js
const http = require("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 مللي ثانية ± 1.8 مللي ثانية [المستخدم: 5.7 مللي ثانية، النظام: 11.7 مللي ثانية]
النطاق (الحد الأدنى … الحد الأقصى): 8.7 مللي ثانية … 24.8 مللي ثانية (107 أشواط)
المعيار 2: مرحبًا http://localhost:3000
الوقت (المتوسط ± σ): 14.3 مللي ثانية ± 4.6 مللي ثانية [المستخدم: 12.2 مللي ثانية، النظام: 19.4 مللي ثانية]
النطاق (الحد الأدنى … الحد الأقصى): 11.1 مللي ثانية … 48.3 مللي ثانية (88 تشغيلًا)
في هذا المعيار، تبين أن oha --no-tui http://localhost:3000
أسرع، حيث يعمل تقريبًا 1.32 ± 0.48 مرة أسرع من hey http://localhost:3000
.
يستخدم oha
الخيارات الافتراضية الموروثة من rakyll/hey ولكن قد تحتاج إلى تغيير الخيارات لاختبار التحمل في حالة أكثر واقعية.
أقترح تشغيل oha
بالخيارات التالية.
oha <-z أو -n> -c <عدد الاتصالات المتزامنة> -q <الاستعلام في الثانية> --تصحيح زمن الاستجابة --تعطيل الحفاظ على الحياة
--disable-keepalive
في الواقع، لا يقوم المستخدم بالاستعلام عن نفس عنوان URL باستخدام Keep-Alive. قد ترغب في الركض بدون Keep-Alive
.
--تصحيح الكمون
يمكنك تجنب Coordinated Omission Problem
باستخدام --latency-correction
.
يمكنك استخدام --burst-delay
مع خيار --burst-rate
لإدخال تأخير بين عدد محدد من الطلبات.
oha -n 10 --تأخير الانفجار 2 ثانية --معدل الانفجار 4
في هذا السيناريو تحديدًا، ستتم معالجة 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
للحد الأقصى لعدد التكرار لكل تعبير عادي. على سبيل المثال، سيؤدي http://127.0.0.1/[az]* مع --max-repeat 4
إلى إنشاء عنوان URL مثل http://127.0.0.1/[az]{0,4}
حاليًا، لا يعمل المخطط الديناميكي والمضيف والمنفذ مع خاصية البقاء على قيد الحياة بشكل جيد.
لا تتردد في مساعدتنا!
فيما يلي بعض المشكلات التي تحتاج إلى تحسين.
كتابة الاختبارات
تحسين تصميم توي.
إظهار المزيد من المعلومات؟
لا يوجد لون في الوقت الحقيقي توي الآن. أريد المساعدة من شخص لديه بعض الحس اللوني.
تحسين السرعة
أنا جديد في طوكيو. أعتقد أن هناك بعض المساحة لتحسين جدولة الاستعلام.