المستخدمون المتزامنون ونماذج عبء العمل
تصف متطلبات الأداء الحمل عادةً بعدد الأشخاص، مثل «يجب أن تدعم البوابة 2,000 مستخدم متزامن»، بينما تعمل الخوادم وأدوات الحمل بالمعدّلات. المستخدمون المتزامنون (Concurrent Users) هم الأشخاص الذين لديهم جلسة (Session) نشطة، أي زيارة واحدة من أول صفحة حتى المغادرة، في الفترة نفسها، ومعظمهم يقرأ أو يكتب أو يقرّر، ولا ينتظر الخادم. أما الطلبات في الثانية (Requests per Second, RPS) فهي عدد الطلبات التي تصل، أو تكتمل، كل ثانية. ونموذج عبء العمل (Workload Model) يربط بين الاثنين: أيّ رحلات يؤديها المستخدمون وبأي مزيج، وبأي سرعة يصلون، وكم يتوقفون بين الخطوات (زمن التفكير، Think Time)، وكم مرة يكرر كل مستخدم محاكى رحلته (الإيقاع، Pacing).
مثال ذلك: 1,350 متسوّقاً في ذروة المساء لدى متجر إلكتروني قد لا يرسلون إلا 90 طلباً في الثانية. ويربط قانون ليتل (Little’s Law) بين أرقام كهذه، ويكشف بسرعة هل طبّق الاختبار فعلاً الحمل الذي يدّعيه.
لماذا يهم
لا يكون لاختبار الحمل معنى إلا بقدر واقعية الحمل الذي يطبّقه. شغّل 1,350 مستخدماً افتراضياً بلا توقف، فسيرسلون آلاف الطلبات في الثانية بدلاً من 90، وقد يفشل النظام في اختبار لا علاقة له بالواقع. وشغّل العدد الصحيح من المستخدمين على الصفحة الرئيسية وحدها، فتجيب ذاكرة التخزين المؤقت (Cache) عن كل شيء، بينما لا تتعرّض رحلة إتمام الشراء (Checkout)، التي تُنشئ طلبات الشراء وتستدعي مزوّد خدمة الدفع، لأي حمل.
وبالنسبة إلى المختبِر، فالنموذج وسيلته لمساءلة المتطلبات وقراءة النتائج: فعبارة «تدعم 2,000 مستخدم» لا يمكن اختبارها حتى يحدد أحدٌ أيّ مستخدمين، يفعلون ماذا، وبأي معدّل.
المستخدمون المتزامنون والطلبات قيد المعالجة والطلبات في الثانية
ثلاثة أرقام يكثر الخلط بينها. المستخدمون المتزامنون لديهم جلسة نشطة خلال الفترة نفسها، سواء أكانوا ينتظرون استجابة الآن أم لا. والطلبات قيد المعالجة (Requests in Flight)، وتسمّى أحياناً الطلبات المتزامنة، هي ما يعالجه الخادم في لحظة واحدة. أما الطلبات في الثانية فمعدّل لوصول الطلبات أو اكتمالها؛ ومعدّل الاكتمال هو الإنتاجية (Throughput)، وهو يساوي معدّل الوصول ما دام النظام يواكب الحمل.
وتضيف أدوات الحمل مصطلحاً رابعاً: المستخدم الافتراضي (Virtual User, VU)، وهو نسخة عاملة من سكربت الاختبار تؤدي دور مستخدم واحد. فالمستخدم الافتراضي الذي يتوقف كما يتوقف الإنسان يعادل مستخدماً متزامناً واحداً، أما الذي لا يتوقف فيُنتج حركة أشخاص كثيرين. وبعض الفرق تقول «المستخدمون المتزامنون» وتقصد الطلبات قيد المعالجة، فاسأل أيّهما يقصد المتطلب.
مكوّنات نموذج عبء العمل
يصف نموذج عبء العمل الحمل الذي يجب أن يطبّقه الاختبار ليشبه بيئة الإنتاج. ويسمّي منهج ISTQB لاختبار الأداء نمطَ ما يفعله المستخدمون الملفَّ التشغيلي (Operational Profile)؛ أما ملف الحمل (Load Profile) فيحدد كم مستخدماً افتراضياً ينفّذ أيّ ملفات تشغيلية خلال فترة زمنية، مثل تصاعد تدريجي (Ramp-up) تليه حالة مستقرة (Steady State). ابنِ النموذج من أدلة: التحليلات أو سجلات الوصول أو بيانات المراقبة أو توقعات الأعمال.
وقرّر أيضاً كيف يُولَّد الحمل. في النموذج المغلق (Closed Model) يدور عدد ثابت من المستخدمين الافتراضيين في رحلاتهم، ولا يرسل كلٌّ منهم طلبه التالي إلا بعد انتهاء السابق، فإذا تباطأ النظام تلقّى طلبات أقل وخفّف الاختبار حمله من تلقاء نفسه. وفي النموذج المفتوح (Open Model) يصل المستخدمون بمعدّل محدد مهما كان زمن الاستجابة، فإذا تباطأ النظام تراكم العمل. وفي k6 يمثّل constant-vus نموذجاً مغلقاً وconstant-arrival-rate نموذجاً مفتوحاً. استخدم النموذج المفتوح للمواقع والواجهات البرمجية العامة، والمغلق لمجموعة ثابتة مثل 200 موظف في مركز اتصال.
- الرحلات: رحلات المستخدم المهمة، مثل البحث وإتمام الشراء، وكل رحلة سلسلة من الطلبات.
- المزيج: نصيب كل رحلة من الجلسات، مثلاً 50% تصفّح و15% إتمام شراء.
- المعدّل: عدد الجلسات التي تبدأ في الثانية خلال الفترة المختبَرة، وهي عادةً ساعة الذروة.
- البيانات: ما يكفي من المستخدمين والمنتجات وعبارات البحث المختلفة لتتصرّف ذاكرة التخزين المؤقت كما في الإنتاج.
جرّبها: مولّد بيانات اختبار الأداء جرّبها: مولّد بيانات اختبار التحميل
زمن التفكير والإيقاع
زمن التفكير هو التوقف الذي يأخذه المستخدم الحقيقي بين خطوتين من رحلته: قراءة صفحة، أو كتابة عنوان. ومكانه في السكربت بين الطلبات. خذه من التحليلات (الوقت المستغرق في الصفحة) وغيّره عشوائياً، مثلاً بين 15 و24 ثانية بدلاً من 19.5 ثانية ثابتة، حتى لا يتحرك المستخدمون الافتراضيون بخطى متطابقة فتصل طلباتهم إلى الخادم في موجات. يضيفه JMeter بمؤقّتات مثل المؤقّت العشوائي المنتظم (Uniform Random Timer)، ويضيفه k6 باستدعاء sleep().
الإيقاع هو الفاصل بين بداية تكرار (Iteration) واحد، أي رحلة كاملة، وبداية التكرار التالي للمستخدم الافتراضي نفسه. فمع إيقاع 300 ثانية ورحلة تستغرق 240 ثانية ينتظر المستخدم الافتراضي 60 ثانية، فيبدأ عملية إتمام شراء واحدة كل خمس دقائق. وإذا تباطأ النظام فاستغرقت الرحلة أكثر من 300 ثانية فات المعدّل المخطط، وهذا في حدّ ذاته نتيجة تستحق التسجيل.
One virtual user, checkout journey: 12 requests, pacing 300 s
Each step: ~0.5 s response + think time, random 15-24 s (mean 19.5 s)
time what the virtual user does
0 s request 1: view cart, then think
20 s request 2: enter address, then think
... requests 3 to 11, about 20 s apart
220 s request 12: confirm payment, then think
240 s journey done, wait 60 s for the next pacing slot
300 s iteration 2 starts: request 1: view cart
Think time = pause between requests inside one journey
Pacing = start of one journey to start of the nextجرّبها: مولّد بيانات اختبار الأداء جرّبها: مولّد اختبارات الطلبات المتزامنة
قانون ليتل: المستخدمون والمعدّلات والزمن
ينص قانون ليتل على أن متوسط عدد العناصر داخل نظام مستقر يساوي متوسط معدّل وصولها مضروباً في متوسط الزمن الذي يقضيه كل عنصر داخله: L = λ × W. وهو ينطبق على طابور أمام صندوق متجر، وعلى خادم، وعلى موقع كامل، أياً كان نمط الوصول. واحرص على اتساق الوحدات: طلبات في الثانية مع ثوانٍ.
وعند تطبيقه على ثلاثة مستويات يجيب عن أسئلة هذا الدرس، وعند قراءته بالعكس يفحص التقرير:
- الخادم: الطلبات قيد المعالجة = الطلبات في الثانية × متوسط زمن الاستجابة: 90 × 0.5 = 45.
- المستخدمون: المستخدمون المتزامنون = الجلسات التي تبدأ في الثانية × متوسط مدة الجلسة؛ ففي متجر المثال التطبيقي أدناه: 10 × 135 = 1,350.
- السكربت: المستخدمون الافتراضيون = الطلبات المستهدفة في الثانية × (زمن الاستجابة + زمن التفكير لكل طلب): 90 × 15 = 1,350؛ ودون زمن تفكير يكفي 90 × 0.5 = 45 مستخدماً افتراضياً لإرسال المعدّل نفسه (90 طلباً في الثانية). ويكتب منهج ISTQB لاختبار الأداء هذه العلاقة بالصيغة: الإنتاجية = المستخدمون الافتراضيون / (زمن المعالجة + زمن التفكير).
- فحص التقرير: 200 مستخدم افتراضي باستجابات 0.4 ثانية وزمن تفكير 5 ثوانٍ يُنتجون نحو 200 / 5.4 ≈ 37 طلباً في الثانية. فإن أظهر التقرير 150 طلباً في الثانية، فكل مستخدم افتراضي لم يقضِ إلا نحو 200 / 150 ≈ 1.3 ثانية لكل طلب، أي إن معظم زمن التفكير المخطط لم يُطبَّق.
- الحدود: استخدم متوسطات على فترة مستقرة، لا p95 ولا طابوراً ما زال ينمو.
مثال تطبيقي: من التحليلات إلى نموذج عبء العمل
يستعد متجر إلكتروني لأمسية تخفيضات. شهدت أكثر ساعة ازدحاماً في العام الماضي 36,000 جلسة، أي 10 جلسات في الثانية، على أربع رحلات. ولكل رحلة تعطي التحليلات نصيبها من الجلسات، والطلبات لكل جلسة، ومتوسط الزمن لكل خطوة (الاستجابة مع زمن التفكير).
الطلبات في الثانية لرحلة ما = الجلسات في الثانية × نصيبها × الطلبات لكل جلسة، ومستخدموها المتزامنون = طلباتها في الثانية × الزمن لكل خطوة، وهذا هو قانون ليتل. والمجموع 90 طلباً في الثانية و1,350 مستخدماً متزامناً. فإتمام الشراء 15% من الجلسات لكنه 20% من الطلبات، لأن جلسته تضم أكثر الطلبات، و27% من المستخدمين، لأن الناس يقضون أطول وقت في كل خطوة من خطواته؛ والاختبار الذي يتجاهل المزيج يضع حملاً أقل من اللازم تحديداً على الجلسات واستدعاءات الدفع الأهم.
| الرحلة | نصيب الجلسات | الطلبات لكل جلسة | الزمن لكل خطوةالاستجابة + زمن التفكير | الطلبات في الثانيةالجلسات في الثانية × النصيب × الطلبات | المستخدمون المتزامنونالطلبات في الثانية × الزمن لكل خطوة |
|---|---|---|---|---|---|
| تصفّح الكتالوج | 50% | 8 | 15 ثانية | 4010 × 0.50 × 8 | 60040 × 15 |
| البحث والمقارنة | 30% | 10 | 12 ثانية | 3010 × 0.30 × 10 | 36030 × 12 |
| إتمام الشراء | 15% | 12 | 20 ثانية | 1810 × 0.15 × 12 | 36018 × 20 |
| تتبّع طلب شراء | 5% | 4 | 15 ثانية | 210 × 0.05 × 4 | 302 × 15 |
| المجموع | 100% | 9 في المتوسط | 15 ثانية في المتوسط | 9010 × 9 | 1,35090 × 15 |
- إتمام الشراء: 15% من الجلسات و20% من الطلبات، لكن 27% من المستخدمين المتزامنين
ساعة الذروة: 36,000 جلسة = 10 جلسات جديدة في الثانية. ومع متوسط استجابة 0.5 ثانية لا يكون قيد المعالجة على الخادم في أي لحظة إلا 90 × 0.5 = 45 طلباً.
النسخة النصية
Peak hour: 36,000 sessions / 3,600 s = 10 new sessions per second
journey share requests s/step requests per second concurrent users
browse catalogue 50% 8 15 10 × 0.50 × 8 = 40 40 × 15 = 600
search, compare 30% 10 12 10 × 0.30 × 10 = 30 30 × 12 = 360
checkout 15% 12 20 10 × 0.15 × 12 = 18 18 × 20 = 360
track an order 5% 4 15 10 × 0.05 × 4 = 2 2 × 15 = 30
total 100% 9 avg 15 avg = 90 1,350
requests = requests per session; s/step = response + think time per request
avg = weighted: 90 / 10 = 9 requests per session; 1,350 / 90 = 15 s per request
average session duration = 9 × 15 = 135 s; 10 sessions/s × 135 s = 1,350 users
In flight on the server at 0.5 s average response: 90 × 0.5 = 45 requestsأخطاء شائعة
- تشغيل رقم «المستخدمين المتزامنين» مستخدمين افتراضيين بلا زمن تفكير، فيتضاعف معدّل الطلبات أضعافاً كثيرة.
- اعتبار المستخدمين المسجّلين أو اليوميين مستخدمين متزامنين. اطلب رقم فترة الذروة ومصدره.
- اختبار رحلة واحدة، غالباً الصفحة الرئيسية، بدلاً من المزيج؛ فالصفحات المخزّنة مؤقتاً تُخفي عمليات الكتابة البطيئة في إتمام الشراء.
- إعطاء كل المستخدمين الافتراضيين زمن تفكير ثابتاً واحداً، فيرى الخادم موجات بدلاً من حركة منتظمة.
- قراءة انخفاض معدّل الطلبات في نموذج مغلق على أنه نجاح؛ فالنظام البطيء يتلقى طلبات أقل فحسب.
- إدخال p95 أو دقيقة بطيئة واحدة في قانون ليتل، وهو يحتاج إلى متوسطات على فترة مستقرة.
من منظور ضمان الجودة
ابنِ نموذج عبء العمل قبل أن يكتب أحدٌ سكربتاً، واطلب مراجعته كأي أساس اختبار (Test Basis): يقدّم مالك المنتج الأحجام وأحداث الذروة (يوم صرف الرواتب، أو حملة تخفيضات)، وتقدّم التحليلات الجلسات في الساعة والوقت المستغرق في الصفحة، ويحدد المطورون الطلبات التي ترسلها كل رحلة. وحين يقول المتطلب «2,000 مستخدم متزامن» فاسأل: جلسات أم طلبات قيد المعالجة؟ في أي فترة؟ يؤدون أيّ رحلات؟
سجّل في خطة الاختبار مصدر كل رقم والفترة التي أُخذ منها. وبعد كل تشغيل قارن المعدّل والمزيج الفعليين بالنموذج قبل النظر إلى أزمنة الاستجابة، وافحص التقرير بقانون ليتل. فالتشغيل الذي لم يطبّق الحمل المقصود تشغيل غير صالح، لا ناجح ولا فاشل.
تمرين عملي
ابنِ نموذج عبء العمل لبوابة مواعيد
تبلغ بوابة حكومية لحجز المواعيد ذروتها عند فتح نافذة حجز جديدة: 18,000 جلسة في ساعة الذروة على الرحلات الثلاث أدناه، وهي البحث عن المواعيد المتاحة (search free slots) وحجز موعد (book an appointment) والإلغاء أو إعادة الجدولة (cancel or reschedule)، بمتوسط زمن استجابة متوقع 0.4 ثانية. احسب الطلبات في الثانية والمستخدمين المتزامنين لكل رحلة وفي المجموع، والطلبات قيد المعالجة.
يقترح زميل 1,000 مستخدم افتراضي دون زمن تفكير. استخدم قانون ليتل لتبيّن الحمل الذي يطبّقه ذلك فعلاً.
Peak hour: 18,000 sessions
journey share requests per session time per step (response + think)
search free slots 60% 6 10 s
book an appointment 30% 10 18 s
cancel or reschedule 10% 4 15 s- حوّل ساعة الذروة إلى جلسات في الثانية.
- احسب لكل رحلة الجلسات في الثانية والطلبات في الثانية ومدة الجلسة.
- طبّق قانون ليتل لحساب المستخدمين المتزامنين والطلبات قيد المعالجة.
- اختر إيقاعاً لرحلة الحجز، واحسب المستخدمين الافتراضيين الذين يحتاجهم سكربت بنموذج مغلق.
- احسب معدّل الطلبات في خطة الزميل.
إظهار الإجابة النموذجية
الجلسات في الثانية: 18,000 / 3,600 = 5، أي 3 للبحث و1.5 للحجز و0.5 للإلغاء.
البحث: 3 × 6 = 18 طلباً في الثانية؛ والجلسة 6 × 10 = 60 ثانية، فالمستخدمون 3 × 60 = 180. الحجز: 1.5 × 10 = 15 طلباً في الثانية؛ والجلسة 10 × 18 = 180 ثانية؛ والمستخدمون 1.5 × 180 = 270. الإلغاء: طلبان في الثانية (0.5 × 4 = 2)؛ والجلسة 60 ثانية؛ والمستخدمون 30.
المجموع: 35 طلباً في الثانية و480 مستخدماً متزامناً؛ والطلبات قيد المعالجة 35 × 0.4 = 14. والحجز 30% من الجلسات لكنه 56% من المستخدمين، فهو أحق الرحلات بالاهتمام وببيانات الاختبار.
تستغرق رحلة الحجز نحو 180 ثانية، فخذ إيقاعاً فيه هامش، مثل 200 ثانية: المستخدمون الافتراضيون = 1.5 × 200 = 300، منهم نحو 270 داخل رحلة في أي لحظة. وإذا تجاوزت الرحلات 200 ثانية انخفض المعدّل عن 1.5 في الثانية، وهذه نتيجة تستحق التسجيل.
دون زمن تفكير يرسل كل مستخدم من مستخدمي الزميل طلبه التالي فور وصول الاستجابة السابقة، أي كل 0.4 ثانية: فما دامت الاستجابات عند 0.4 ثانية يكون المعدّل 1,000 / 0.4 = 2,500 طلب في الثانية، نحو 70 ضعف المعدّل في النموذج (35). قد يكون ذلك اختبار إجهاد مفيداً لاحقاً، لكنه ليس الحمل المتوقع.
أسئلة شائعة
كم مستخدماً افتراضياً أحتاج لتحقيق 100 طلب في الثانية؟
يعتمد ذلك على الزمن الذي يقضيه كل مستخدم لكل طلب. فبحسب قانون ليتل: المستخدمون الافتراضيون = الطلبات في الثانية × (متوسط زمن الاستجابة + متوسط زمن التفكير). مع استجابات 0.5 ثانية وزمن تفكير 9.5 ثانية يكون العدد 100 × 10 = 1,000 مستخدم، ودون زمن تفكير 100 × 0.5 = 50. قرّر أولاً هل تحاكي أشخاصاً (فأبقِ زمن التفكير) أم معدّل طلبات فقط (نموذج مفتوح تحدد فيه الأداة المعدّل مباشرةً).
هل أحذف زمن التفكير لأوفّر أجهزة توليد الحمل؟
فقط حين لا يحتفظ الخادم بحالة لكل مستخدم تستحق الاختبار، مثل واجهة برمجية عديمة الحالة (Stateless) تُقاس بمعدّل ثابت. فالمستخدمون الأقل عدداً والأسرع يفتحون جلسات واتصالات أقل ويستهلكون ذاكرة أقل من المستخدمين الحقيقيين، فتبقى المشكلات التي تكبر مع عدد المستخدمين، مثل تخزين الجلسات أو مجمّعات الاتصالات (Connection Pools)، مخفية. وإذا حذفته فاذكر ذلك في الخطة وفي التقرير.
هل أستخدم نموذج عبء عمل مفتوحاً أم مغلقاً؟
استخدم النموذج المفتوح حين يصل المستخدمون مستقلين بعضهم عن بعض وعن سرعة النظام، كما في موقع عام أو واجهة برمجية عامة. واستخدم النموذج المغلق حين تستخدم النظامَ مجموعةٌ ثابتة، مثل 200 موظف في مركز اتصال أو مجموعة من عمّال المعالجة الدفعية، لأن طلبهم التالي ينتظر فعلاً الاستجابة السابقة.
هل قانون ليتل دقيق؟
نعم بالنسبة إلى المتوسطات على المدى الطويل في نظام مستقر، أياً كان توزيع أزمنة الوصول والمدد. لكنه لا يصف نافذة قصيرة أثناء التصاعد أو الحمل الزائد حين يكون عدد العناصر داخل النظام ما زال يتغير، ولا يقول شيئاً عن المئينات (Percentiles)؛ فاستخدمه لتحديد حجم الاختبار وفحص اتساقه، لا للتنبؤ بقيمة p95.
المراجع
- Certified Tester Performance Testing (CT-PT)منهج ISTQB التخصصي لاختبار الأداء: المفاهيم الأساسية وقياسات الأداء وأنشطة الاختبار ومهامه والأدوات.
- ISTQB Glossaryالتعريفات القياسية لمصطلحات الاختبار — حالة الاختبار واختبار الانحدار والخطورة والأولوية وتحليل القيم الحدّية وغيرها.
- Grafana k6 documentationالتوثيق الرسمي لأداة Grafana k6، وهي أداة مفتوحة المصدر وقابلة للتوسعة لاختبار الحمل والأداء.
- Apache JMeter User's Manualكيف تُبنى اختبارات الحمل وتُعامَل بالمعاملات وتُشغَّل في JMeter، وكيف تُقرأ مستمعاته وتقاريره.
تدرّب بأدوات متقن
ولّد مدخلات اختبار الأداء بتوزيعات واقعية: أزمنة التفكير، ومزيج الطلبات، وأحجام الحمولات، ومنحنيات التدرّج.
ولّد سكربتات اختبار التزامن (k6 وJMeter JMX وLocust وArtillery وNode.js) بإعدادات افتراضية آمنة لنقطة نهاية مستهدفة.
ولّد مجموعات معاملات كبيرة (مستخدمين ورموزاً ومعرّفات وحمولات) لاختبارات التحميل في k6 وJMeter وGatling وLocust.
قِس زمن استجابة نقطة نهاية عبر عدة عيّنات: الحد الأدنى والأقصى والمتوسط والوسيط وp95.
شغّل قياس أداء صغيراً وآمناً على نقطة نهاية عامة (بعدد طلبات وتزامن محدودَين) واحصل على الإنتاجية ومئينيات زمن الاستجابة.
للتعمّق أكثر
تقدّمك في هذا الموضوع
سجّل الدخول لتتابع تقدّمك
علّم الموضوعات مكتملة، وتابع من حيث توقفت، وافتح امتحانات التخصص.