newrelic

آبگرید سرور یا بهینه سازی؟

آبگرید سرور یا بهینه سازی؟ مسئله این است!

من نزدیک یک ماهه که با سرور  Centos رم 2 گیگ با مشکل لود بالا و قطع دسترسی به سرویس ها دست و پنج نرم میکردم ولی تو این مدت چه کارایی انجام دادم میخوام به بازدید کنندگان شرح بدیم که چه مواردی میتونه کیفیت سرویس دهی شما را به این اندازه تغییر بده!

cpu

نموارد بالا مربوط به آمار استفاده از CPU من هست که اکثرا توسط سرویس mysql مشغول می شد.

تو این برش ها چه کار انجام دادم؟ آیا باید Upgrade میکردم؟ کی باید Upgrade کنیم؟

اولین Alarm که گرفتم مربوط به Pingdom بود دیدم کیفیت سرور هر روز داره بدتر میشه لازم به ذکره که کارای روتین سرور مثل Optimize  و آرشیو را انجام می دادم که خودش به نوبه خودش تاثیر داره ولی مشکل سرور ما نه Archive بود نه Optimize

تنظمات mysql را با ابزار Mysqltuner انجام دادم. نتیجه داد؟ نه

متاسفانه بعضیا نه تنها ایران بلکه همه دنیا فکر میکنند با افزایش مثلا بافر یا کش کوئری ها مشکل حل میشه ولی چاره کار این نیست.

حالت log-slow-queries که همیشه فعال داشتم شروع به آنالیز این لاگ ها کردم کورئی های رو با استفاده از دستور explain و آرشیو لاگ ها اصلاح کردم.

index های اضافه و ساختار بعضی جداول را تغییر دادم.

سیستم کش Apc را کانفیگ کردم و روی سرور اجرا کردم نتیجه خوب بود و تا صددرصد تونست کش PHP منو هندل کنه.

cache

آیا این تغیرات جواب داد؟ بله بریک اول تو چارت اول مربوط به این کارها بود.

یک اشتباهی که در این بازه انجام دادم حذف بعضی رکورد ها از آرشیو برای سبک کردن دیتابیس بود البته این کار دیر و زود باید انجام می شد ولی نه آنروز.

بعد از انجام این موارد ترافیک سایت به بالای یک میلیون بازدید در روز رسید دوباره مشکلات شروع شد این بار داون نداشتیم ولی لود سرویس تا 15 افزایش پیدا میکرد.

به قول یک مدیر سرور خارجی:

لود تا عدد 1 یعنی عالی 1 تا 3 خوب 3 تا 5 قابل تحمل 5 به بالا یعنی وضعیت بحرانی.

وقتی لود بالای عدد پنج باشه یعنی آژیر ها زده شده و باید دنبال مشکل باشید.

تو این مدت دوباره شروع کردم به تغییر کانفیگ mysql برای تغییر کانفیگ باید بعد از اعمال تغییر 24 ساعت منتظر بمونید تا نتیجه مشخص بشه. در مقاطعی این تغییرات درست بود ولی دیگه بعد از جایی جواب نمیده و به مدیر سرور به این فکر میافته که باید سرور upgrade بشه.

تو این مقطع دوباره به فکر تغییر ساختار دیتابیس ها افتادم چون سیستم فعلی ما bigData هست یعنی خواهد شد.

تحقیق کردم خارجی ها وقتی به سیستمی Bigdata میگن که میلیارد رکورد را رد کرده باشه ولی رکورد ها من در حد میلیون هستند.

تغییراتی برای ایندکس ها و کلاسترینگ انجام دادم ولی موثر نبود چون سیستم هر روز در حال پیشرفته ولی نمیشه با این روند ادامه داد.

متوجه شدم که بعضی بخش ها اسکریپت بیش از اندازه زمان اجرا طول میکشه و تنظمات Apache امکان این که که سرور به تله بیافته یا راحت DDOS بشه وجود دارد. زمان اجرای اسکریپت را کاهش دادم چون لازمم نبود کارهای Server Side در این سرور انجام نمیشد و نهایت کار این سرور اجرای دستور Curl بود.

بعد از این تغییرات دوباره وضعیت درست نشد. مشکل اصلی لود رکورد های بالا بود یعنی در هر بار درخواست بالای میلیون رکورد لود میشد و دیگه به اخر ایندکس رسیده بودم و امکان بهینه سازی بیشتر نبود.

در مورد Storage engine های mysql تحقیق کردم با Tokudb آشنا شدم که مخصوص BigData هست ولی استفاده نکردم چون سرویس ما حتی نمیتونه برای دقایقی OFF بشه برخلاف خیلی از مدیران سرور ایرانی که هر مشکلی پیش میاد زود سرور رو ریستارت میکنند اصلا اهل ریستارت نیستم.

بعد از بررسی Storage Engine رفتم سراغ Driver دیتابیس دنبال این سوال بودم کهmysqli یا PDO که دیدم اسکریپت ما Mysql استفاده میکنه این یعنی فاجعه! یکی زدم به سرور توسعه دهندش(که خودم باشم) PDO قبلا استفاده میکردم ولی چون از فریم ورد Codeigniter استفاده کرده بودم تنظمات دیتابیس هم زیاد ویرایش نمیشه و ندیدم.

mysqli را در دیتابیس ست کردم چون امکانات خاص PDO را لازم نداشتم.

با ویرایش این مورد، تغییر محسوسی احساس کردم ولی مشکل بازم حل نشد.

قبلا گفته بودم که مشکل من لود بالای رکورد بود یعنی بالای میلیون، به نوعی باید تعداد Read از دیتابیس را کم میکردم راه حل چی شد؟ بله memocache

 memocache را فعال کردم و برای Codeigniter فعال کردم. با کمال تعجب دیدم نتیجه داد. لود سرور به زیر عدد 1 رسید، درصد رضایت از سرور بالای عدد 99% رسید این یعنی عالی.

newrelic

امیدوارم به جواب سوالهاتون رسیده باشید.

سوالی داشتین در بخش نظرات مطرح کنید.

دیدگاه شما

( الزامي )

(الزامي)