تصویر محمدعلی اکبری

قبل از بهبود

برای اطلاع از وضعیت فعلی سیستم و همچنین نتیجه‌ اقداماتی که برای بهبود کارایی انجام می‌شود، لازم است قبل از انجام هر مرحله از بهبود، وضعیت سیستم را بررسی و با نتیجه بهبود مقایسه کنیم.
به وسیله دستور ساده curl می‌توانیم مقادیر زمان اتصال، زمان پاسخ و زمان انتقال را مشخص کنیم.
 
F:\C>curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total} http://myworks.ir/portal/index.php?r=user/login
0.093:0.312:0.312
0.062:0.234:0.234
0.062:0.234:0.234
0.062:0.218:0.218

همچنین زمان بارگذاری با استفاده از Developer Tools تقریبا 8 ثانیه می‌باشد.
در این مقاله قسمت دوم از استک LAMP یعنی Apache را بهبود خواهیم داد.
Apache یک وب سرور بزرگ همراه با تنظیمات و کامپوننت های فراوان است. هر ویژگی از Apache باعث افزایش منابع مورد استفاده می‌شود. بنابراین بهینه سازی آپاچی بازی کردن با این تنظیمات و ویژگی‌ها است تا نیاز شما را با حداقل منابع پاسخ دهد.
 
راه اندازی MPM
ماژول‌های MPM (ماژول‌های چند پردازشی) کار مدیریت اتصالات و تحویل درخواست‌ها را برعهده دارند. چندین ماژول MPM وجود دارد که در هر زمان تنها یکی از آنها را می‌توان فعال باشد. برای فعال سازی هر ماژول MPM باید آن را همراه با Apache کامپایل کرد.
 
--with-mpm=(worker|prefork|event)

Prefork: یک روند (Process) به ازای هر درخواست.
Worker: از چند پردازش که هر کدام شامل چند نخ (Thread) هستند، استفاده می‌کند.
Event: هم اکنون در مرحله آزمایشی است، این ماژول برخی درخواست‌ها را به نخ‌های پشتیبان (supporting threads) ارسال می‌کند و نخ‌های اصلی (main threads) را برای پاسخ گویی به درخواست‌های جدید آزاد می‌کند. کاربرد آن حل مشکل سربار Keep alive است.
برای تعیین ماژول MPM فعلی دستور زیر را اجرا کنید:
 

[[email protected] /]# httpd -l
Compiled in modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c
 
ماژول‌هایی که از نخ‌ها به جای روند‌ها استفاده می‌کنند به نظر بهتر و سریع هستند. قبل از استفاده از ماژول Worker مطمئن شوید همه ماژول‌های مورد استفاده در Apache و همچنین PHP از نخ‌ها پشتیبانی می‌کنند. در غیر این صورت استفاده از Prefork راه کم خطرتری است.
بعد از انتخاب MPM مورد نظر، باید آن را تنظیم کنیم. یعنی چگونه و چند درخواست به وسیله روندها یا نخ‌ها پاسخ داده شوند.
یک تنظیم پیشنهادی برای حالت Prefork در ادامه آمده است. مقادیر Spare تعیین کننده تعداد روندهای Idle است، که باعث کاهش سربار ایجاد و خاتمه یک روند می‌شود. اگر مقدار MaxClients زیاد باشد، Apache برای پاسخگویی به درخواست‌ها بین روندهای فعلی و جدید Swap می‌کند که باعث افزایش سربار سرور و کاهش شدید کارایی می‌شود. از طرفی مقدار کم MaxClients باعث می‌شود از منابع به صورت کامل استفاده نشود. همچنین درخواست‌های بیش از MaxRequestsPerChild توسط Apache نادیده گرفته می‌شوند. مقدار MaxClients حداکثر می‌تواند مقدار ServerLimit باشد.
 
StartServers       30
MinSpareServers   15
MaxSpareServers   30
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000
 
اگر کاربرد سرور محدود به LAMP می‌شود، می‌توانید مقادیر StartServers و Spare را تا مصرف کامل RAM سرور افزایش دهید. به عنوان مثال اگر سرور 1GB حافظه RAM دارد، با توجه به تنظیمات MySql و نرم‌افزارهای دیگری که در همان سرور در حال اجرا هستند، می‌توان 600MB از این فضا را به روندهای Idle در Apache اختصاص داد. به ازای مصرف حافظه میانگین 20MB برای هر روند، حدود 600MB/20MB یعنی 30 روند Idle می‌توانیم داشته باشیم.
برای تعیین حافظه هر روند دستور زیر را اجرا کنید:
 
ps aux | grep httpd | grep -v pts | awk '{ tot += $6; procs += 1; print $2,$6,$11 } END { print "TOTAL: ",tot,"/",procs,"=",tot/procs }'

در دستور فوق httpd را به apache2 بسته به نوع سرور تغییر دهید.
در صورت افزایش تعداد روندها، مقدار زیادی RAM در هنگام شروع به کار Apache به آن اختصاص داده می‌شود، اما با افزایش درخواست‌ها این میزان تغییر نمی‌کند و بیشتر نمی‌شود. این بهبود در میزان مصرف CPU نیز تاثیر می‌گذارد و مصرف آن را در هنگام افزایش بار روی سرور کاهش می‌دهد.
 
استفاده از تنظیمات
هر درخواست در Apache قبل از پاسخگویی مجموعه پیچیده‌ای از قوانین را پشت سر می‌گذارد. این قوانین در فایل‌های تنظیمات Apache مانند httpd.conf و همچنین فایل‌های .htaccess تعریف می‌شوند. به عنوان مثال می‌توانید دسترسی روی فایل خاصی را برای نشانی IP خاصی محدود کنید، یا به Apache اجازه دهید Symlink ها را دنبال کند.
معمولا نیاز است قسمتی از این تنظیمات به ازای هر نرم‌افزار برای Apache در قالب فایل‌های .htaccess تعریف شود. لذا برای هر درخواست Apache کل مسیر دایرکتوری درخواست شده را برای یافتن فایل‌های .htaccess جستجو می‌کند.
سربار ناشی از این جستجو را با انتقال قوانین .htaccess به فایل‌های تنظیمات Apache از بین می‌بریم و سپس به طور کل AllowOverrides را غیر فعال می‌کنیم. 

تنظیمات KeepAlive
بارگذاری یک صفحه از وب‌سایت باعث ارسال تعداد زیادی درخواست برای بارگذاری فایل‌های CSS، JavaScript و Image موجود در همان صفحه می‌شود. غیر فعال بودن KeepAlive باعث می‌شود Apache ارتباط بین سرور و کاربر را برای هر درخواست از ابتدا ایجاد و در انتهای درخواست، خاتمه دهد. این باز و بسته کردن ارتباط بین سرور و کاربر باعث افزایش بار سیستم می‌شود. گاهی باز نگه داشتن ارتباط برای صفحات شامل تعداد زیاد فایل و عکس باعث افزایش 50% کارایی می‌شود.
 
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15

بعد از فعال کردن KeepAlive به صورت میانگین زمان بارگذاری صفحات از 7.7 ثانیه به 6.5 ثانیه کاهش پیدا کرد. 
فشرده سازی
درصد بالایی از داده‌های منتقل شده بین سرور و کاربر از نوع متن هستند، الگوریتم‌های فشرده‌سازی به صورت میانگین حجم فایل‌های متنی را تا 40% حجم اولیه کاهش می‌دهند. لذا یک فایل jQuery با حجم 100KB بعد از فشرده سازی تقریبا 40% حجم خواهد داشت.
این الگوریتم‌ها توسط مرورگرهای وب نیز مورد استفاده قرار می‌گیرد. لذا با فعال‌سازی این قابلیت در سرور، می‌توان حجم اطلاعات بازگشتی به سمت کاربر را کاهش داد.
برای این منظور از ماژول Deflate که همراه با آپاچی موجود است، استفاده می‌کنیم. اما قبل از آن برای مشاهده ماژول‌های موجود در Apache از دستور زیر استفاده کنید.
 

[[email protected] /]# apachectl –M
Loaded Modules:
 core_module (static)
 mpm_prefork_module (static)
 http_module (static)
 deflate_module (shared)

برای فعال سازی deflate_module فایل زیر را ایجاد کنید.
 

/etc/httpd/conf.d/deflate.conf
# Insert filter
SetOutputFilter DEFLATE
 
# Netscape 4.x has some problems...
BrowserMatch ^Mozilla/4 gzip-only-text/html
 
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4.0[678] no-gzip
 
# MSIE masquerades as Netscape, but it is fine
BrowserMatch bMSIE !no-gzip !gzip-only-text/html
 
# Don't compress images
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
 
# Don't compress already compressed stuff !
SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .pdf$ no-gzip dont-vary
 
# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
 
# Log Stuff !
# DeflateFilterNote Input input_info
# DeflateFilterNote Output output_info
# DeflateFilterNote Ratio ratio_info
# LogFormat '"%r" %{output_info}n/%{input_info}n (%{ratio_info}n%%)' deflate
# CustomLog /var/log/httpd/deflate_log deflate

سپس apache را دوباره راه اندزای کنید.
 
[[email protected] conf.d]# /etc/init.d/httpd restart

با اعمال این تغییر زمان بارگذاری سایت از 6.5 ثانیه به 1.8 ثانیه کاهش پیدا کرد.
نتیجه گیری
برای بهینه سازی Apache و افزایش سرعت پاسخگویی با توجه به اینکه VPS به صورت اختصاصی برای یک نرم افزار استفاده می‌شود، موارد زیر را انجام دادیم.
• تنظیم نحوه مدیریت درخواست ها توسط ماژول های MPM
• غیر فعال کردن تنظیمات کاربر و انتقال قوانین .htaccess به فایل‌های Apache
• فعال کردن KeepAlive
• فعال کردن فشرده سازی با استفاده از ماژول Deflate
این تغیرات با توجه به ثابت بودن همه متغیرهای دیگر سرور و نرم‌افزار نتیجه زیر را همراه داشت:
 

F:\C>curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total}
\ http://myworks/portal/index.php?r=user/login
0.062:0.203:0.203
0.062:0.218:0.218
0.062:0.218:0.218
0.062:0.218:0.218

زمان اتصال و انتقال صفحات کمی کاهش پیدا کرده است، اما زمان بارگذاری کل صفحه از 7.7 ثانیه به 1.8 ثانیه کاهش پیدا کرده است. بنابراین سرعت پاسخگویی 4.2 برابر شده است.

دیدگاه‌ها

تصویر حسام

حسام (تایید نشده)

اکبر عزیز،
از مطالب ارزنده ی شما، که در این وبلاگ پُست میکنید، بسیار استفاده کردیم.
به قول معروف ایشالّا همیشه بیشتر از قبل همینجوری کز بدیییییییی
دمت گرم
خوب مینیویسی، بازم بنویس

تصویر koorosh_kabir

koorosh_kabir (تایید نشده)

خیلی ممنون مطالب خوبی بودن و بسیار بهره بردم . با سپاس

افزودن نظر جدید