ما هو اختبار الأداء؟
يفحص اختبار الأداء كيف يتصرف النظام تحت حمل عمل معيّن: مدى سرعة استجابته، وعدد الطلبات التي يستطيع معالجتها، وما إذا كان يبقى مستقراً مع الوقت، وما يحدث عندما يُدفع إلى ما بعد حدوده. الاختبارات الوظيفية تجيب عن «هل يعمل؟»؛ أما اختبارات الأداء فتجيب عن «هل ما زال يعمل في التاسعة صباح يوم الإطلاق مع عشرة آلاف مستخدم؟».
يشرح هذا الدليل أنواع اختبار الأداء ومتى يُستخدم كل منها، والمقاييس التي تُقاس وكيفية قراءتها، وخطة عملية لأول اختبار لواجهة API أو تطبيق ويب، والأدوات التي تولّد الحمل.
أنواع اختبار الأداء
- اختبار التحميل — الحركة المتوقعة الواقعية (المتوسطة والذروة) للتأكد من أن النظام يحقق أهداف زمن الاستجابة والأخطاء في الظروف الطبيعية.
- اختبار الضغط — دفع الحركة إلى ما بعد الذروة المتوقعة حتى يتعطل شيء ما، لإيجاد الحد ومعرفة ما إذا كان الفشل رشيقاً (بطء، 503) أم كارثياً (انهيارات، تلف بيانات).
- اختبار الذروة — قفزة مفاجئة من حركة منخفضة إلى عالية جداً، كما في حملة تسويقية أو تخفيضات خاطفة، لفحص التوسع التلقائي وقوائم الانتظار.
- اختبار التحمّل — حمل معتدل لساعات أو أيام، لاكتشاف تسرّبات الذاكرة واستنفاد مجمّعات الاتصالات ونمو القرص التي لا تظهرها الاختبارات القصيرة أبداً.
- اختبار قابلية التوسع — زيادة الحمل على مراحل لمعرفة كيف تتغير الإنتاجية وزمن الاستجابة مع إضافة الموارد.
- قياس الأداء المرجعي — قياس سريع قابل للتكرار لنقطة نهاية واحدة لمقارنة إصدارين أو تطبيقين.
المقاييس المهمة
- زمن الاستجابة — يُقاس لكل طلب. أبلغ عن المئينات لا المتوسط: يخبرك p50 (الوسيط) وp95 وp99 بما يختبره معظم المستخدمين وأقلهم حظاً. المتوسط يخفي الذيل البطيء.
- الإنتاجية — عدد الطلبات في الثانية (أو المعاملات في الثانية) التي يحافظ عليها النظام.
- معدل الأخطاء — نسبة الطلبات الفاشلة (5xx، انتهاء المهلة، أخطاء الاتصال). يجب أن تبقى قريبة من الصفر عند الحمل المستهدف.
- التزامن — عدد المستخدمين الافتراضيين أو الاتصالات المفتوحة النشطة في اللحظة نفسها.
- استخدام الموارد — المعالج والذاكرة واتصالات قاعدة البيانات وعمق قائمة الانتظار في جهة الخادم، مربوطة بالخط الزمني للحمل.
- Apdex أو الالتزام بـ SLO — حصة الطلبات ضمن الميزانية المتفق عليها (مثلاً 95% تحت 300 مللي ثانية).
التخطيط لأول اختبار أداء
- حدد الهدف كرقم: «يكتمل إتمام الشراء في أقل من 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 أسوأ حالة واقعية.
كم مستخدماً افتراضياً أحتاج؟
اشتقه من الحركة الحقيقية: ذروة الطلبات في الثانية مضروبة في متوسط مدة الطلب تعطي التزامن الذي يجب أن تحافظ عليه. أضف هامشاً من 20–50% للنمو.
هل يمكنني اختبار الأداء من المتصفح؟
يمكنك قياس نقاط نهاية فردية ومقارنة نقطتين، وهو مفيد أثناء التطوير. أما الحمل بحجم الإنتاج فيحتاج إلى أداة مخصصة مثل JMeter أو k6 أو Gatling تعمل على أجهزة منفصلة.
أيهما أفضل: JMeter أم k6؟
لدى JMeter واجهة رسومية ومسجّلات وأكبر منظومة؛ أما k6 فهو قائم على الكود وأخف ويتكامل طبيعياً مع CI. تفضّل الفرق المرتاحة مع JavaScript غالباً k6؛ وتحتفظ الفرق ذات خطط JMeter القائمة بـ JMeter.
الأدوات المذكورة في هذا الدليل
قِس زمن استجابة نقطة نهاية عبر عدة عيّنات: الحد الأدنى والأقصى والمتوسط والوسيط وp95.
شغّل قياس أداء صغيراً وآمناً على نقطة نهاية عامة (بعدد طلبات وتزامن محدودَين) واحصل على الإنتاجية ومئينيات زمن الاستجابة.
قارن أزمنة الاستجابة والأحجام بين نقطتي نهاية (مثل v1 مقابل v2، أو staging مقابل الإنتاج) جنباً إلى جنب.
حلّل حجم الاستجابة: البايتات الخام مقابل المضغوطة، وحجم الترويسات، ووزن بنية JSON، وأكبر الحقول.
ولّد مجموعات معاملات كبيرة (مستخدمين ورموزاً ومعرّفات وحمولات) لاختبارات التحميل في k6 وJMeter وGatling وLocust.
ولّد بيانات اختبار جاهزة لـ JMeter (ملفات CSV Data Set Config ومتغيّرات User Defined Variables) انطلاقاً من مخطط الحقول.
ولّد ملفات CSV لعنصر CSV Data Set Config في JMeter باقتباس وفواصل وترميزات صحيحة.
ولّد سكربتات اختبار التزامن (k6 وJMeter JMX وLocust وArtillery وNode.js) بإعدادات افتراضية آمنة لنقطة نهاية مستهدفة.
تحليل ترويسات Cache-Control وExpires وETag وLast-Modified وVary وAge، وشرح كيفية تخزين المتصفحات وشبكات CDN للاستجابة مؤقتاً.