Bagaimana cara menghasilkan permintaan laju konstan di k6 dengan API skrip baru?

Halo, Khabrovites. Menjelang dimulainya kursus "Pengujian Beban" , kami telah menyiapkan terjemahan dari materi menarik lainnya untuk Anda.






pengantar



Rilis v0.27.0 memberi kami mesin eksekusi baru dan banyak eksekutor baru untuk memenuhi kebutuhan spesifik Anda. Ini juga mencakup API skrip baru dengan banyak opsi berbeda untuk menyetel dan mensimulasikan beban sistem yang sedang diuji (SUT). Ini adalah hasil dari satu setengah tahun pengerjaan permintaan tarik # 1007 yang terkenal itu .



Untuk menghasilkan kueri dengan kecepatan konstan, kita dapat menggunakanconstant-arrival-ratepenampil. Runner ini menjalankan pengujian dengan iterasi pada frekuensi tetap untuk waktu yang ditentukan. Hal ini memungkinkan k6 untuk secara dinamis mengubah jumlah pengguna virtual (VU) aktif selama eksekusi pengujian untuk mencapai jumlah iterasi yang ditentukan per unit waktu. Pada artikel ini, saya akan menjelaskan cara menggunakan skenario ini untuk menghasilkan permintaan dengan kecepatan konstan.



Dasar-dasar opsi konfigurasi skrip



Mari kita lihat parameter kunci yang digunakan di k6 untuk mendeskripsikan konfigurasi pengujian dalam skrip yang menggunakan constant-arrival-rateeksekutor:



  • 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:

    , .


Bersama-sama, parameter ini membentuk skrip yang merupakan bagian dari opsi konfigurasi pengujian. Potongan kode di bawah ini adalah contoh constant-arrival-rateskrip.



Dalam konfigurasi ini, kami memiliki constant_request_rateskrip, yang merupakan pengenal unik yang digunakan sebagai label untuk skrip. Skenario ini menggunakan constant-arrival-rateeksekutor dan berjalan dalam 1 menit. Setiap detik ( timeUnit), 1 iterasi ( rate) akan dilakukan . Kumpulan pengguna virtual yang disediakan sebelumnya berisi 20 instance dan dapat mencapai 100, bergantung pada jumlah permintaan dan iterasi.



Ketahuilah bahwa menginisialisasi pengguna virtual selama pengujian dapat menghabiskan banyak CPU sehingga hasil pengujian tidak sesuai. Secara umum, lebih baik jika preAllocatedVUcukup untuk menjalankan uji beban. Oleh karena itu, jangan lupa untuk mengalokasikan lebih banyak pengguna virtual bergantung pada jumlah permintaan dalam pengujian Anda dan kecepatan yang Anda inginkan untuk menjalankan pengujian.



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


Contoh menghasilkan permintaan dengan frekuensi konstan dengan constant-arrival-rate



Dalam tutorial sebelumnya, kami mendemonstrasikan cara menghitung tingkat permintaan konstan. Mari kita lihat lagi, dengan mengingat cara kerja skrip:



Misalkan Anda mengharapkan sistem Anda yang sedang diuji untuk menangani 1000 permintaan per detik pada titik akhir. Melakukan pra-alokasi 100 pengguna virtual (maksimum 200) memungkinkan setiap pengguna virtual mengirim sekitar 5 ~ 10 permintaan (berdasarkan 100 ~ 200 pengguna virtual). Jika setiap permintaan membutuhkan waktu lebih dari 1 detik untuk diselesaikan, Anda akhirnya membuat permintaan lebih sedikit dari yang diharapkan (lebihdropped_iterations), yang merupakan tanda masalah kinerja atau ekspektasi yang tidak realistis untuk sistem Anda yang sedang diuji. Jika ini masalahnya, Anda harus memperbaiki masalah kinerja dan memulai ulang pengujian, atau memoderasi harapan Anda dengan menyesuaikan timeUnit.



Dalam skenario ini, setiap pengguna virtual yang disediakan sebelumnya akan membuat 10 permintaan ( ratedapat dibagi olehpreAllocatedVU). Jika permintaan tidak diterima dalam 1 detik, misalnya, butuh lebih dari 1 detik untuk mendapatkan tanggapan, atau sistem Anda yang sedang diuji membutuhkan waktu lebih dari 1 detik untuk menyelesaikan tugas, k6 akan meningkatkan jumlah pengguna virtual untuk mengkompensasi permintaan yang terlewat. Pengujian berikut menghasilkan 1000 permintaan per detik dan berjalan selama 30 detik, yang kira-kira 30.000 permintaan, seperti yang Anda lihat pada keluaran di bawah ini: http_reqsdan iterations. Selain itu, k6 hanya digunakan 148 dari 200 pengguna virtual.



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');
}


Hasil dari menjalankan skrip ini adalah sebagai berikut:



$ 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


Saat menulis skrip tes, pertimbangkan hal-hal berikut:



  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. Ingatlah bahwa API skrip tidak mendukung penggunaan global dari durasi, vus, dan tahapan, meskipun mereka masih dapat digunakan. Ini juga berarti bahwa Anda tidak dapat menggunakannya bersama dengan skrip.


Kesimpulan



Sebelum rilis v0.27.0 , k6 tidak memiliki dukungan yang memadai untuk menghasilkan permintaan dengan kecepatan konstan. Oleh karena itu, kami menerapkan solusi di JavaScript , menghitung waktu yang dibutuhkan untuk menyelesaikan permintaan untuk setiap iterasi skrip. Dengan v0.27.0, ini tidak lagi diperlukan.



Pada artikel ini, saya membahas bagaimana k6 dapat mencapai tingkat permintaan yang konsisten dengan penggunaan API skrip baruconstant-arrival-ratepenampil. Pelaksana ini menyederhanakan kode dan menyediakan sarana untuk mencapai jumlah permintaan tetap per detik. Ini berbeda dengan versi sebelumnya dari artikel yang sama, di mana saya menjelaskan metode lain untuk mencapai hasil yang secara substansial sama dengan menghitung jumlah pengguna virtual, iterasi, dan durasi menggunakan rumus dan beberapa kode JavaScript boilerplate. Untungnya, pendekatan baru ini berfungsi sebagaimana mestinya dan kami tidak perlu lagi menggunakan peretasan apa pun.



Saya harap Anda menikmati membaca artikel ini. Saya akan senang mendengar tanggapan Anda.







Baca lebih banyak






All Articles