انتقل إلى المحتوى

اختبار الحمل لطلب HTTP ​

يمكن لعقدة طلب HTTP أن ترسل طلبها مرات كثيرة، وفق ملف تعريف بعدد الطلبات في الثانية، وعددًا منها في آن واحد — وأن تقيس ما يعود: مئينات زمن الاستجابة، والأخطاء، والمعدل الذي بلغته. وتقرر العتبات هل تنجح الخطوة، ويضع الزر مقارنة الأرقام بجانب أرقام تشغيل سابق.

الحمل إعداد في العقدة، لا عقدة قائمة بذاتها: فبقية التجربة — المحاكيات ومرحّلات الإضعاف والفروع الأخرى — تعمل حوله كالمعتاد.

وضع طلب تحت الحمل ​

  1. تحديد عقدة طلب HTTP وملء طلبها.
  2. في خصائصها، تفعيل الخيار الإرسال تحت الحمل.
  3. اختيار ملف التعريف وأرقامه. يرسم المخطط الذي تحتها، المعدل عبر الزمن، المعدل، ويذكر إلى كم طلبًا يبلغ مجموعه، في كم ثانية.
  4. تعيين في آن واحد — كم طلبًا يمكن أن يكون قيد التنفيذ في آن واحد.
  5. إضافة العتبات أو تغييرها.
  6. تشغيل التجربة.

يبدأ الحمل بـ تصاعد من 0 إلى 100 طلب في الثانية خلال 30,000 ms، بـ 32 طلبًا في آن واحد، مع عتبتين: p95 أقل من 500 ms، والأخطاء أقل من 1%.

يحل الحمل محل التكرار وإعادة المحاولة. وتفعيله يعطّلهما، وتُرفض العقدة التي فيها حمل وأحدهما (node.load_alone): فالطلب الفاشل يُعدّ ولا يُعاد. ولا يعمل تحت الحمل إلا طلب HTTP (node.load_unsupported).

يُقرأ الطلب مرة واحدة. تُحلّ قوالبه عند بدء الخطوة، فيكون كل طلب في الحمل هو الطلب نفسه: يأخذ {{counter}} و{{uuid}} قيمة واحدة لها جميعًا. انظر القوالب.

عميل واحد للحمل كله. تتشارك الطلبات مخزن ملفات تعريف الارتباط الخاص بالتشغيل حين يكون الخيار الاحتفاظ بملفات تعريف الارتباط بين الطلبات مفعّلًا، وذاكرة Digest واحدة، فيجيب تحدٍّ واحد عنها جميعًا. ولكل طلب مهلة العقدة نفسها.

يتلقى الفاحص عيّنة: تبادل واحد على الأكثر كل 100 ms، حتى لا يغمر الحمل الفاحص.

ملفات التعريف ​

ملف التعريفالإعداداتالمعدل عبر الزمن
ثابتالمعدل، طلب/ث، المدة، msالمعدل نفسه طوال المدة
تصاعدمن، طلب/ث، إلى، طلب/ث، المدة، msفي خط مستقيم من معدل إلى آخر
درجاتمن، طلب/ث، الدرجة، طلب/ث، كل درجة، ms، الدرجاتالمعدل الأول، ثم درجة إضافية عند كل مستوى، ولكل مستوى المدة نفسها
طفرةالأساس، طلب/ث، الذروة، طلب/ث، موعد الطفرة، ms، مدة الطفرة، ms، المدة، msمعدل الأساس، ثم الذروة لبعض الوقت من لحظة محددة، ثم معدل الأساس مجددًا
عشوائيالمعدل، طلب/ث، المدة، msوصول عشوائي، بالمعدل نفسه في المتوسط

يُبقي تبديل الشكل ما ينتقل معه: مدة التشغيل وأعلى معدل يبلغه.

الحدود ​

الإعدادالنطاق
المعدل، طلب/ث في ثابت وعشوائي، والذروة، طلب/ث0.1–100,000 طلب/ث
من، طلب/ث، إلى، طلب/ث، الأساس، طلب/ث0–100,000 طلب/ث
كل مستوى في درجات، بما فيه الأخير0–100,000 طلب/ث؛ ويمكن أن تكون الدرجة سالبة
المدة، ms، كل درجة، ms100–300,000 ms
الدرجات1–100، وجميع المستويات معًا 300,000 ms على الأكثر
الطفرةأطول من 0 ms، وتنتهي قبل نهاية المدة
في آن واحد1–512
العتبات16 على الأكثر، وقيمة كلٍّ منها رقم، 0 أو أكثر

يُرفض ملف التعريف الذي لا يبلغ مجموعه أي طلب (load.nothing_planned). والمعدلات هي معدلات دفعة HTTP.

يمكن أن يستمر ملف التعريف بقدر التشغيل كله، 300 ث — لكن الحد الزمني للتشغيل يحسب كل الخطوات، فيلزم ترك متسع لبقية التجربة.

كم طلبًا ​

طلبات ملف التعريف هي معدله مجموعًا عبر الزمن:

ملف التعريفالطلبات
ثابت، 100/ث لمدة 1000 ms100
تصاعد، من 0 إلى 100/ث خلال 2000 ms100
درجات، من 10/ث بزيادة 10/ث، 3 مستويات من 1000 ms60 (10 + 20 + 30)
طفرة، 10/ث مع 100/ث من 1000 ms لمدة 500 ms، و2000 ms في المجموع65
عشوائي، 200/ث لمدة 10,000 ms2000 في المتوسط

الجدول الزمني ​

يحين موعد الطلب رقم n في اللحظة التي يبلغ فيها عدّ ملف التعريف n — والأول فورًا. تُحسب كل لحظة من بداية الحمل، فلا يزحزح استيقاظ متأخر الطلباتِ التي تليه، ويكون المعدل الذي يصفه ملف التعريف هو المعدل المطلوب.

يسحب عشوائي الفواصل بين الطلبات عشوائيًا، من بذرة التشغيل: البذرة نفسها تعطي اللحظات نفسها، فيمكن تكرار حمل عشوائي بالضبط. انظر البذور.

الطلبات الفائتة. يكون عدد الطلبات قيد التنفيذ في آن واحد على الأكثر. وحين تنتظر كلها ردودها، ينتظر الطلب التالي خانة شاغرة. وإن كان سيخرج بعد أكثر من 50 ms من موعده، فلا يُرسل متأخرًا: يُتخطى ويُعدّ فائتًا، مع كل طلب آخر حان موعده في الأثناء، ويستمر الحمل بأول طلب لا يزال في موعده. وكثرة الطلبات الفائتة تعني أن الخادم، أو في آن واحد، لم يستطع مجاراة ملف التعريف.

أثناء التشغيل ​

مرة كل ثانية يعرض الخط الزمني الخطوة بوصفها تحت الحمل، مع الثواني المنقضية، والطلبات المرسلة، والمعدل خلال الثانية الأخيرة، وp95 حتى الآن، والطلبات الفاشلة. ويُنهي الزر إيقاف الحمل فورًا ويُسقط الطلبات قيد التنفيذ؛ وفشل في فرع آخر يُنهيه خلال ثانية.

ما يُقاس ​

بعد آخر رد، تحمل الخطوة قياساتها، محفوظةً في آخر حدث لها في الخط الزمني وفي تقرير التشغيل:

القياسما هو
plannedالطلبات التي يبلغها مجموع ملف التعريف (عشوائي: في المتوسط)
sentالطلبات التي أُجيب عنها أو فشلت
okما أُجيب عنه بحالة 2xx
failedأي حالة أخرى، أو انعدام الرد أصلًا
missedما حان موعده والخانات كلها مشغولة، فتُخطي
rpsالطلبات المرسلة في الثانية: sent ÷ مدة ملف التعريف — أو ÷ الزمن حتى خروج آخر طلب، إن كان ذلك أبعد
error_ratefailed، بنسبة % من sent
min, mean, maxأسرع طلب، ومتوسطها، وأبطؤها، بـ ms
p50, p90, p95, p99زمن الاستجابة الذي كان 50 و90 و95 و99% من الطلبات عنده أو دونه، بـ ms
received_bytesبايتات المتن المستقبَلة في المجموع
statusesالطلبات حسب الحالة (200، 503)، وإن لم تكن هناك حالة فحسب السبب (timeout، refused، reset …)
secondsكل ثانية من ملف التعريف: الطلبات المرسلة، والفاشلة، ومتوسط زمنها
histogramالطلبات حسب زمن الاستجابة، حتى 1 و2 و5 و10 و20 و50 و100 و200 و500 و1000 و2000 و5000 و10,000 ms، وما هو أبطأ

يمتد زمن استجابة الطلب من إرساله حتى قراءة رده كاملًا، ويُحسب الطلب الفاشل بالزمن الذي استغرقه حتى فشل. وتُقرأ المئينات من سلال لوغاريتمية بعرض 1%، وتقع في حدود 0.5% من القيمة الحقيقية، مهما طال الحمل.

العتبات ​

العتبة صف من المقياس والمقارنة والقيمة؛ ويضيف الزر عتبة واحدة.

المقياسيُقرأ بـ
p50، p90، p95، p99ms
المتوسط، الأبطأms
الأخطاء% من الطلبات المرسلة
المعدلالطلبات في الثانية المحقَّقة
الفائتةطلبات

المقارنة هي إحدى < و≤ و> و≥. وبعض الأمثلة الشائعة:

المقياسالمقارنةالقيمةتفشل الخطوة حين
p95<300استغرق طلب من كل عشرين أو أكثر 300 ms أو أطول
الأخطاء<1فشل 1% أو أكثر من الطلبات
المعدل≥180لم يستطع الخادم استقبال 180 طلبًا في الثانية
الفائتة≤0اضطُرّ إلى تخطي طلب واحد

تُكتب العتبة في الملف هكذا: { "metric": "p95_ms", "op": "lt", "value": 300 }؛ والمقاييس هي p50_ms وp90_ms وp95_ms وp99_ms وmean_ms وmax_ms وerror_rate وrps وmissed، والمقارنات lt وle وgt وge.

تُقرأ العتبات بعد آخر رد، بترتيبها. وتفشل الخطوة عند أول عتبة لا تتحقق (load.threshold)، وتذكر رسالتها العتبة والقيمة المقيسة، ويفشل التشغيل معها. ومن دون عتبات ينجح الحمل مهما كان ما قاسه. وحين ينهي فشلُ فرع آخر الحملَ مبكرًا، يكون ذلك الفشل هو فشل التشغيل، لا عتبة.

النتيجة ​

حين تنجح الخطوة، يلخّصها الخط الزمني: الطلبات، والمعدل، وp95، ونسبة ما فشل. وبتحديد العقدة تعرض خصائصها حمل آخر تشغيل —

  • كل عتبة، ✓ متحققة أو ✕ غير متحققة، مع القيمة المقيسة؛
  • المرسلة، وطلب/ث، والأخطاء مع نسبتها، والفائتة؛
  • p50، وp90، وp95، وp99، والمتوسط، والأقصى؛
  • كل ثانية: طلبات كل ثانية، والفاشلة منها بالأحمر، ومتوسط زمنها خطًّا؛
  • أزمنة الانتقال: كم طلبًا استغرق كم من الزمن؛
  • الحالات والأسباب، ومعها عدد كلٍّ منها.

ويطبع سطر الأوامر الأرقام نفسها وحكم كل عتبة؛ انظر signallab run.

مقارنة تشغيلين ​

  1. تشغيل التجربة مرتين، أو أكثر.
  2. في الخط الزمني، الضغط على مقارنة. يظهر الزر حين يحفظ تشغيل تقريره، ويكون معطّلًا أثناء جريان تشغيل.
  3. آخر تشغيل هو بعد، والذي قبله قبل؛ وتتيح كل قائمة اختيار تشغيل آخر.

تضم القائمتان تشغيلات هذه التجربة — باسمها — من التقارير الموجودة في مجلد البيانات، الأحدث أولًا، 50 على الأكثر: لكلٍّ منها تاريخه ووقته وكيف انتهى وبذرته. وتظهر فيها أيضًا التشغيلات من سطر الأوامر إن استخدم مجلد البيانات نفسه. وإعادة تسمية التجربة تبدأ سجلًّا جديدًا.

وفي كل خطوة حمل، مطابَقةً بالعقدة، يعرض جدول كل مقياس قبل وبعد والتغيّر، بالوحدة وبالنسبة %. والتغيّر في الاتجاه الخاطئ بنسبة 5% أو أكثر — أبطأ، أو أخطاء أكثر، أو طلبات فائتة أكثر، أو معدل أدنى — هو تراجع ويظهر بالأحمر؛ والانتقال من لا شيء إلى شيء يُعدّ كذلك. وتحت الجدول حكم كل عتبة في التشغيلين. وخطوة الحمل التي لا توجد إلا في أحد التشغيلين تُوسَم بـ قبل فقط أو بعد فقط، دون تغيّرات. والتشغيلات التي لا خطوات حمل فيها تعرض لا خطوات حمل في هذه التشغيلات.

ومن سكربت، يسرد experiment_runs التشغيلات، ويقارن experiment_compare بين اثنين منها، باسم ملف تقريرهما؛ ويتيح signallab mcp الشيء نفسه لمساعد (MCP).

التحقق بعد الحمل ​

لا يترك الحمل ردًّا خاصًّا به: فهو يُقاس ولا يُفحص. والتحقق أو استخراج قيمة بعده يحتاج إلى طلب آخر بلا حمل قبله على كل مسار، وإلا لم تعمل التجربة (graph.needs_http). ولفحص رد واحد من الـ API تحت الحمل، توضع عقدة طلب HTTP عادية بعد الحمل، أو في فرع موازٍ بجانبه.

ويرسل إرسال الآن على عقدة تحت الحمل طلبها مرة واحدة.