مقایسه ابزارهای لود تست vegeta ,k6,siege

هر سرویسی که آماده میشه و قراره نتیجه خوبی داشته باشه ، احتمالا تستهای خوبی هم داره . یه نوع تست(functionality)برای اینه که بفهمیم اصلا برنامه ای که نوشتیم کار میکنه یا نه . احتمالا با این نوع تست آشنا ترید . اما الان قراره راجع به تستی صحبت کنیم که میخواد لود بندازه روی سیستم ، میخواد ببینه سیستم چند دقیقه تحت فشار دوام میاره ، اصلا تحت فشار کار میکنه؟ چطور کار میکنه ؟ چقدر بازدهی داره؟ اگه اتفاقی بیفته ، اگه تعداد ریکوئستها از یه حدی بالاتر بره چی میشه؟ اگه یوزرهامون از یه حدی بیشتر بشن آیا سرویس ما کماکان پاسخگو هست؟ برای این کارا مثل هر کار دیگه ای توی دنیای برنامه نویسی یه سری ابزار وجود دارن ، سه تا ابزار opensource در این زمینه رو در این پست بررسی میکنیم . این پست صرفا یک مقایسه نیست ، این کد زیسته هست!!!! یک تجربه واقعی .DSL (domain specific language ): در مورد dsl باید بگم که از بین این سه تا ابزار k6 فقط این قابلیت رو داره . dsl اون هم شبیه جاوااسکریپته . پس احتمالا کار کردن باهاش خیلی طول نمیکشه .متاسفانه vegeta و siege این ویژگی رو ندارن . صرفا میتونیم یه فایل به سبکی که دوست دارن تولید کنیم و توی اون فایل ریکوئست ها رو بذاریم . بعد بگیم حالا بر اساس این ریکوئست ها روی api لود بندازید.Request per second :در این مورد باید عرض کنم که احتمالا vegeta بهترین گزینه هست . فرض کنید مثلا k6 بتونه 2000 تا ریکوئست در یک ثانیه بزنه اما vegeta پتانسیلهای بیشتری در این زمینه نشون میده. Long time load test : خب میرسیم به مقوله ای که خیلی برای شبیه سازی استفاده از یه برنامه یه api یا یه سرویس مفیده ، تست بلند مدت . برای تست بلند مدت از هر سه اینها میتونیم استفاده کنیم . اما فقط k6 درواقعیت به کار من اومد . چرا؟ چون هر ریکوئست ما باید با ریکوئست بعدیمون فرق میکرد . برای همچین کاری توی k6 به راحتی میتونیم با استفاده از dsl اون که خیلی جاوااسکریپتیه کد بزنیم و کار خیلی روون انجام میشه . اما اگر بخوایم با vegeta تست کنیم چه مساله ای پیش میاد؟ وگتا اول از ما یه فایل میخواد که ریکوئست هامون توش باشه . اگه قراره داده ای در حین این ریکوئست ارسال بشه هم باید توی همون فایل مشخص کنیم و آدرسش رو بدیم . اما این چه مشکلی ایجاد میکنه؟ مشکل اونجا پیش میاد که وگتا همون اول میاد کل فایل رو میخونه به ازای هر ریکوئست در فایل یه ترد میزنه ، خب این باعث چی میشه ؟ out of memory .یعنی اگه فایلمون از یه حدی بلند تر باشه ، مثلا بیشتر از 20هزار تا ریکوئست توی فایل باشه و ram مثلا 16 گیگ باشه دچار این مشکل میشیم . البته برای حل این مشکل در ابتدا یه حرکتی میشه زد ، بیایم یه کدی بزنیم که بیاد این فایل حاوی ریکوئستها رو بسازه ، بعد بیاد وگتا رو صدا کنه و ریپورت رو بریزه توی یه فایلی ، بعد همین کار رو توی یه لوپ انجام بده یعنی مکررا بیاد فایل ریکوئستها رو بسازه و وگتا رو صدا کنه که البته این یه لودتست واقعی نخواهد بود . چون سرویس در اون یکی دوثانیه ای که ما مشغول ساختن فایل ریکوئست ها هستیم ، نفس میکشه و ما اینو نمیخوایم . این یه شبیه سازی واقعی نیست . بنابراین وگتا برای این کار خیلی مناسب نیست . شاید سوال پیش بیاد که چرا یه فایل کوتاه تر نمیسازیم و به وگتا نمیگیم که همین فایل کوتاه رو چندین بار اجرا کنه ؟ جواب اینه که در این حالت هم ریکوئست ها تکرار میشن و فایل ما همون فایله . درصورتی که ما میخواستیم ریکوئست ها کاملا یکتا باشن.البته همچین اتفاقی با siege نمیفته و از این جهت siege بهتر از vegeta هست . ولی به علت dsl خوب ، k6 میتونه گزینه بهتری باشه .جالبه بدونید k6 و vegeta رو با زبان go نوشتن و siege رو با C بزرگ .Metrics: متریکها و نتایج نهایی ،اینجاست که تفاوت ها مشخص میشن !در مورد میزان تاخیر و زمان صرف شده برای یک ریکوئستhttp و جواب اون باید گفت که vegeta خیلی کامله چون به شما میگه که بیشترین تاخیر () ، کمترین تاخیر () ، تاخیر ریکوئستی که از 99درصد ریکوئست ها کندتر بوده ، تاخیر میانگین ریکوئست ها ، تاخیر میانه ریکوئست ها ، تاخیر 90 و 95 درصد چقدر بوده .کِی6 هم تقریبا همین اوضاع رو داره اما تاخیر 90 درصد رو اعلام نمیکنه . ولی میتونیم خودمون توی dsl ش کد بزنیم و هر داده ای که بخوایم تولید کنیم .سیج توی این زمینه بدترین عملکرد رو داره و بیشترین کمترین و میانگین رو ارائه میده . در مورد انواع تاخیر اعلامی باید گفت که k6 گوی سبقت رو از رقبا ربوده، اعلام زمان های دریافتreceiving ، انتظار waiting،ارسال sending،اتصالconnecting،کل زمان صرف شدهduration در درخواست http ، اینا کم نیستن! Requests per second info :هر سه اینها اعلام میکنن که به طور میانگین در هرثانیه چقدر ریکوئست زدن . سیج توی این زمینه بدترینه . چون تعداد transaction ها رو اعلام میکنه (هر ریکوئست http برای سیج چند تا ترنزاکشن داره ) یعنی شما تهش نمیتونید بفهمید که سیج چند تا ریکوئست زده . چون یه عددی میده که احتمالا سه چهار برابره تعداد ریکوئست های شماست . کِی6 با توجه به اینکه dsl داده به ما توی این زمینه هم دست ما رو باز گذاشته . اما خودش در نهایت اعلام میکنه که چند ریکوئست در ثانیه و چندتا در کل زده . اما وگتا ، وگتا اینجا خیلی چیز خوبیه . چرا ؟ چون غیر از اعلام تعداد ریکوئست در کل و به طور میانگین در هر ثانیه ، اعلام میکنه که چندتا ریکوئست ، ریسپانسشون 200 بوده یا 400 بوده یا 0 یا هر استتوس کد دیگه ای .data out , data in :سیج به ما throughput رو اعلام میکنه و میگه در هرثانیه چقدر داده رفته و اومده .وگتا به تفکیک هر دوی اینها رو اعلام میکنه . کِی6 هم خیلی شیک هم دیتای ورودی هم خروجی رو اعلام میکنه علاوه بر اینها دیتای ورودی خروجی به طور میانگین در هر ثانیه رو هم اعلام میکنه.concurrent users:تعداد یوزرهای همزمان توی هر سه تا قابل تنظیم هستن . توی وگتا worker توی کِی6 vus: virtual users و توی سیج concurrent users هست .plot :با استفاده از k6 cloud میتونیم از قابلیت های زیادی استفاده کنیم برای آنالیز و نمودار کشیدن و این داستانا که البته این گزینه رایگان نیست. اما با توجه به خروجی های json و csv و همخوانی k6 با برخی ابزارهای نمودار مانند new relic ,statsd ,Grafana,dataDog میتوان به سادگی از این ابزارها استفاده کرد و نمودارهای خروجی را ترسیم کرد .سیج به طور مستقیم امکان ترسیم نمودار رو نداره . البته میشه خروجی ای ازش بگیری که بعدا با اون خروجی پلات بکشی !وگتا هم در این زمینه دستی بر آتش داره و خودش برامون یه فایل html میتونه بسازه که نمودار تاخیر latency بر حسب زمان رو اعلام کنه.نمودار با استفاده از k6 cloud میتوان از قابلیت های آنالیز بسیاری استفاده نمود که البته رایگان نیست .csv output : کِی6 بهترین گزینه در این مورده ،کِی6 به سادگی با استفاده از k6 run --out csv=test.csv script.js میتونه برامون فایل csv بسازه از نتیجه ی تست . خروجی csv در وگتا و سیج هم امکان پذیره .json output : کِی6 بهترین گزینه در این مورده ،کِی6 با استفاده از k6 run --out json=test.json script.js میتونه برامون فایل json بسازه از نتیجه ی تست . خروجی json در وگتا و سیج هم امکان پذیره .pictures of results : نمونه نتایج تست با هر کدام از ابزار ها را در زیر مشاهده میکنید .نتیجه تست با k6 نتیجه تست با vegetaنتیجه تست با siegeنکته :‌ تصویر آخر رو از اینترنت برداشتم و از تستهای خودم نیست. github links : https://github.com/loadimpact/k6 https://github.com/tsenart/vegetahttps://github.com/JoeDog/siege