ما هو اختبار الأداء؟

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

يشرح هذا الدليل أنواع اختبار الأداء ومتى يُستخدم كل منها، والمقاييس التي تُقاس وكيفية قراءتها، وخطة عملية لأول اختبار لواجهة API أو تطبيق ويب، والأدوات التي تولّد الحمل.

أنواع اختبار الأداء

  • اختبار الحمل (ويُسمّى أيضاً اختبار التحميل) — الحركة المتوقعة الواقعية (المتوسطة والذروة) للتأكد من أن النظام يحقق أهداف زمن الاستجابة والأخطاء في الظروف الطبيعية.
  • اختبار الإجهاد (ويُسمّى أيضاً اختبار الضغط) — دفع الحركة إلى ما بعد الذروة المتوقعة حتى يتعطل شيء ما، لإيجاد الحد ومعرفة ما إذا كان الفشل رشيقاً (بطء، 503) أم كارثياً (انهيارات، تلف بيانات).
  • اختبار الذروة المفاجئة — قفزة حادة من حركة منخفضة إلى عالية جداً، كما في حملة تسويقية أو تخفيضات خاطفة، لفحص التوسع التلقائي وقوائم الانتظار.
  • اختبار التحمّل — حمل معتدل لساعات أو أيام، لاكتشاف تسرّبات الذاكرة واستنفاد مجمّعات الاتصالات ونمو القرص التي لا تظهرها الاختبارات القصيرة أبداً.
  • اختبار قابلية التوسع — زيادة الحمل على مراحل لمعرفة كيف تتغير الإنتاجية وزمن الاستجابة مع إضافة الموارد.
  • قياس الأداء المرجعي — قياس سريع قابل للتكرار لنقطة نهاية واحدة لمقارنة إصدارين أو تطبيقين.
اختبار الإجهاد وحده يُعرَّف بدفع الحركة إلى ما بعد الذروة المتوقعة؛ أما الذروة المفاجئة فقفزة حادة، والتحمّل يدوم ساعات أو أياماً، وقابلية التوسع تزيد الحمل على مراحل. نموذج مفاهيمي
  1. اختبار الحملحركة متوسطة ثم الذروة: هل تتحقق أهداف زمن الاستجابة والأخطاء؟

    الخط المرجعي:الذروة المتوقعة

  2. اختبار الإجهادإلى ما بعد الذروة المتوقعة حتى يتعطل شيء ما: فشل رشيق (بطء، 503) أم كارثي؟

    الخط المرجعي:الذروة المتوقعة

    يتعطل شيء ما

  3. اختبار الذروة المفاجئةقفزة حادة من حركة منخفضة إلى عالية جداً: تفحص التوسع التلقائي وقوائم الانتظار.

    الخط المرجعي:الذروة المتوقعة

  4. اختبار التحمّلحمل معتدل لساعات أو أيام: تسرّبات الذاكرة واستنفاد مجمّعات الاتصالات ونمو القرص.
    الزمن · ساعات أو أيام

    الخط المرجعي:الذروة المتوقعة

  5. اختبار قابلية التوسعزيادة الحمل على مراحل: كيف تتغير الإنتاجية وزمن الاستجابة مع إضافة الموارد؟

أشكال توضيحية على مقياس حمل واحد مشترك: الارتفاعات والمدد الزمنية للتوضيح فقط. أما قياس الأداء المرجعي فيقيس نقطة نهاية واحدة وليس له شكل حمل خاص.

جرّبها: قياس أداء طلبات HTTP جرّبها: مقارنة أداء API

المقاييس المهمة

  • زمن الاستجابة — يُقاس لكل طلب. أبلغ عن المئينات لا المتوسط: يخبرك p50 (الوسيط) وp95 وp99 بما يختبره معظم المستخدمين وأقلهم حظاً. المتوسط يخفي الذيل البطيء.
  • الإنتاجية — عدد الطلبات في الثانية (أو المعاملات في الثانية) التي يحافظ عليها النظام.
  • معدل الأخطاء — نسبة الطلبات الفاشلة (5xx، انتهاء المهلة، أخطاء الاتصال). يجب أن تبقى قريبة من الصفر عند الحمل المستهدف.
  • التزامن — عدد المستخدمين الافتراضيين أو الاتصالات المفتوحة النشطة في اللحظة نفسها.
  • استخدام الموارد — المعالج والذاكرة واتصالات قاعدة البيانات وعمق قائمة الانتظار في جهة الخادم، مربوطة بالخط الزمني للحمل.
  • الالتزام بـ SLO وApdex — الالتزام بـ SLO هو حصة الطلبات ضمن الميزانية المتفق عليها (مثلاً 95% تحت 300 مللي ثانية). أما Apdex فدرجة مرتبطة به بين 0 و1 تُحسب مقابل زمن مستهدف T: الاستجابة التي لا تتجاوز T تُحتسب كاملة، وما لا يتجاوز 4T يُحتسب نصفاً، والأبطأ منها صفراً.

جرّبها: محلّل زمن الاستجابة جرّبها: محلّل حجم الاستجابة

التخطيط لأول اختبار أداء

  • حدد الهدف كرقم: «يكتمل إتمام الشراء في أقل من 800 مللي ثانية عند p95 مع 500 مستخدم متزامن وأقل من 0.1% أخطاء».
  • اختر الرحلات الحرجة — تسجيل الدخول، والبحث، والإضافة إلى السلة، وإتمام الشراء، وأهم ثلاث نقاط نهاية في API — بدلاً من كل صفحة.
  • نمذج حركة واقعية: مزيج الرحلات، ووقت التفكير بين الإجراءات، والتصاعد والحالة المستقرة. استخدم تحليلات الإنتاج إن توفرت.
  • جهّز بيانات اختبار على نطاق واسع: آلاف المستخدمين والمنتجات والحمولات المختلفة حتى تتصرف الذاكرة المؤقتة والقيود الفريدة كما في الإنتاج.
  • نفّذ في بيئة تشبه الإنتاج حجماً، أو قِس النتائج بشكل متعمّد. قاعدة بيانات بحجم حاسوب محمول لن تخبرك شيئاً عن قاعدة الإنتاج.
  • أنشئ خط أساس أولاً بمستخدم واحد، ثم صعّد. قارن كل تشغيل لاحق بخط الأساس.
  • راقب جهة الخادم أثناء التشغيل؛ فأرقام جهة العميل وحدها لا تخبرك لماذا أصبح بطيئاً.

جرّبها: مولّد بيانات اختبار التحميل جرّبها: مولّد اختبارات الطلبات المتزامنة

الأدوات: JMeter وk6 وGatling وأدوات المتصفح

Apache JMeter هو الخيار مفتوح المصدر العريق بواجهة رسومية ومسجّلات ومجموعات بيانات CSV؛ وk6 قائم على السكربتات (JavaScript) وخفيف وصديق لـ CI؛ وGatling قائم على Scala/Java بتقارير ممتازة؛ وLocust قائم على Python. وتشغّل الخدمات السحابية (BlazeMeter وGrafana Cloud k6 وAzure Load Testing) السكربتات نفسها من مناطق متعددة.

لا يستطيع المتصفح توليد حمل بحجم الإنتاج، لكن أدوات المتصفح مثالية للخطوات المحيطة باختبار الحمل: قياس توزيع زمن استجابة نقطة نهاية واحدة، ومقارنة نقطتين، وفحص حجم الحمولة والضغط، وتوليد ملفات CSV وJSON التي تستهلكها أدوات التشغيل.

جرّبها: مولّد بيانات اختبار JMeter جرّبها: مولّد CSV لـ JMeter جرّبها: قياس أداء طلبات HTTP

قراءة النتائج

  • ارتفاع زمن الاستجابة مع ثبات الإنتاجية يعني بلوغ عنق زجاجة — المعالج أو قاعدة بيانات أو مجمّع اتصالات أو واجهة API تابعة.
  • تصاعد معدل الأخطاء قبل زمن الاستجابة يعني غالباً حداً (أقصى اتصالات، تحديد معدل) لا بطئاً.
  • p99 أعلى بكثير من p95 يشير إلى توقفات جمع القمامة أو تنافس الأقفال أو تبعية بطيئة تصيب بضعة طلبات.
  • التدهور البطيء أثناء اختبار التحمّل تسرّب: ذاكرة أو مقابض ملفات أو اتصالات.
  • النتيجة التي لا يمكن إعادة إنتاجها في تشغيل ثانٍ ضوضاء؛ أصلح البيئة قبل ضبط الكود.

جرّبها: مقارنة أداء API جرّبها: محلّل ترويسات التخزين المؤقت

الأخطاء الشائعة

  • الاختبار بمعرّف مستخدم واحد أو منتج واحد — كل شيء يصيب الذاكرة المؤقتة والأرقام خيالية.
  • التصعيد إلى الحمل الكامل فوراً ثم لوم النظام على ذروة مفاجئة لم يُصمَّم لها.
  • الإبلاغ عن المتوسطات. أبلغ دائماً عن p95 وp99 مع معدل الأخطاء.
  • تشغيل مولّد الحمل على الجهاز نفسه الذي يعمل عليه النظام قيد الاختبار.
  • تجاهل حجم الحمولة: استجابة JSON بحجم 2 ميجابايت بطيئة مهما كان الخادم سريعاً.
  • الاختبار مرة واحدة قبل الإطلاق ثم عدم تكراره أبداً. يتراجع الأداء التزاماً بعد آخر.

جرّبها: محلّل حجم الاستجابة جرّبها: مولّد بيانات اختبار التحميل

الأسئلة الشائعة

ما الفرق بين اختبار الحمل واختبار الإجهاد؟

يطبّق اختبار الحمل الحركة المتوقعة للتأكد من تحقيق الأهداف؛ بينما يواصل اختبار الإجهاد زيادة الحركة إلى ما بعد الذروة المتوقعة لإيجاد نقطة الانهيار ومعرفة كيف يفشل النظام.

ما زمن الاستجابة الجيد لواجهة API؟

يعتمد على الاستخدام، لكن الميزانيات الشائعة هي أقل من 100 مللي ثانية للقراءات المخزّنة مؤقتاً، وأقل من 300 مللي ثانية لاستدعاءات API المعتادة، وأقل من ثانية للعمليات الثقيلة — مقيسة عند p95 لا كمتوسط.

لماذا نستخدم p95 بدلاً من متوسط زمن الاستجابة؟

تخفي المتوسطات الذيل البطيء. يقول p95 إن 95% من الطلبات كانت بهذه السرعة على الأقل، وهو ما يلاحظه المستخدمون؛ ويُظهر p99 أسوأ حالة واقعية.

كم مستخدماً افتراضياً أحتاج؟

اشتقه من الحركة الحقيقية. يقضي كل مستخدم افتراضي وقتاً في انتظار الاستجابة ووقتاً في «التفكير» بين الإجراءات، لذا يعطي قانون ليتل (Little's law) العدد تقريباً: المستخدمون الافتراضيون ≈ الطلبات المستهدفة في الثانية × (متوسط زمن الاستجابة + متوسط وقت التفكير لكل طلب). عند 100 طلب في الثانية وزمن استجابة 0.3 ثانية ووقت تفكير 5 ثوانٍ يلزم نحو 530 مستخدماً؛ أما ضرب الطلبات في الثانية في زمن الاستجابة وحده (30 هنا) فلا يعدّ إلا الطلبات الجارية في اللحظة نفسها. أضف هامشاً من 20–50% للنمو.

هل يمكنني اختبار الأداء من المتصفح؟

يمكنك قياس نقاط نهاية فردية ومقارنة نقطتين، وهو مفيد أثناء التطوير. أما الحمل بحجم الإنتاج فيحتاج إلى أداة مخصصة مثل JMeter أو k6 أو Gatling تعمل على أجهزة منفصلة.

أيهما أفضل: JMeter أم k6؟

لدى JMeter واجهة رسومية ومسجّلات وأكبر منظومة؛ أما k6 فهو قائم على الكود وأخف ويتكامل طبيعياً مع CI. تفضّل الفرق المرتاحة مع JavaScript غالباً k6؛ وتحتفظ الفرق ذات خطط JMeter القائمة بـ JMeter.

المراجع

تمرين عملي

خطّط لاختبار حمل ليوم التسجيل واقرأ نتائجه

المطلوب

أنت تختبر بوابة الطلاب في جامعة (مثال خيالي). يستبدل الإصدار ⁦3.2⁩ الواجهة الخلفية (Back end) لتسجيل المقررات. يُفتح التسجيل للفصل الدراسي الثاني يوم الأحد 17 يناير 2027 الساعة 08:00 ويبقى مفتوحاً ثلاثة أسابيع، ويسجّل فيه نحو 18,000 طالب كما في الفصل الماضي. وفي اجتماع التخطيط أبدى خمسة أشخاص ملاحظاتهم. مالك المنتج: «يجب أن يكون التسجيل سريعاً وألا ينهار في اليوم الأول». مسؤول القبول والتسجيل: «في الفصل الماضي كانت البوابة غير صالحة للاستخدام طوال الساعة الأولى بعد الثامنة، وظل الطلاب يحدّثون الصفحة». قائد فريق العمليات: «كان النظام القديم يزداد بطئاً حتى اضطررنا إلى إعادة تشغيله كل بضعة أيام». معماري النظام: «هل يرفع خادم تطبيق ثانٍ الحد؟ أحتاج أن أعرف قبل شرائه». المطوّر: «هل استعلام توفّر المقاعد الجديد أسرع من القديم؟».

وقد كتب أحد المطوّرين مسودة أول خطة لاختبار الحمل: (1) تشغيل k6 على خادم التطبيق في بيئة Staging نفسه لتجنّب ضوضاء الشبكة؛ (2) يسجّل جميع المستخدمين الافتراضيين الدخول بحساب الاختبار student01؛ (3) بدء 1,200 مستخدم افتراضي في الثانية نفسها والتشغيل 10 دقائق؛ (4) الإبلاغ عن متوسط زمن الاستجابة، وينجح الاختبار إن كان أقل من ثانية واحدة؛ (5) استخدام بيانات Staging المعتادة: 300 طالب و40 شعبة دراسية. وتضم المادة أدناه أرقام حركة الفصل الماضي، ونتائج اختبار حمل متدرّج للمرشّح للإصدار (Release candidate) ⁦3.2.0-rc1⁩ أجراه فريقك لاحقاً بإعداد مصحَّح.

اعمل على الورق مستعيناً بأنواع اختبار الأداء والمقاييس وقائمة التخطيط وقواعد قراءة النتائج في الدليل. ويستطيع مولّد بيانات اختبار الأداء أن يحوّل عبء العمل الذي تصممه إلى منحنى تدرّج ويقدّر إنتاجيته، لكن الورقة والقلم يكفيان. خصّص لذلك ⁦40–45⁩ دقيقة.

المادة
Last semester’s access logs (old registration back end)
  Busiest 15 minutes   08:00-08:15 on opening day: 100 requests per second
  Ordinary day         at most 15 requests per second
  Peak journey mix     search courses 60%, view a section 25%,
                       register for a section 10%, log in 5%
  Think time           7.5 s on average, from a response to the next request
Planning assumption for release 3.2: average response time 0.5 s

Stepped load test of release candidate 3.2.0-rc1, run by the QA team
  Production-sized staging; k6 load generators on separate machines
  Peak journey mix, 7.5 s think time, 10 minutes per step
  Single-user baseline: p50 150 ms, p95 210 ms, no errors

Step  Virtual  Throughput    p50    p95     p99  Errors  App server  DB connections
        users     (req/s)   (ms)   (ms)    (ms)                 CPU  peak (pool 50)
   1      200          26    160    300     420   0.00%         21%               9
   2      400          52    170    340     510   0.00%         39%              18
   3      800         102    220    480     950   0.04%         72%              47
   4    1,000         105  1,500  4,100   6,800   1.20%         75%              50
   5    1,200         106  3,200  7,900  12,000   4.80%         76%              50
الخطوات
  1. اربط كل ملاحظة من الملاحظات الخمس بنوع اختبار الأداء الذي يجيب عنها، مع الحمل الذي يطبّقه وما يجب أن يُظهره، ثم رتّب الاختبارات ترتيباً معقولاً.
  2. أعد صياغة جملة مالك المنتج أهدافاً قابلة للقياس لوقت الذروة: الرحلات، والحمل، والمئينات، ومعدل الأخطاء، والمدة، والبيئة. وأضف أهدافاً للذروة المفاجئة عند فتح التسجيل وللأسابيع الثلاثة.
  3. احسب عدد المستخدمين الافتراضيين الذي يحتاجه اختبار الحمل في الذروة بالصيغة الواردة في الأسئلة الشائعة في الدليل، وأضف هامشاً. وبيّن إلى أي حد تثق برقم الفصل الماضي: 100 طلب في الثانية.
  4. راجع مسودة الخطة: اذكر لكل بند من بنودها الخمسة ما الخطأ فيه وما تفعله بدلاً منه، ثم سمِّ ما ينقص الخطة.
  5. اقرأ النتائج المتدرّجة مقابل أهدافك: هل تحقق هدف الذروة؟ وأين الحد؟ وما عنق الزجاجة المرجّح، وما مدى يقينك منه؟ وما الذي تبلّغ عنه اليوم؟ وما الذي يُشغَّل بعد ذلك؟
إظهار الإجابة النموذجية
الإجابة النموذجية

أنواع الاختبارات. مالك المنتج، «سريع» و«لا ينهار في اليوم الأول»: اختبار حمل عند الذروة المتوقعة، أي 100 طلب في الثانية بمزيج رحلات الذروة، للتأكد من تحقيق أهداف زمن الاستجابة والأخطاء؛ ثم اختبار إجهاد يواصل رفع الحمل إلى ما بعد الذروة لإيجاد الحد ومعرفة ما إذا كان النظام يفشل فشلاً رشيقاً (إجابات أبطأ، ورد سريع يطلب المحاولة لاحقاً مثل 503) أم كارثياً (انهيارات، أو تسجيلات تضيع أو تتكرر). مسؤول القبول والتسجيل، «غير صالحة للاستخدام في الساعة الأولى»: اختبار الذروة المفاجئة، أي قفزة من حركة شبه معدومة إلى الذروة وما بعدها خلال دقيقة كما يحدث في الثامنة، لفحص قوائم الانتظار والتعافي. وفي الثامنة يحدّث الطلاب الصفحة بدلاً من التفكير، فيرسل العدد نفسه من الطلاب طلبات أكثر؛ لذا نمذج الذروة بوقت تفكير أقصر أو بمعدل طلبات أعلى. قائد فريق العمليات، «يزداد بطئاً»: اختبار التحمّل بحمل يوم عادي لساعات طويلة، ويُفضَّل لأيام، مع مراقبة الذاكرة والاتصالات والقرص بحثاً عن تسرّب. معماري النظام: اختبار قابلية التوسع، أي خطوات الحمل نفسها بخادم تطبيق واحد ثم بخادمين؛ فالمقارنة وحدها تبيّن هل ترتفع الإنتاجية مع الخادم الثاني. المطوّر: قياس الأداء المرجعي، أي قياس سريع قابل للتكرار لنقطة نهاية توفّر المقاعد في البناء القديم والجديد بالبيانات والبيئة نفسيهما، مع مقارنة p50 وp95. والترتيب المعقول: خط الأساس بمستخدم واحد وقياس الأداء المرجعي أولاً، ثم اختبار الحمل، ثم الإجهاد والذروة المفاجئة، ثم مقارنة قابلية التوسع واختبار التحمّل، مع إعادة اختبار الحمل بعد كل إصلاح.

أهداف قابلة للقياس. هذه مقترحات تتفق عليها مع مالك المنتج، وبعد الاتفاق تصبح معايير الخروج لاختبارات الأداء. الذروة: بمزيج الذروة (البحث عن المقررات 60%، وعرض شعبة 25%، والتسجيل في شعبة 10%، وتسجيل الدخول 5%) وبمعدل 100 طلب في الثانية يستمر 30 دقيقة بعد تصاعد مدته 10 دقائق في بيئة Staging بحجم الإنتاج، يكون p95 أقل من 800 مللي ثانية وp99 أقل من ثانيتين لكل رحلة، وتفشل أقل من 0.1% من الطلبات، ولا يضيع أي تسجيل ولا يتكرر. الهامش: تبقى الأهداف نفسها متحققة عند 150 طلباً في الثانية (تشرح الخطوة الثالثة سبب اختيار 50%). الذروة المفاجئة عند الفتح: من حركة شبه معدومة إلى 150 طلباً في الثانية خلال دقيقة واحدة، ويستمر ذلك 15 دقيقة، فلا ينهار شيء ولا يضيع تسجيل ولا يتكرر؛ والطلبات التي لا يستطيع النظام خدمتها تتلقى رداً سريعاً واضحاً بدلاً من أن تبقى معلّقة؛ ويعود p95 إلى أقل من 800 مللي ثانية خلال 5 دقائق بعد أن ينخفض الحمل إلى 100 طلب في الثانية. الأسابيع الثلاثة: بمعدل 15 طلباً في الثانية مدة 48 ساعة على الأقل، لا يزيد p95 في النهاية على p95 في الساعة الأولى بأكثر من 10%، وتبقى الذاكرة واتصالات قاعدة البيانات ثابتة، ولا يحتاج شيء إلى إعادة تشغيل. وقد كان النظام القديم يتدهور على مدى أيام، فاختبار تحمّل أقصر لا يثبت شيئاً يُذكر ما لم تراقب هذه الاتجاهات. قد تختلف أرقامك، لكن كل هدف يجب أن يحدد الرحلة والحمل والمئين ومعدل الأخطاء والمدة والبيئة؛ أما «سريع» و«لا ينهار» فلا يحددان شيئاً منها.

المستخدمون الافتراضيون. ينتظر كل مستخدم افتراضي الاستجابة ثم «يفكّر» قبل طلبه التالي، لذا يعطي قانون ليتل (Little’s law): المستخدمون الافتراضيون ≈ الطلبات في الثانية × (متوسط زمن الاستجابة + متوسط وقت التفكير) = ⁦100 × (0.5 + 7.5) = 800⁩. أما ضرب الطلبات في زمن الاستجابة وحده (⁦100 × 0.5 = 50⁩) فلا يعدّ إلا الطلبات الجارية في اللحظة نفسها، ويولّد حملاً أقل بكثير من المطلوب. ومع هامش ⁦20–50%⁩ يصبح العدد من 960 إلى 1,200 مستخدم افتراضي، أي نحو 120 إلى 150 طلباً في الثانية. اختر الحد الأعلى هنا: فرقم 100 طلب في الثانية هو ما عالجه النظام القديم وهو مُثقَل، لا الطلب الحقيقي؛ فالطلبات التي رُفضت قبل أن تصل إليه لا تظهر في سجلاته، والطلاب الذين يئسوا عادوا لاحقاً. تعامل مع هذا الرقم كحد أدنى، واسأل هل سجّل خادم الويب طلبات مرفوضة أو منتهية المهلة عند الثامنة. وإن أدخلت 800 مستخدم ووقت تفكير ثابتاً قدره 7,500 مللي ثانية في مولّد بيانات اختبار الأداء، فسيقدّر نحو 104 طلبات في الثانية، أي أكثر قليلاً من 100، لأنه يفترض نحو 200 مللي ثانية لكل استجابة بدلاً من 0.5 ثانية.

مسودة الخطة. (1) مولّد الحمل على الخادم قيد الاختبار ينافسه على المعالج والذاكرة والشبكة، فيبدو النظام أبطأ مما هو عليه، وقد يصبح المولّد نفسه هو الحد: شغّل k6 على أجهزة منفصلة وراقب معالجاتها أيضاً. (2) حساب واحد لكل المستخدمين يعني أن بيانات الطالب نفسه تأتي من الذاكرة المؤقتة، وأن كل تسجيل يصيب سجل الطالب نفسه، فتبدو القراءات أسرع مما هي في الإنتاج، وتتصادم التسجيلات بطريقة لا يُنتجها أي يوم حقيقي (لا يستطيع طالب أن يسجّل في الشعبة نفسها مرتين): ولّد آلاف الطلاب الاختباريين المختلفين، ويُفضَّل بعدد من سيسجّلون، في مجموعة بيانات CSV، ووزّع التسجيلات على شعب كثيرة. (3) بدء 1,200 مستخدم في الثانية نفسها ذروة مفاجئة لا اختبار حمل، وإخفاقه لا يخبرك شيئاً عن الذروة المتوقعة: صعّد الحمل خلال نحو 10 دقائق، وحافظ على الحالة المستقرة 30 دقيقة، ثم اخفضه تدريجياً، واختبر الذروة المفاجئة منفصلةً بهدفها الخاص بعد نجاح اختبار الحمل. (4) المتوسط يخفي الذيل البطيء، و«أقل من ثانية» لم يتفق عليه أحد، والأخطاء لا تُفحص أصلاً: أبلغ عن p50 وp95 وp99 لكل رحلة مع الإنتاجية ومعدل الأخطاء، مقابل الأهداف المتفق عليها. (5) بيانات 300 طالب و40 شعبة تتسع لها الذاكرة وتجعل كل استعلام سريعاً، ومنها استعلام توفّر المقاعد الجديد الذي سأل عنه المطوّر: استخدم بيانات بحجم الإنتاج، بعدد الطلاب والمقررات والشعب نفسه، مولَّدة أو منسوخة من الإنتاج بعد إزالة هويات الطلاب. وما ينقص الخطة: خط أساس بمستخدم واحد قبل الحمل، ثم الحمل على خطوات؛ ومزيج الرحلات ووقت التفكير البالغ 7.5 ثانية؛ ومراقبة جهة الخادم أثناء التشغيل (معالج خادم التطبيق وذاكرته، ومعالج قاعدة البيانات، ومجمّع الاتصالات، والاستعلامات البطيئة)؛ وتشغيل ثانٍ للتأكد من أن النتيجة قابلة لإعادة الإنتاج؛ وأهداف متفق عليها مع مالك المنتج.

قراءة النتائج. افحص عبء العمل أولاً: أنتج 800 مستخدم افتراضي 102 طلب في الثانية، كما توقعت الصيغة. وعند الذروة (الخطوة 3) تتحقق أهداف زمن الاستجابة والأخطاء لجميع الطلبات معاً: إذ يبلغ p95 نحو 480 مللي ثانية، وp99 نحو 950 مللي ثانية، والأخطاء 0.04%. لكن الجدول لا يعرض كل رحلة على حدة، وبحصة 10% قد يكون p95 للتسجيل في شعبة أبطأ بكثير بينما يبقى p95 الإجمالي منخفضاً؛ كما أن الخطوة استمرت 10 دقائق لا 30 دقيقة كما يطلب الهدف. لذا اطلب p95 لكل رحلة، وشغّل اختبار الحمل الكامل مدة 30 دقيقة، قبل أن تعلن تحقق هدف الذروة. أما هدف الهامش فلم يتحقق. فمن الخطوة 3 إلى الخطوة 4 أضاف 200 مستخدم إضافي 3 طلبات في الثانية فقط (من 102 إلى 105) بينما تتوقع الصيغة نحو 125، وفي الوقت نفسه قفز p50 من 220 إلى 1,500 مللي ثانية، وp95 إلى 4,100 مللي ثانية، والأخطاء إلى 1.2%. وارتفاع زمن الاستجابة مع ثبات الإنتاجية يعني بلوغ عنق زجاجة: هذا البناء يتوقف عند نحو 105 طلبات في الثانية، أي أعلى من ذروة الفصل الماضي المسجَّلة بـ 5% فقط، وأقل بكثير من 150 طلباً في الثانية التي يطلبها هدف الهامش.

عنق الزجاجة المرجّح في جهة قاعدة البيانات، لا في معالج خادم التطبيق. فالمعالج يبقى قرابة 75% ويتبع الإنتاجية، بينما تبلغ ذروة اتصالات قاعدة البيانات 47 من 50 في الخطوة 3، وتُستخدم الاتصالات الخمسون كلها من الخطوة 4. وعندما تنشغل كل الاتصالات تنتظر الطلبات الجديدة اتصالاً حراً، ولهذا يقفز حتى p50، والطلبات التي يطول انتظارها تفشل؛ ويتوافق p99 في الخطوة 3، وهو نحو ضعف p95، مع بدء انتظار أولى الطلبات لاتصال حر. ولا تستطيع أرقام جهة العميل أن تحدد هل المجمّع صغير أم أن الاستعلامات تحجز كل اتصال مدة أطول مما ينبغي، مثل استعلام توفّر المقاعد الجديد على بيانات بحجم الإنتاج؛ لذا يحتاج المطوّرون إلى معالج قاعدة البيانات، وسجل الاستعلامات البطيئة، وانتظارات الأقفال، والوقت الذي تنتظره الطلبات للحصول على اتصال. وتكبير المجمّع ليس هو الإصلاح إن كانت قاعدة البيانات نفسها مشبعة، فالمزيد من الاتصالات يزيدها بطئاً عندئذٍ. يتكرر النمط في الخطوة 5 وتتفق معه مقاييس الخادم، فمن غير المرجّح أن يكون ضوضاء؛ ومع ذلك أعد تشغيل الخطوة 4 للتأكد من أنه يتكرر قبل أن يضبط أحد الكود. أما سؤال معماري النظام فما زال مفتوحاً: خادم تطبيق ثانٍ يضيف قدرة معالجة، وهي ليست الحد، ويضيف اتصالات بقاعدة البيانات لا تنفع إلا إن كان لدى قاعدة البيانات سعة فائضة؛ ويجيب عنه اختبار قابلية التوسع بعد فهم حد قاعدة البيانات.

ما تبلّغ عنه اليوم، كعيب مقابل الأهداف المتفق عليها، إلى مالك المنتج والمطوّرين: «المرشّح للإصدار ⁦3.2.0-rc1⁩، بيئة Staging بحجم الإنتاج، مزيج الذروة، وقت تفكير 7.5 ثانية، خطوات مدة كل منها 10 دقائق. عند 100 طلب في الثانية يبلغ p95 الإجمالي 480 مللي ثانية والأخطاء 0.04% (طُلبت الأرقام لكل رحلة). تتوقف الإنتاجية عند نحو 105 طلبات في الثانية: مع 1,000 مستخدم افتراضي يبلغ p95 نحو 4.1 ثانية وتفشل 1.2% من الطلبات، ومع 1,200 مستخدم يبلغ 7.9 ثانية و4.8%. معالج خادم التطبيق 75%، واتصالات قاعدة البيانات 50 من 50. لم يتحقق هدف الهامش البالغ 150 طلباً في الثانية، فيوم التسجيل معرّض لتكرار ما حدث في الفصل الماضي». أرفق بيانات التشغيل والرسوم البيانية للخادم. وبعد الإصلاح شغّل الاختبار المتدرّج نفسه بالسكربت والبيانات والبيئة نفسها وقارنه بهذا التشغيل (اختبار التأكيد)؛ ثم اختبار الحمل مدة 30 دقيقة عند 100 ثم عند 150 طلباً في الثانية، واختبار الإجهاد فوق 150 طلباً في الثانية، والذروة المفاجئة، ومقارنة قابلية التوسع، واختبار التحمّل. أما تشغيلها الآن فلن يصطدم إلا بالحد نفسه مجدداً.

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

تقدّمك في هذا الموضوع

جزء من مسار تعلم ضمان الجودة

الأدوات المذكورة في هذا الدليل

قِس زمن استجابة نقطة نهاية عبر عدة عيّنات: الحد الأدنى والأقصى والمتوسط والوسيط وp95.

الأداء

شغّل قياس أداء صغيراً وآمناً على نقطة نهاية عامة (بعدد طلبات وتزامن محدودَين) واحصل على الإنتاجية ومئينيات زمن الاستجابة.

الأداء

قارن أزمنة الاستجابة والأحجام بين نقطتي نهاية (مثل v1 مقابل v2، أو staging مقابل الإنتاج) جنباً إلى جنب.

الأداء

حلّل حجم الاستجابة: البايتات الخام مقابل المضغوطة، وحجم الترويسات، ووزن بنية JSON، وأكبر الحقول.

الأداء

ولّد بيانات اختبار جاهزة لـ JMeter (ملفات CSV Data Set Config ومتغيّرات User Defined Variables) انطلاقاً من مخطط الحقول.

الأتمتة

ولّد ملفات CSV لعنصر CSV Data Set Config في JMeter باقتباس وفواصل وترميزات صحيحة.

الأتمتة

كيف تساعدك متقن سوفت

أدلة أخرى

أدلة أخرى
الأداء

اختبار مرونة الأداء والأمان

كيف تختبر المنتج أمام الحمل والاعتماديات الفاشلة والهجمات: اختبارات الحمل والإجهاد والتحمّل بأهداف حقيقية، وحقن الأعطال، وخط أساس OWASP، والأرقام التي تُسجَّل.

وقت القراءة 8 دقائق
الأداء

اختبار المرونة

ما اختبار المرونة وكيف يختلف عن اختبار الأداء وكيف يُنفَّذ: المتطلبات، وتجارب حقن الأعطال، وأنماط الاستقرار، والأدوات، وخطة جاهزة ليوم تمرين.

وقت القراءة 22 دقائق
الويب

شرح رموز حالة HTTP

شرح كل فئة من رموز حالة HTTP مع الرموز التي تقابلها فعلاً — 200 و301 و400 و401 و403 و404 و422 و429 و500 و502 و503 و504 — وسبب كل منها وأيها تعيده.

وقت القراءة 5 دقائق
تصميم الاختبارات

ضمان جودة المنتج من البداية إلى النهاية

ما الذي يشمله ضمان الجودة الشامل — مراجعة المتطلبات وتصميم الاختبارات والاختبار الوظيفي واختبار الأداء والأمان وبوابات الإصدار والمقاييس — وكيف تنفّذه.

وقت القراءة 8 دقائق
الأتمتة

الاختبار في خطوط CI/CD

كيف يعمل الاختبار داخل خطوط CI/CD: مراحل الاختبار وترتيبها، وبوابات الجودة، وتقارير JUnit، والتقسيم، والاختبارات المتذبذبة، وفرز الإخفاقات.

وقت القراءة 13 دقائق
اختبار واجهات API

ما هو اختبار API؟ وكيف تختبر REST API

شرح اختبار API: ما هو، وما الذي تفحصه في كل طلب واستجابة، وطريقة خطوة بخطوة لاختبار REST API، والأخطاء الشائعة، وأدوات مجانية من متصفحك.

وقت القراءة 6 دقائق