PDA

View Full Version : افت سرعت لود (آنلاین زیاد)



Travion
سه شنبه 14 آبان 1392, 20:48 عصر
با سلام و خسته نباشید خدمت دوستان و اساتید

عزیزان بنده یک اسکریپت بازی آنلاین طراحی کردم و مشکلی که دارم اینه که زمانی که تعداد آنلاین ها زیاد میشه (کلیک های پی در پی، سنگین شدن پروسه ها و ...) سرعت لود سایت پایین میاد
نمیدونم مشکلم مربوط به session ها هست یا اجرای کوئری ها و یا دیتابیس !
خیلی تحقیق کردم به جایی نرسیدم، چندتا مطلب خارجی راجع به افزایش سرعت لود خوندم و اجرایی شد خیلی هم تاثیر خوبی داشت
وقتی که 1 نفر آنلاین هست خیلی سرعت لود بالایی داره، اما آنلاین ها که بالای 100 نفر میشه سرعت لود افت شدیدی پیدا میکنه

ممنون میشم راهنمایی کنید
با تشکر

MRmoon
سه شنبه 14 آبان 1392, 21:05 عصر
سشن ها؟؟؟

بيشتر مربوط به ديتابيس ميشه و كد هايي كه نوشتين...

ميشه بفرمايين چه بازي آنلايني نوشتين .... يه لينكي چيزي ميزاشتين.:d

qartalonline
سه شنبه 14 آبان 1392, 21:16 عصر
بستگی به عوامل مختلف داره ولی اگه سرور درست و حسابی نداشته باشید این مسله طبیعیه.

Travion
سه شنبه 14 آبان 1392, 21:35 عصر
سشن ها؟؟؟

بيشتر مربوط به ديتابيس ميشه و كد هايي كه نوشتين...

ميشه بفرمايين چه بازي آنلايني نوشتين .... يه لينكي چيزي ميزاشتين.:d

آخه یه مقاله خوندم که نوشته بود سشن هم میتونه تاثیر منفی داشته باشه توی سرعت لود، اگه کاستوم سشن باشه و از طریق دیتابیس کنترل بشه بهتره
بازی تراوین هستش
www.travion.ir

FastCode
سه شنبه 14 آبان 1392, 21:39 عصر
سیستم عامل سرور چیه؟چطوری تنظیم شده؟دیتابیس چیه؟از چه نوع تیبلی استفاده میکنید؟
سشن ها رو در جدول معمولی نگهداری میکنید یا موقت؟
scheduler و nice ها چطوری تنظیم شدن؟فایل سیستم مورد استفادتون چیه؟
load ه سیستم چقدره؟چقدرش io ه؟چقدر sys؟

Travion
سه شنبه 14 آبان 1392, 21:39 عصر
بستگی به عوامل مختلف داره ولی اگه سرور درست و حسابی نداشته باشید این مسله طبیعیه.

از سرور نیست به دلایل زیاد از جمله اینکه سرور پردازنده و رم خوبی داره و زمانی هم که آنلاین کم هست سرعت لود خیلی خوبه
من یه مثال میزنم، یکی یه هاست معمولی میگیره که سرور اصلیش به اشتراک 20 نفر هستش و یک انجمن ساز مثلاً vbulletin نصب میکنه اما سیستم این اسکریپت انقدر رو اصول هست که حتی 1000 آنلاین هم پاسخگو هست روی یک هاست معمولی.
به کد نویسی مربوط میشه که بنده هم احتمال 80% رو میدم به اجرای کوئری ها، اما زمانی که تعداد آنلاین زیاد هستش اجرا شدن کوئری ها طبیعی هست و این ارتباط با دیتابیس (mysql_connect) هست که باعث کند شدن میشه (این نظر شخصی منه)

نمیدونم والا مغزم هنگ کرده دیگه چون 1 سال و نیم زمان گذاشتم واسه این اسکریپت :D

Travion
سه شنبه 14 آبان 1392, 21:46 عصر
سیستم عامل سرور چیه؟چطوری تنظیم شده؟دیتابیس چیه؟از چه نوع تیبلی استفاده میکنید؟
سشن ها رو در جدول معمولی نگهداری میکنید یا موقت؟
scheduler و nice ها چطوری تنظیم شدن؟فایل سیستم مورد استفادتون چیه؟
load ه سیستم چقدره؟چقدرش io ه؟چقدر sys؟

سیستم عامل: centos 6.4 64bit
منظورتون از تنظیم رو متوجه نشدم
دیتابیس: MySQL هست ( Engine=MyISAM )
سشن ها معمولی ذخیره میشن و بعد از خروج کاربر unset و destroy میشن
scheduler و nice ها هم نمیدونم چی هست :دی
تصویر Process Monitor از Directadmin هم ضمیمه شد
سرعت لود خروجی اسکریپت زمانی که خودم تست میکنم (1 آنلاین) 650ms تا 700ms هست

FastCode
سه شنبه 14 آبان 1392, 21:51 عصر
سیستم عامل: centos 6.4 64bit
منظورتون از تنظیم رو متوجه نشدم
دیتابیس: SQL هست ( Engine=MyISAM )
سشن ها معمولی ذخیره میشن و بعد از خروج کاربر unset و destroy میشن
scheduler و nice ها هم نمیدونم چی هست :دی
تصویر Process Monitor از Directadmin هم ضمیمه شد
سرعت لود خروجی اسکریپت زمانی که خودم تست میکنم (1 آنلاین) 650ms تا 700ms هست
برای اینکه مشکل پیدا بشه یک نمونه برای وقتی که سرور مشغول هست هم اضافه کنید.بعدش میشه تصمیم گیری کرد که bottleneck کجاست.
خروجی دستور mount رو هم بزارید.

Travion
سه شنبه 14 آبان 1392, 21:55 عصر
برای اینکه مشکل پیدا بشه یک نمونه برای وقتی که سرور مشغول هست هم اضافه کنید.بعدش میشه تصمیم گیری کرد که bottleneck کجاست.

الان تقریباً میشه گفت ساعت اوج مصرف هست این تصویر هم برای الان هستش، نیمه شب امشب که سرور خلوت شد دوباره یک تصویر میگیرم و ضمیمه میکنم.
این هم بگم که زمانی که سرعت لود پایین میاد با optimize کردن دیتابیس و ریستارت کردن آپاچی سرعت خوب میشه اما بعد از نیم ساعت که پروسه ها انجام میشه و ترافیک ایجاد میکنه سرعت میاد پایین

خروجی دستور mount:

/dev/mapper/VolGroup-lv_root on / type ext4 (rw,usrquota,grpquota)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,noexec,nosuid)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)

FastCode
سه شنبه 14 آبان 1392, 22:17 عصر
خروجی این سه تا رو هم بزارید.فعلا یک ایراد پیدا شد که میتونه یک مقدار سرعتتون رو اضافه کنه.ولی باید دقیقتر بببینم
du -sh /tmp
du -sh /var/log
du -sh /var/log/apache2

Travion
سه شنبه 14 آبان 1392, 22:25 عصر
خروجی این سه تا رو هم بزارید.فعلا یک ایراد پیدا شد که میتونه یک مقدار سرعتتون رو اضافه کنه.ولی باید دقیقتر بببینم
du -sh /tmp
du -sh /var/log
du -sh /var/log/apache2
هرچی هست هم مشکل از دیتابیس هست هم آپاچی، با ریستارت و آپتیمایز اینا سرعت خوب میشه...


[root@mail ~]# du -sh /tmp
8.3M /tmp
[root@mail ~]# du -sh /var/log
993M /var/log
[root@mail log]# du -sh /var/log/httpd
707M /var/log/httpd

FastCode
سه شنبه 14 آبان 1392, 22:30 عصر
در لاگهایی که دادید یه چیزی خیلی چشمگیره.زمان انتظار پروسه های php که بعضیهاشون نزدیک یک ساعت هستند.
اگر خروجی این سه تا دستور قبلی زیاد باشه ممکنه بشه کاری براش کرد.در غیر این طورت راه چاره شما چیزی جز پناه بردن به ZRAM و xfs و امثالهم نیست.

edit:
ظاهرا دیر پست دادم.
در apache2.conf
خطوط مربوط به log رو از access به warning تغییر بدید.
در fstab:
و fs پوشه های مربوط به log ه apache و tmp رو در صورت امکان به tmpfs تغییر بدید.نمونش رو توی fstab دارید.و بعد تنظیمات apache رو بدون restart کردن reload کنید.
edit2:
(این کار ممکنه برای بررسی ایرادات امنیتی پس از اتفاق اقتادن مشکلاتی رو ایجاد کنه و خیلی ها با این روش مخالفند.به جاش میتونید یک پازتیشن دیگه ایجاد کنید و از mode ه writeback استفاده کنید)
edit3:
بعد از تغییر دادن fstab از mount -a استفاده کنید.
قسمت اول پست هم ویرایش شد.

Travion
سه شنبه 14 آبان 1392, 22:33 عصر
در لاگهایی که دادید یه چیزی خیلی چشمگیره.زمان انتظار پروسه های php که بعضیهاشون نزدیک یک ساعت هستند.
اگر خروجی این سه تا دستور قبلی زیاد باشه ممکنه بشه کاری براش کرد.در غیر این طورت راه چاره شما چیزی جز پناه بردن به ZRAM و xfs و امثالهم نیست

من پروسه های اصلی و اجرایی بازی رو daemon کردم و از لینوکس اجرا میشه، اگه نیاز هست کدنویسی اونها رو براتون پ.خ کنم

FastCode
سه شنبه 14 آبان 1392, 22:35 عصر
من پروسه های اصلی و اجرایی بازی رو daemon کردم و از لینوکس اجرا میشه، اگه نیاز هست کدنویسی اونها رو براتون پ.خ کنم
خیر.نیازی نیست.فقط امیدوارم که برای انتظار پروسه ها از sleep استقاده کرده باشید.

Travion
سه شنبه 14 آبان 1392, 22:46 عصر
در لاگهایی که دادید یه چیزی خیلی چشمگیره.زمان انتظار پروسه های php که بعضیهاشون نزدیک یک ساعت هستند.
اگر خروجی این سه تا دستور قبلی زیاد باشه ممکنه بشه کاری براش کرد.در غیر این طورت راه چاره شما چیزی جز پناه بردن به ZRAM و xfs و امثالهم نیست.

edit:
ظاهرا دیر پست دادم.
در apache2.conf
خطوط مربوط به log رو از access به warning تغییر بدید.و پوشه های مربوط به log ه apache و tmp رو در صورت امکان به tmpfs تغییر بدید.نمونش رو توی fstab دارید.و بعد تنظیمات apache رو بدون restart کردن reload کنید.
edit2:
(این کار ممکنه برای بررسی ایرادات امنیتی پس از اتفاق اقتادن مشکلاتی رو ایجاد کنه و خیلی ها با این روش مخالفند.به جاش میتونید یک پازتیشن دیگه ایجاد کنید و از mode ه writeback استفاده کنید)
edit3:
بعد از تغییر دادن fstab از mount -a استفاده کنید.


خیر.نیازی نیست.فقط امیدوارم که برای انتظار پروسه ها از sleep استقاده کرده باشید.

منظور از apache2.conf همون httpd.conf هست؟ توی کانفیگ آپاچی چیزی راجع به log که access یا warning داشته باشه نیست
مسیر ذخیره ی log هارو به tmpfs تغییر بدم؟ locate انجام دادم هیچ پوشه ای به اسم tmpfs نبود
خط بالا رو ویرایش میکنم :دی تازه متوجه منظورتون شدم، یعنی این کد رو اضافه کنم به fstab?


tmpfs /var/log/httpd tmpfs defaults,nosuid,noexec,rw 0 0

در رابطه با daemon هم باید بگم که بله در هر حلقه 1 ثانیه sleep وجود داره

FastCode
سه شنبه 14 آبان 1392, 23:37 عصر
خط بالا رو ویرایش میکنم :دی تازه متوجه منظورتون شدم، یعنی این کد رو اضافه کنم به fstab?
بله.
یکی هم برای /tmp باید اضافه کنید.فقط برای /tmp یک زمان که میخواهید سرور رو restart کنید اضافه کنید.

plague
چهارشنبه 15 آبان 1392, 00:39 صبح
یه پروفایلر مثل xdebug نصب کن ریز کوئری ها رو در بیار ببین چه خبره
همچنین توی my.cnf میتونی slow query log رو فعال کنید یه چیزی هم هست به اسم mytop که همون top هستش ولی برای دیبتابیس میتونی به صورت زنده پروسس های دیتبسا رو تحت نظر بگیری باهاش

در کل وقتی که کند میشه باید ریز پروسس ها و کوئری های یکی از این صفحات کند رو در بیاری ببینی چی به چیه

Travion
چهارشنبه 15 آبان 1392, 00:59 صبح
یه پروفایلر مثل xdebug نصب کن ریز کوئری ها رو در بیار ببین چه خبره
همچنین توی my.cnf میتونی slow query log رو فعال کنید یه چیزی هم هست به اسم mytop که همون top هستش ولی برای دیبتابیس میتونی به صورت زنده پروسس های دیتبسا رو تحت نظر بگیری باهاش

در کل وقتی که کند میشه باید ریز پروسس ها و کوئری های یکی از این صفحات کند رو در بیاری ببینی چی به چیه

اتفاقاً slow query log گذاشتم توی my.cnf ولی کار نمیکرد و باعث down شدن mysqld شده بود.
ولی یه جا خوندم که نوشته بود این امکان برای ورژن 4 به قبل هست

plague
چهارشنبه 15 آبان 1392, 22:18 عصر
نه فکر نمیکنم ماله 4 به قبل باشه
ولی دستورش ظاهرا یه تغییراتی کرده که شاید دستور قدیمی استفاده کردی

اینو اضافه کن به my.cnf



slow-query-log = 1
slow-query-log-file = /var/log/mysql/log-slow-queries.log
long_query_time =1

بعد ریست کن mysql رو

البته باید این فایل لو گ در این آدرس رو هم بوجود بیاری و بهش پرمیشن بدی


/var/log/mysql/log-slow-queries.log

Travion
پنج شنبه 16 آبان 1392, 21:18 عصر
با تشکر از کمک همه ی دوستان
مشکل اصلی از پارتیشن بندی دیتابیس بود که انجام نشده بود
هرکی این مشکل رو داره با سیستمش و برنامه نویس هست این مقاله رو پیشنهاد میکنم بخونه پارتیشن بندی اطلاعات در پایگاه داده (http://zebardast.ir/tag/mysql/)
به من خیلی خیلی کمک کرد
البته اینم بگم یه mysqltunner هم نصب کردم خیلی بهتر شد، الان هم دارم روی پارتیشن بندی دیتابیس کار میکنم که انشاالله مشکل به کلی بر طرف بشه

سپاس

plague
جمعه 17 آبان 1392, 18:32 عصر
سلام چند تا سوال :

1 - شما هنوز پارتیشن بندی نکردی از کجا متوجه شدین که مشکل از اونه ؟
2 - مگه حجم تیبل/تیبل های شما چقدره که نیاز به پارتیشن بندی دارید ؟
3 - mysqltunner همون اسکریپت پرل رو میگید ؟ اون فکر میکنم فقط یه سری اطلاعات آماری و توصیه به آدم میده و خودش چیزی رو دستکاری نمیکنه که بهتر یا بدتر بشه

Travion
شنبه 18 آبان 1392, 00:22 صبح
سلام چند تا سوال :

1 - شما هنوز پارتیشن بندی نکردی از کجا متوجه شدین که مشکل از اونه ؟
2 - مگه حجم تیبل/تیبل های شما چقدره که نیاز به پارتیشن بندی دارید ؟
3 - mysqltunner همون اسکریپت پرل رو میگید ؟ اون فکر میکنم فقط یه سری اطلاعات آماری و توصیه به آدم میده و خودش چیزی رو دستکاری نمیکنه که بهتر یا بدتر بشه
سلام

1- خیلی تحقیق کردم و از چند نفر کمک خواستم، و قانع شدم که مشکل از دیتابیس (کلیدها و پارتیشن بندی نبودن) هست. چون یه بازی آنلاین در هر ثانیه کل دیتابیس رو باید آپدیت کنه، دیتا بگیره و دیتا وارد کنه.
از آنالیزر خود phpMyAdmin هم استفاده کردم و مقدار قابل توجهی از درصد و حجم استفاده برای SELECT و UPDATE کردن بود، چون دیتابیس فعلی بنده بدون هیچ KEY و INDEX ساخته شده و مشخصاً کاملاً اشتباه هست.
2- به حجم تیبل ها نیست، چه 1گیگ حجم تیبل باشه چه 10 مگابایت وقتی یه فرایند SELECT رو انجام میدین دیتابیس میاد کل اون سطرهای مربوط به اون تیبل رو بررسی میکنه و چیزی که میخوایم رو خروجی میده
توی اون لینکی که در پست قبل گذاشتم کامل و واضح این قضیه رو توضیح داده، واقعاً استفاده کردم.
3 - بله همون منظورم هست که آنالیز کرد و کارهایی که گفت انجام داده شد، apache هم آپدیت و کانفیگ شد خیلی بهتر شد الان. یعنی تنها مشکل موجود باقیمانده دیتابیس هست که با optimize کردن مشکل سرعت واسه زمان کوتاهی برطرف میشه، پس قطعاً فقط همین بحث keyها و indexها باقی میمونه، البته در مرحله آخر میرم سراغ پارتیشن بندی، اگه این مراحل جواب نداد
حتماً نتیجه رو در همین تاپیک اعلام میکنم که دوستانی که مشکلات مشابه دارن راحت تر به جواب برسن.

Travion
یک شنبه 19 آبان 1392, 23:58 عصر
دوستان مشکل بنده برطرف شد، هرکی که همین مشکل رو داره نکات زیر رو حتماً رعایت کنه:
1- کانفیگ درست و حرفه ای آپاچی و MySQL
2- طراحی دیتابیس و تیبل های اصولی و تعریف INDEX برای کارایی و بازدهی بیشتر
3- اگر پروسه ای انجام میشه توی دیتابیس و تیبل شما از نوع InnoDB نیست حتماً حتماً کوئری زیر رو بعد از هر پروسه در دیتابیس اجرا کنید تا Overhead یا بخش سرریز حجم کوئری در دیتابیس OPTIMIZE بشه (در غیر اینصورت شاهد افت سرعت لود شدیدی خواهید شد البته اگر پروسه های سنگینی دارید مثل یک بازی آنلاین):


ANALYZE TABLE table_name
OPTIMIZE TABLE table_name
ALTER TABLE table_name

4- سعی کنید توی برنامه نویسی اسکریپت و سایتتون زمانی که میخوایید از یک تیبل کوئری دریافت کنید فقط و فقط فیلدهای مورد استفاده رو انتخاب کنید و اگر کوئری شما فقط 1 سطر خروجی خواهد داشت حتماً از LIMIT استفاده کنید، مثال:

SELECT x, y FROM table_name WHERE id = 111 LIMIT 1
5- در صفحات استاتیک سایت خود حتماً از سیستم کش apc استفاده کنید تا هم سرعت لودتون برای کاربراتون بالا بره و هم پهنای باند کمتری بسوزونید.
اگه نکات بالا رعایت بشه مطمئن باشید بازدهی بسیار خوبی خواهید داشت
این هم بگم که رم سرور درصد زیادی از اهمیت سرعت لود سرور رو تشکیل میده
در آخر این مقاله (http://zebardast.ir/tag/mysql/) هم حتما بخونید
با تشکر از همه دوستان