تست کارایی برنامه‌های تحت وب با 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:

کم‌ترین زمانی که یک تراکنش طول کشیده است.

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی
طراح قالب : عرفـــ ـــان قدرت گرفته از بلاگ بیان