كيفية إنشاء طلبات معدل ثابت في k6 باستخدام واجهة برمجة تطبيقات البرمجة الجديدة؟

مرحبا خابروفيتس. عشية بدء دورة اختبار الحمل ، قمنا بإعداد ترجمة لمواد أخرى مثيرة للاهتمام.






المقدمة



لقد جلب لنا الإصدار v0.27.0 محرك تنفيذ جديد والعديد من المنفذين الجدد لتلبية متطلباتك الخاصة. يتضمن أيضًا واجهة برمجة تطبيقات برمجة جديدة مع العديد من الخيارات المختلفة لضبط ومحاكاة تحميل النظام قيد الاختبار (SUT). هذه نتيجة عام ونصف من العمل على طلب السحب # 1007 سيئ السمعة .



لإنشاء استعلامات بمعدل ثابت ، يمكننا استخدامconstant-arrival-rateالمؤدي. يقوم هذا العداء بإجراء الاختبار مع التكرارات بتردد ثابت للوقت المحدد. يسمح هذا لـ k6 بتغيير عدد المستخدمين الظاهريين النشطين (VUs) ديناميكيًا أثناء تنفيذ الاختبار من أجل تحقيق العدد المحدد من التكرارات لكل وحدة زمنية. في هذه المقالة ، سأشرح كيفية استخدام هذا السيناريو لإنشاء طلبات بمعدل ثابت.



أساسيات خيارات تكوين البرنامج النصي



دعنا نلقي نظرة على المعلمات الرئيسية المستخدمة في k6 لوصف تكوين اختبار في برنامج نصي يستخدم constant-arrival-rateالمنفذ:



  • executor ():

    — k6. VU - — , , .
  • rate () timeUnit ( ):

    k6 rate timeUnit .



    :



    • rate: 1, timeUnit: '1s' « »
    • rate: 1, timeUnit: '1m' « »
    • rate: 90, timeUnit: '1m' « 90 », 1,5 /, 667 ,
    • rate: 50, timeUnit: '1s' « 50 », 50 (requests per second — RPS), , .. 20
  • duration ():

    , gracefulStop.
  • preAllocatedVUs:

    .
  • maxVUs:

    , .


تشكل هذه المعلمات معًا برنامجًا نصيًا يمثل جزءًا من خيارات تكوين الاختبار. مقتطف الشفرة أدناه هو نموذج constant-arrival-rateنصي.



في هذا التكوين ، لدينا برنامج constant_request_rateنصي ، وهو معرف فريد يستخدم كتسمية للبرنامج النصي. يستخدم هذا السيناريو constant-arrival-rateالمنفذ ويتم تشغيله في دقيقة واحدة. كل ثانية ( timeUnit) ، سيتم تنفيذ تكرار واحد ( rate). تحتوي مجموعة المستخدمين الظاهري الذين تم توفيرهم مسبقًا على 20 نسخة ويمكن أن تصل إلى 100 ، اعتمادًا على عدد الطلبات والتكرارات.



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



export let options = {
  scenarios: {
    constant_request_rate: {
      executor: 'constant-arrival-rate',
      rate: 1,
      timeUnit: '1s',
      duration: '1m',
      preAllocatedVUs: 20,
      maxVUs: 100,
    }
  }
};


مثال لتوليد الطلبات بتردد ثابت مع constant-arrival-rate



في البرنامج التعليمي السابق ، أوضحنا كيفية حساب معدل الطلب الثابت. دعنا نلقي نظرة عليها مرة أخرى ، مع الأخذ في الاعتبار كيفية عمل البرمجة النصية:



لنفترض أنك تتوقع أن يقوم نظامك قيد الاختبار بمعالجة 1000 طلب في الثانية عند نقطة نهاية. يسمح التخصيص المسبق لـ 100 مستخدم افتراضي (بحد أقصى 200) لكل مستخدم افتراضي بإرسال ما يقرب من 5 إلى 10 طلبات (استنادًا إلى 100 ~ 200 مستخدم افتراضي). إذا استغرق كل طلب أكثر من ثانية واحدة لإكماله ، ينتهي بك الأمر بتقديم طلبات أقل من المتوقع (أكثرdropped_iterations) ، وهي علامة على مشكلات في الأداء أو توقعات غير واقعية لنظامك قيد الاختبار. إذا كانت هذه هي الحالة ، يجب عليك إصلاح مشكلات الأداء وإعادة تشغيل الاختبار ، أو تعديل توقعاتك عن طريق التعديل timeUnit.



في هذا السيناريو ، سيقدم كل مستخدم افتراضي تم توفيره مسبقًا 10 طلبات ( rateقابلة للقسمة علىpreAllocatedVU). إذا لم يتم استلام الطلبات في غضون ثانية واحدة ، على سبيل المثال ، استغرق الأمر أكثر من ثانية واحدة للحصول على استجابة ، أو استغرق نظامك قيد الاختبار أكثر من ثانية واحدة لإكمال المهمة ، سيزيد k6 عدد المستخدمين الظاهريين للتعويض عن الطلبات الفائتة. يولد الاختبار التالي 1000 طلبًا في الثانية ويعمل لمدة 30 ثانية ، أي ما يقرب من 30000 طلب ، كما ترى في الإخراج أدناه: http_reqsو iterations. بالإضافة إلى ذلك ، استخدم k6 148 فقط من بين 200 مستخدم افتراضي.



import http from 'k6/http';

export let options = {
    scenarios: {
        constant_request_rate: {
            executor: 'constant-arrival-rate',
            rate: 1000,
            timeUnit: '1s', // 1000   , ..1000  
            duration: '30s',
            preAllocatedVUs: 100, //      
            maxVUs: 200, //  preAllocatedVU ,    ,    
        }
    }
};

export default function () {
    http.get('http://test.k6.io/contacts.php');
}


ستكون نتيجة تنفيذ هذا النص كما يلي:



$ k6 run test.js


          /\      |‾‾|  /‾‾/  /‾/

     /\  /  \     |  |_/  /  / /

    /  \/    \    |      |  /  ‾‾\

   /          \   |  |‾\  \ | (_) |

  / __________ \  |__|  \__\ \___/ .io

  execution: local
     script: test.js
     output: -

  scenarios: (100.00%) 1 executors, 200 max VUs, 1m0s max duration (incl. graceful stop):
           * constant_request_rate: 1000.00 iterations/s for 30s (maxVUs: 100-200, gracefulStop: 30s)

running (0m30.2s), 000/148 VUs, 29111 complete and 0 interrupted iterations
constant_request_rate ✓ [======================================] 148/148 VUs  301000 iters/s

    data_received..............: 21 MB  686 kB/s
    data_sent..................: 2.6 MB 85 kB/s
    *dropped_iterations.........: 889    29.454563/s
    http_req_blocked...........: avg=597.53µs min=1.64µs  med=7.28µs   max=152.48ms p(90)=9.42µs   p(95)=10.78µs
    http_req_connecting........: avg=561.67µs min=0s      med=0s       max=148.39ms p(90)=0s       p(95)=0s
    http_req_duration..........: avg=107.69ms min=98.75ms med=106.82ms max=156.54ms p(90)=111.73ms p(95)=116.78ms
    http_req_receiving.........: avg=155.12µs min=21.1µs  med=105.52µs max=34.21ms  p(90)=147.69µs p(95)=190.29µs
    http_req_sending...........: avg=46.98µs  min=9.81µs  med=41.19µs  max=5.85ms   p(90)=53.33µs  p(95)=67.3µs
    http_req_tls_handshaking...: avg=0s       min=0s      med=0s       max=0s       p(90)=0s       p(95)=0s
    http_req_waiting...........: avg=107.49ms min=98.62ms med=106.62ms max=156.39ms p(90)=111.52ms p(95)=116.51ms
    *http_reqs..................: 29111  964.512705/s
    iteration_duration.........: avg=108.54ms min=99.1ms  med=107.08ms max=268.68ms p(90)=112.09ms p(95)=118.96ms
    *iterations.................: 29111  964.512705/s
    vus........................: 148    min=108 max=148
    vus_max....................: 148    min=108 max=148


عند كتابة نص اختبار ، ضع في اعتبارك النقاط التالية:



  1. k6 (), . , , maxRedirects: 0 . http , maxRedirects.
  2. . , , , , sleep().
  3. , , . preAllocatedVU / maxVU, , , , preAllocatedVU, maxVU .



    WARN[0005] Insufficient VUs, reached 100 active VUs and cannot initialize more  executor=constant-arrival-rate scenario=constant_request_rate


  4. , drop_iterations, iterations http_reqs . dropped_iterations , , . , , preAllocatedVU. , , , .
  5. , , . :



    WARN[0008] Request Failed
  6. تذكر أن واجهة برمجة تطبيقات البرمجة النصية لا تدعم الاستخدام العام للمدة و vus والمراحل ، على الرغم من أنه لا يزال من الممكن استخدامها. هذا يعني أيضًا أنه لا يمكنك استخدامها مع البرامج النصية.


خاتمة



قبل إصدار v0.27.0 ، لم يكن لدى k6 دعم كافٍ لتوليد الطلبات بمعدل ثابت. لذلك ، قمنا بتنفيذ حل بديل في JavaScript ، بحساب الوقت المستغرق لإكمال الطلبات لكل تكرار للبرنامج النصي. مع الإصدار 0.27.0 لم يعد هذا ضروريًا.



في هذه المقالة ، ناقشت كيف يمكن لـ k6 تحقيق معدل طلب متسق باستخدام واجهة برمجة تطبيقات البرمجة النصية الجديدةconstant-arrival-rateالمؤدي. يبسط هذا المنفذ الكود ويوفر الوسائل لتحقيق عدد ثابت من الطلبات في الثانية. هذا على النقيض من الإصدار السابق من نفس المقالة ، الذي وصفت فيه طريقة أخرى لتحقيق نفس النتائج إلى حد كبير من خلال حساب عدد المستخدمين الظاهريين ، والتكرارات ، والمدة باستخدام صيغة وبعض التعليمات البرمجية لجافا سكريبت. لحسن الحظ ، يعمل هذا النهج الجديد على النحو المنشود ولم نعد بحاجة إلى استخدام أي عمليات اختراق.



أتمنى أن تكون قد استمتعت بقراءة هذا المقال. أنا أحب أن أسمع رأيك.







اقرأ أكثر






All Articles