DEV Community

Cover image for autocannon: اختبار تحميل HTTP لـ Node.js خطوة بخطوة
Yusuf Khalidd
Yusuf Khalidd

Posted on • Originally published at apidog.com

autocannon: اختبار تحميل HTTP لـ Node.js خطوة بخطوة

لقد كتبت نقطة نهاية HTTP وتعمل عند تجربتها مرة واحدة من Postman. لكن ماذا يحدث عندما يرسل 200 عميل طلبات في الوقت نفسه؟ تحتاج إلى أرقام قابلة للقياس: الطلبات في الثانية، النسب المئوية لوقت الاستجابة، وعدد الردود غير 2xx. تمنحك autocannon هذه الأرقام مباشرة من الطرفية خلال ثوانٍ قليلة.

جرّب Apidog اليوم

autocannon هي أداة قياس أداء HTTP/1.1 مكتوبة بـ Node.js. ترسل عددًا مضبوطًا من الطلبات إلى URL معيّن، ثم تعرض الإنتاجية ووقت الاستجابة والأخطاء. في هذا الدليل ستتعلم كيفية تثبيتها، تشغيل اختبار أساسي، إرسال POST مع رؤوس وجسم، قراءة النتائج، وتشغيلها برمجيًا داخل سكربت Node أو CI.

ما هو autocannon؟

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

demo

ما يقيسه autocannon تحديدًا هو:

  • كم طلبًا في الثانية يستطيع الخادم التعامل معه.
  • كيف يتغير وقت الاستجابة تحت الحمل.
  • كم عدد الأخطاء والردود غير 2xx.
  • أين يبدأ الأداء بالتدهور عند زيادة الاتصالات أو معدل الطلبات.

ما لا يقيسه:

  • صحة JSON المُرجع.
  • مطابقة API لمواصفة OpenAPI.
  • صحة سير عمل متعدد الخطوات.
  • منطق المصادقة أو صحة القيم في الاستجابة.

لذلك استخدمه لاختبار الأداء، وليس كبديل للاختبارات الوظيفية أو التعاقدية.

إذا كنت قد استخدمت wrk أو Apache Bench، فإن autocannon يؤدي دورًا مشابهًا، لكنه أسهل لمشاريع Node لأنه يُثبت عبر npm ويوفر API برمجية يمكن استدعاؤها من JavaScript.

التثبيت

ثبّت autocannon عالميًا للحصول على الأمر من أي مكان:

npm i autocannon -g
Enter fullscreen mode Exit fullscreen mode

تأكد أولًا من تثبيت Node.js. للتحقق من التثبيت:

autocannon --version
Enter fullscreen mode Exit fullscreen mode

إذا كنت لا تريد تثبيتًا عالميًا، استخدم npx:

npx autocannon http://localhost:3000
Enter fullscreen mode Exit fullscreen mode

أو أضفه كاعتماد تطوير داخل المشروع إذا كنت ستستخدمه في سكربتات أو CI:

npm i autocannon --save-dev
Enter fullscreen mode Exit fullscreen mode

تشغيل اختبار أساسي

أبسط تشغيل هو تمرير URL فقط:

autocannon http://localhost:3000
Enter fullscreen mode Exit fullscreen mode

هذا يشغّل الإعداد الافتراضي:

  • 10 اتصالات متزامنة.
  • مدة 10 ثوانٍ.
  • طلب واحد في كل مرة لكل اتصال.

لضبط الحمل استخدم أكثر ثلاث علامات ستحتاجها عمليًا:

autocannon -c 100 -d 30 -p 10 http://localhost:3000
Enter fullscreen mode Exit fullscreen mode

المعاني:

  • -c 100: افتح 100 اتصال متزامن.
  • -d 30: شغّل الاختبار لمدة 30 ثانية.
  • -p 10: فعّل pipelining بحيث يرسل كل اتصال 10 طلبات قبل انتظار الردود.

ارفع -c و-p تدريجيًا حتى ترى أين يبدأ وقت الاستجابة، خصوصًا p97.5 وp99، بالارتفاع.

لإرسال عدد ثابت من الطلبات بدل مدة ثابتة، استخدم -a:

autocannon -c 10 -a 10000 http://localhost:3000
Enter fullscreen mode Exit fullscreen mode

هذا يتوقف بعد 10,000 طلب مهما استغرق الوقت.

إرسال POST مع رؤوس وجسم

لتغيير طريقة HTTP استخدم -m. لإضافة رؤوس استخدم -H. لإرسال جسم الطلب استخدم -b.

مثال POST إلى نقطة نهاية JSON:

autocannon -c 50 -d 20 \
  -m POST \
  -H 'Content-Type=application/json' \
  -H 'Authorization=Bearer YOUR_TOKEN' \
  -b '{"name":"load-test","active":true}' \
  http://localhost:3000/api/users
Enter fullscreen mode Exit fullscreen mode

صيغة الرأس هي:

-H 'Key=Value'
Enter fullscreen mode Exit fullscreen mode

وتكرر -H لكل رأس.

إذا كان جسم الطلب كبيرًا أو محفوظًا في ملف، استخدم -i:

autocannon -m POST \
  -H 'Content-Type=application/json' \
  -i payload.json \
  http://localhost:3000/api/users
Enter fullscreen mode Exit fullscreen mode

تحديد معدل الطلبات

افتراضيًا، يرسل autocannon بأقصى سرعة ممكنة. إذا أردت اختبارًا أقرب لحمل إنتاجي محدد، استخدم -R لتحديد الحد الأقصى للطلبات في الثانية عبر جميع الاتصالات:

autocannon -c 50 -R 500 -d 60 http://localhost:3000
Enter fullscreen mode Exit fullscreen mode

هذا يحافظ على الاختبار عند 500 طلب/ثانية لمدة 60 ثانية.

استخدم هذا النمط عندما تريد إجابة مثل:

هل تبقى p99 أقل من 250ms عند 500 طلب/ثانية؟

بدلًا من سؤال:

ما أقصى حمل يمكنني دفعه حتى ينهار الخادم؟

الإحماء وسلاسل العمال

في الاختبارات الأثقل، استخدم الإحماء لتجنب تأثير ذاكرات التخزين المؤقت الباردة أو JIT غير المُسخّن.

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

autocannon -c 200 -d 30 -w 4 http://localhost:3000
Enter fullscreen mode Exit fullscreen mode
  • -w 4: يشغّل 4 سلاسل عمال.
  • استخدمه فقط إذا تأكدت أن مولد الحمل لا يستطيع توليد طلبات كافية.
  • إذا زدت -c ولم تتغير الإنتاجية أو وقت الاستجابة بشكل منطقي، فقد يكون جهاز الاختبار هو الحد، وليس الخادم.

قراءة نتائج autocannon

بعد انتهاء التشغيل، يطبع autocannon جدولًا مشابهًا:

Running 10s test @ http://localhost:3000
10 connections

┌───────────────┬──────┬──────┬───────┬──────┬─────────┬─────────┬──────────┐
│ الإحصائية     │ 2.5% │ 50%  │ 97.5% │ 99%  │ المتوسط │ الانحراف │ الحد الأقصى │
├───────────────┼──────┼──────┼───────┼──────┼─────────┼─────────┼──────────┤
│ وقت الاستجابة │ 0 ms │ 1 ms │ 4 ms  │ 6 ms │ 1.2 ms  │ 0.9 ms  │ 24.1 ms  │
└───────────────┴──────┴──────┴───────┴──────┴─────────┴─────────┴──────────┘

251 ألف طلب في 10.05 ثانية، 27.9 ميجابايت قراءة
Enter fullscreen mode Exit fullscreen mode

اقرأ النتائج بهذه الطريقة:

  • 50%: الوسيط. نصف الطلبات أسرع من هذا الرقم.
  • 97.5% و99%: أهم من المتوسط في أغلب APIs. هذه الأرقام تكشف بطء الذيل.
  • المتوسط: مفيد، لكنه قد يخفي مشاكل p99.
  • الانحراف المعياري: إذا كان مرتفعًا، فالاستجابة غير مستقرة.
  • سطر الملخص: يوضح إجمالي الطلبات خلال مدة الاختبار. منه تستنتج الطلبات في الثانية.

لإظهار نسب مئوية أكثر تفصيلًا ورموز الحالة:

autocannon -c 100 -d 20 -l --renderStatusCodes http://localhost:3000
Enter fullscreen mode Exit fullscreen mode

استخدم هذا دائمًا عند تقييم نتيجة جادة، لأن الإنتاجية العالية لا تعني شيئًا إذا كانت نسبة كبيرة من الردود 500 أو 429.

قاعدة عملية:

إذا كانت الردود غير 2xx ليست صفرًا، فأنت تقيس سرعة الفشل، لا سرعة النجاح.

استخدام autocannon برمجيًا في Node.js

يوفر autocannon API برمجية، ما يجعله مناسبًا لسكربتات CI أو بوابات الأداء.

مثال بسيط:

const autocannon = require('autocannon')

async function run() {
  const result = await autocannon({
    url: 'http://localhost:3000',
    connections: 100,
    duration: 20,
    pipelining: 1
  })

  console.log(`متوسط وقت الاستجابة: ${result.latency.average} ms`)
  console.log(`الطلبات/ثانية: ${result.requests.average}`)
  console.log(`غير 2xx: ${result.non2xx}`)
}

run()
Enter fullscreen mode Exit fullscreen mode

الكائن result يحتوي على بيانات مثل:

  • result.latency.average
  • result.latency.p99
  • result.requests.average
  • result.throughput.average
  • result.errors
  • result.timeouts
  • result.non2xx

تحويل اختبار الأداء إلى بوابة CI

يمكنك إفشال البناء إذا تجاوز p99 ميزانية محددة أو ظهرت ردود غير 2xx:

const autocannon = require('autocannon')

const P99_BUDGET_MS = 250

async function run() {
  const result = await autocannon({
    url: 'http://localhost:3000/api/health',
    connections: 100,
    duration: 30
  })

  const p99 = result.latency.p99

  console.log(`وقت استجابة p99: ${p99} ms`)
  console.log(`الميزانية: ${P99_BUDGET_MS} ms`)
  console.log(`غير 2xx: ${result.non2xx}`)

  if (p99 > P99_BUDGET_MS || result.non2xx > 0) {
    console.error('تم تجاوز ميزانية الأداء')
    process.exit(1)
  }
}

run()
Enter fullscreen mode Exit fullscreen mode

بهذا يصبح اختبار الأداء شرط نجاح/فشل واضحًا في CI.

عرض التقدم المباشر

إذا أردت نفس شريط التقدم وجدول النتائج في CLI أثناء التشغيل البرمجي:

const autocannon = require('autocannon')

const instance = autocannon({
  url: 'http://localhost:3000',
  connections: 10,
  duration: 10
}, console.log)

autocannon.track(instance, { renderProgressBar: true })

process.once('SIGINT', () => instance.stop())
Enter fullscreen mode Exit fullscreen mode

سيناريو متعدد الطلبات

لاختبار مسار يمر عبر أكثر من طلب، مرر مصفوفة requests:

const autocannon = require('autocannon')

autocannon({
  url: 'http://localhost:3000',
  connections: 20,
  duration: 15,
  requests: [
    {
      method: 'GET',
      path: '/api/users'
    },
    {
      method: 'POST',
      path: '/api/data',
      body: '{"x":1}',
      headers: {
        'Content-Type': 'application/json'
      }
    }
  ]
}, console.log)
Enter fullscreen mode Exit fullscreen mode

هذا مفيد عندما تريد تحميلًا أقرب لاستخدام حقيقي بدل ضرب نقطة نهاية واحدة فقط.

autocannon مقابل wrk و ab

الأدوات الثلاثة تجيب عن السؤال نفسه: ما سرعة API تحت حمل معيّن؟

  • Apache Bench أو ab: بسيط ومتوفر على نطاق واسع، لكنه قديم وأحادي الخيط.
  • wrk: سريع جدًا ويدعم تخصيص الطلبات عبر Lua، لكنه أداة C خارج npm.
  • autocannon: مناسب جدًا إذا كان مشروعك يستخدم Node.js، لأنه يُثبت عبر npm ويوفر CLI وAPI برمجية.

إذا كانت بيئتك Node، فغالبًا autocannon هو الخيار الأقل تعقيدًا.

لخيارات أخرى، راجع:

أين يتناسب الاختبار الوظيفي و Apidog؟

قد يخبرك autocannon أن نقطة النهاية تخدم 12,000 طلب/ثانية مع p99 يساوي 40ms. لكنه لا يخبرك هل الاستجابة صحيحة.

يمكن لاختبار الأداء أن ينجح بينما API:

  • تُرجع JSON غير صحيح.
  • تتجاهل رأس المصادقة.
  • تخالف عقد OpenAPI.
  • تفشل في خطوة داخل سير عمل متعدد الطلبات.

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

يمكنك تشغيل الاثنين في CI:

  • autocannon: هل API سريع بما يكفي تحت الحمل؟
  • Apidog CLI: هل API صحيح وظيفيًا ومتوافق مع العقد؟

مثال تشغيل Apidog CLI:

npm install -g apidog-cli

apidog run \
  --access-token "$APIDOG_ACCESS_TOKEN" \
  -t <scenarioOrSuiteId> \
  -e <environmentId> \
  -r cli,html,junit
Enter fullscreen mode Exit fullscreen mode

المعاني:

  • -t: معرف سيناريو أو مجلد أو مجموعة اختبار محفوظة.
  • -e: معرف البيئة.
  • -r: نوع التقارير، مثل cli, html, json, junit.

للتفاصيل، راجع:

نمط عملي جيد:

  1. شغّل الاختبارات الوظيفية والتعاقدية عند كل push.
  2. شغّل اختبار تحميل قبل الإصدار أو عند تغييرات الأداء الحساسة.
  3. افشل CI إذا ظهرت أخطاء وظيفية أو تجاوز p99 ميزانية الأداء.

autocannon يجيب عن سؤال التحمل. Apidog يجيب عن سؤال الصحة.

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

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

ينتج autocannon أرقامًا موثوقة للإنتاجية ووقت الاستجابة لنقاط نهاية HTTP/1.1. وعند استخدام -R لتحديد معدل مستهدف، فإنه يتعامل مع مشكلة التخلف المنسق coordinated omission.

لنتائج أفضل:

  • شغّله من جهاز قريب شبكيًا من الخادم.
  • استخدم بيئة staging تشبه الإنتاج.
  • لا تعتمد على خادم التطوير المحلي للحكم النهائي.
  • تأكد أن جهاز توليد الحمل ليس هو عنق الزجاجة.

هل يدعم autocannon بروتوكول HTTP/2 أو WebSockets؟

لا. autocannon مخصص لـ HTTP/1.1. لاختبار HTTP/2 أو WebSocket، ستحتاج إلى أداة مختلفة.

كم عدد الاتصالات التي يجب استخدامها؟

ابدأ بالافتراضي:

autocannon http://localhost:3000
Enter fullscreen mode Exit fullscreen mode

ثم ارفع -c تدريجيًا:

autocannon -c 50 -d 20 http://localhost:3000
autocannon -c 100 -d 20 http://localhost:3000
autocannon -c 200 -d 20 http://localhost:3000
Enter fullscreen mode Exit fullscreen mode

راقب:

  • الطلبات في الثانية.
  • p99.
  • الأخطاء.
  • الردود غير 2xx.

النقطة التي تتوقف عندها الإنتاجية عن الارتفاع ويبدأ p99 بالصعود هي تقريبًا الحد العملي لنقطة النهاية.

هل يمكن تشغيل autocannon في CI؟

نعم. استخدم API البرمجية، واقرأ result.latency.p99 وresult.non2xx، ثم استدعِ process.exit(1) عند تجاوز ميزانية الأداء.

هذا يجعله مناسبًا لأي CI يستطيع تشغيل Node.js.

ما الفرق بين -a و -d؟

-d يشغّل الاختبار لمدة زمنية:

autocannon -d 30 http://localhost:3000
Enter fullscreen mode Exit fullscreen mode

-a يشغّل الاختبار حتى يكتمل عدد معين من الطلبات:

autocannon -a 10000 http://localhost:3000
Enter fullscreen mode Exit fullscreen mode

استخدم -d لاختبار حمل مستقر، واستخدم -a عندما تحتاج إلى إرسال عدد دقيق من الطلبات.

Top comments (0)