تست کارایی برنامههای تحت وب با Siege - قسمت اول
وقتی یک برنامه تحت وب شروع به کار میکند شاید در نگاه اول همه چیز خوب به نظر برسد اما با رشد کاربران و افزایش ترافیک، سیستم چگونه کار خواهد کرد؟
اگر برنامه تحت وب را یک جعبه در نظر بگیریم،درخواست به برنامه ارسال میشود،درخواست پردازش میشود ودر نهایت پاسخی نمایش داده می شود.
با ابزار siege
میتوانیم regression test
, load test
, stress test
را به خوبی انجام دهیم.
فرض کنید میخواهید برنامه ی تحت وب خود را برای یک میلیون کاربر آماده کنید.برای تست این برنامه دو راه وجود دارد، راه اول این است که از یک میلیون کاربر بخواهید که برنامه ی شما را تست کنند و راه دوم شبیه سازی این تعداد کاربر است.
Load test
:
وقتی که برنامه تحت وب را برای تعداد مشخص و از قبل تعیین شدهای از درخواست ها تست میکنیم،به این حالت load test
می گویند.
Stress test
:
اگر تعداد درخواست از سطح مشخص شده فراتر رود در این صورت تست را stress test
می گویند.
Regression test
:
وقتی تغییری در نرمافزار داده می شود،چگونه بفهمیم کارایی نرمافزار افزایش یافته است یا کاهش؟ برای حصول اطمینان از یکسان بودن کارایی سرور قبل و بعد از تغییر، regression test
انجام می شود.
اگر بخواهیم زیرساخت ها ی پروژه را تغییر دهیم دوباره به regression test
نیاز خواهیم داشت.فرض کنید پروژه بر روی وب سرور Apache
باشد و بخواهیم وب سرور را به Nginx
تغییر دهیم. قبل از تغییر وب سرور،برنامه به صورت میانگین قادر به مدیریت N در خواست در دقیقه است. از کجا معلوم که با تغییر وب سرور کارایی برنامه کاهش نیابد و همچنان N در خواست در دقیقه قابل مدیریت باشد؟
مراحل انجام یک تست موفق:
برنامه ریزی:
در این مرحله باید به سؤالاتی از این قبیل پاسخ داده شود.چه چیزی باید تست شود؟چه انتظاری از تست وجود دارد؟ترافیک روی سرور چقدر باید باشد؟تست بر روی کدام آدرس باید انجام شود؟ و . . .
آماده سازی:
در این مرحله باید از ایزوله بودن محیط تست اطمینان حاصل شود.برای انجام تست های بعدی هم از همین محیط ایزوله استفاده کنید.
آنالیز:
نتایج حاصل از تست باید مورد ارزیابی دقیق قرار گیرند.
شروع کار با Siege:
siege
ابزاری فوقالعاده برای بنچمارک گیری و تست اپلیکیشن های تحت وب است.این ابزار کاربران همزمان را برای تست اپ های تحت وب شبیه سازی می کند.
نصب:
در توزیع ابونتو ابزار siege بدین صورت نصب می شود:
sudo apt-get install siege
ایجاد سرور آزمایشی:
برای این آموزش یک سرور با استفاده از تورنادو ایجاد می کنیم.
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.httpserver
from tornado.options import options, define
define("port", default=8888, help="run on the given port", type=int)
class Appliaction(tornado.web.Application):
def __init__(self):
urlpatterns = [
(r"/", HomeHandler),
]
settings = dict(
debug=True,
)
super().__init__(urlpatterns, **settings)
class HomeHandler(tornado.web.RequestHandler):
def get(self):
self.write({'status': 'Ok'})
def main():
tornado.options.parse_command_line()
http_server = tornado.httpserver.HTTPServer(Appliaction())
http_server.listen(options.port)
print('Server started on port {}'.format(options.port))
tornado.ioloop.IOLoop.instance().start()
if __name__ == "__main__":
main()
برای اجرای این اپلیکیشن باید پایتون و تورنادو نصب باشد.(البته میتوانید سرور را با زبانهای دیگری نیز ایجاد کنید)این برنامه به صورت پیشفرض بر روی پورت 8888 اجرا میشود اما میتوانیم باآرگومان --port =PORT
پورت را تغییر دهیم.با دستور python serverName.py --port=PORT
سرور را اجرا می کنیم. اگر به آدرس localhost:8888
در خواستی ارسال شود،خروجی json
برگشت داده می شود.
اصول اولیه کار با siege:
برای شروع کار دستورات زیر را در شل اجرا کنید:
siege URL
به جای URL باید آدرس مورد نظر جایگزین شود.در این صورت تست با پارامتر های پیشفرض انجام می شود.برای اتمام تست از کلید های ترکیبی CTRL+C
استفاده کنید.
اولین تست:
siege -c 1 -r 1 http://localhost:8888/
خروجی به صورت زیر است:
** SIEGE 4.0.4
** Preparing 1 concurrent users for battle.
The server is now under siege...
Transactions: 1 hits
Availability: 100.00 %
Elapsed time: 0.01 secs
Data transferred: 0.00 MB
Response time: 0.01 secs
Transaction rate: 100.00 trans/sec
Throughput: 0.00 MB/sec
Concurrency: 1.00
Successful transactions: 1
Failed transactions: 0
Longest transaction: 0.01
Shortest transaction: 0.01
تست برای یک بار (-r 1)
و برای یک کاربر(-c 1)
بر روی آدرس http://localhost:8888/
انجام می شود.
تحلیل خروجی تست:
Transaction:برای هر کلاینت از طرف سرور یک سوکت باز می شود،درخواست مدیریت می شود،پاسخ برگشت داده میشود و درنهایت سوکت بسته می شود.این ها کارهایی است که در یک تراکنش انجام می شود.
Avaliability:
درصد کانکشن هایی است که با موفقیت توسط سرور مدیریت شده اند.
Elapsed time:
زمان انجام تست است.
Data transferred:
مجموع دادههایی است که از طرف سرور به هر کاربر شبیه سازی شده ارسال شده است.
Response time:
میانگین زمانی برای پاسخ به درخواست یک کاربر شبیه سازی شده است.
Transaction rate:
میانگین تعداد تراکنش هایی است که سرور میتواند در یک ثانیه مدیریت کند(Transaction / Elapsed time)
Throughput:
میانگین تعداد بایت هایی است که در هر ثانیه از سرور به تمام کاربران شبیه سازی شده انتقال می یابد.
Concurrency:
حاصل تقسیم تعداد کل تراکنش ها به زمان کل سپری شده است(Transaction/ Elapsed time ).هر چه این عدد بزرگتر باشد،کارایی سرور کمتر است.
Successful transactions:
تعداد دفعاتی که کد پاسخ(response code)برگشت داده شده از طرف سرور کوچک تر از 400 است.(تراکنش با موفقیت انجام شده باشد)
Failed transactions:
تعداد دفعاتی که کد پاسخ برگشت داده شده از طرف سرور بزرگتر یا مساوی 400 باشد به علاوه تراکنش هایی که اصطلاحاً timeout می شوند.
Longest transaction:
بیشترین زمانی که یک تراکنش طول کشیده است.
Shortest transaction:
کمترین زمانی که یک تراکنش طول کشیده است.