PDA

View Full Version : پر شدن سریع پروسس و حافظه مجازی هاست



mohammad-gh
یک شنبه 05 خرداد 1392, 21:03 عصر
با سلام
در حال تست برنامه گفتگوی آنلاینی هستم که خودم نوشتم
متاسفانه این برنامه به محض اجرا Virtual Memory Usage رو و بعضا تعداد پروسس های مجاز هاست رو (حداکثر 25 عدد است)پر میکنه و باعث میشه هاست ارور 500 رو بده

برنامه را با دیتابیس نوشتم و
نمی دونم مشکل کار از کجاست, چطوری می تونم بهینه اش کنم
هاست سی پنل است

امیـرحسین
دوشنبه 06 خرداد 1392, 09:38 صبح
میتونید تعداد ریکوئست‌ها رو کم کنید. مثلا اگر هر ۵ ثانیه چک میکنید برای پیغام جدید، میتونید از ۱۵ ثانیه چک کنید اینجوری ترافیک یک سوم میشه
یا منابع دیگه رو کنترل کنید که بهینه باشن.
ولی در کل چت AJAX وضعیتش همینه. چون تعداد ریکوئست‌هاش بالاست.
با هاستینگ مشورت کنید ببینید چه راهی پیشنهاد میکنن شاید بتونید چت با Node.JS درست کنید...

ravand
دوشنبه 06 خرداد 1392, 09:54 صبح
من تا حالا با node.js اتاق چت نساختم و با کامت و سوکت بیشتر کار کردم. میخواستم بدونم node.js در ساخت اتاق چت چطوری عمل میکنه؟ مثل اون روشی که دوستمون گفتن نیست که مدام برای بررسی وجود متن در دیتابیس پیام بفرسته؟ یکی بهم میگفت node.js نیازی به درخواست برای سرور نداره. و سرور خودش پیام می فرسته . درسته؟ روشش چطوریه؟
متشکرم.

mohammad-gh
دوشنبه 06 خرداد 1392, 14:10 عصر
من از روش comet برای این کا راستفاده می کنم
البته تبدیل 5 ثانیه به 15 ثانیه هم خوب بود اما راه حل باید اساسی تر باشد
من روش node رو هم قبل از شروع به برنامه نویسی با کامت بررسی کردم که باید بگم فوق العاده دردسر داره, از جمله اینکه هاست باید مجهز به نرم افزارهای خاصی باشد و...

من تکه خود رو که در اون پیغام جدید رو بررسی می کنه گداشتم لطفا نطراتتون رو بفرمایید


<?php
include '../db_connect.php';
include 'anticache8charset.php';
set_time_limit(1);
ignore_user_abort(false);
//set_time_limit(0);
$me=$_GET['me'];
$he=$_GET['he'];


$query = "SELECT * FROM mes where user1='$he' and user2='$me' limit 1";
$result = mysql_query($query) or die('بروزخطا دربازيابي اطلاعات جدول ');
$numrow_se=mysql_num_rows($result);

clearstatcache();
while($numrow_se==0) {
$result = mysql_query($query) or die('بروزخطا دربازيابي اطلاعات جدول ');
$numrow_se=mysql_num_rows($result);
usleep(500000);
clearstatcache();
}


$row=mysql_fetch_assoc($result);
$txtchat=$row['comet'];
$id=$row['id'];

mysql_query("delete from mes where id='$id' ")or die(mysql_error());

header('Content-length: '.strlen($txtchat));

echo '_-_', $txtchat;

mysql_close($link);
?>

امیـرحسین
دوشنبه 06 خرداد 1392, 15:12 عصر
من تا حالا با node.js اتاق چت نساختم و با کامت و سوکت بیشتر کار کردم. میخواستم بدونم node.js در ساخت اتاق چت چطوری عمل میکنه؟ مثل اون روشی که دوستمون گفتن نیست که مدام برای بررسی وجود متن در دیتابیس پیام بفرسته؟ یکی بهم میگفت node.js نیازی به درخواست برای سرور نداره. و سرور خودش پیام می فرسته . درسته؟ روشش چطوریه؟
متشکرم.
Node.js مثل سوکته. یه کانکشن بین کلاینت و سرور باز میشه و میتونن با هم در ارتباط باشن. یه محدودیتی هم داره اینکه چون به ازای هر کلاینت یه کانکشن داریم وقتی تعداد کلاینت زیاد شه تعداد کانکشنها زیاد میشه و یجور دیگه به سرور فشار میاره. توییتر این مدلی کار میکنه.
سرچ کنید. چت نمونه‌ی معروف کاربرد Node.js هست که میشه تو لوکال راهش انداخت.


من از روش comet برای این کا راستفاده می کنم
البته تبدیل 5 ثانیه به 15 ثانیه هم خوب بود اما راه حل باید اساسی تر باشد
من روش node رو هم قبل از شروع به برنامه نویسی با کامت بررسی کردم که باید بگم فوق العاده دردسر داره, از جمله اینکه هاست باید مجهز به نرم افزارهای خاصی باشد و...

من تکه خود رو که در اون پیغام جدید رو بررسی می کنه گداشتم لطفا نطراتتون رو بفرمایید


<?php
include '../db_connect.php';
include 'anticache8charset.php';
set_time_limit(1);
ignore_user_abort(false);
//set_time_limit(0);
$me=$_GET['me'];
$he=$_GET['he'];


$query = "SELECT * FROM mes where user1='$he' and user2='$me' limit 1";
$result = mysql_query($query) or die('بروزخطا دربازيابي اطلاعات جدول ');
$numrow_se=mysql_num_rows($result);

clearstatcache();
while($numrow_se==0) {
$result = mysql_query($query) or die('بروزخطا دربازيابي اطلاعات جدول ');
$numrow_se=mysql_num_rows($result);
usleep(500000);
clearstatcache();
}


$row=mysql_fetch_assoc($result);
$txtchat=$row['comet'];
$id=$row['id'];

mysql_query("delete from mes where id='$id' ")or die(mysql_error());

header('Content-length: '.strlen($txtchat));

echo '_-_', $txtchat;

mysql_close($link);
?>

من تا حالا اینجوری کار نکردم ولی شاید این مدلی درگیر کردن سرور چندان جالب نباشه.
مدل درخواست تکی رو هم امتحان کنید. اینکه مثلا هر ۵ ثانیه یه درخواست تکراری میره و فقط یه دونه رو چک میکنه... (بدون sleep اینا).
و نکته دوم هم اینکه همین کد شما چند تا نکته داره:
اگر به همین روش اصرار دارید، بهبنه‌ش کنید.مثلا
برای اجرای یه کوئری به تعداد زیاد Prepared Statement سرعت بالاتری داره.
میتونید با کمی تغییر از Multiple Qurey استفاده کنید (اجرای چند دستور SQL با یک کوئری).
شاید Stored Procedure نتیجه‌ی بهتری بده.
راه رسیدن به این اسکریپت رو کوتاه کنید یعنی قبل و بعد از این اسکریپت کمترین پردازش اضافی اتفاق افتاده باشه...
و اینکه SQL Injection رو هم چک نکردید.

من حدس میزنم اگر کد رو در همین حد بهینه کنید با درخواست تک تک هم بهینه میشه ولی در کل سرور وقتی مثلا توانایی چت در حال توسعه رو نداره بهینه هم بکنید نمیتونه مثلا چت همزمان ۲۰ ۳۰ نفر رو تحمل کنه.

mohammad-gh
دوشنبه 06 خرداد 1392, 23:46 عصر
سلام و ممنون
وقتی کامت رو مطالعه کردم اصول کارش این بود که کارها رو سریعتر انجام داده و نتایج رو سریعتر بیاره
اصلا به نظر شما کامت من درسته
من در اساسش شک کردم
مگر نه اینکه یک درخواست منتظر پاسخ از سرور می مونه تا هر موقع خبری شد ....

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

mohammad-gh
سه شنبه 07 خرداد 1392, 23:50 عصر
اگر به همین روش اصرار دارید، بهبنه‌ش کنید.مثلا
برای اجرای یه کوئری به تعداد زیاد Prepared Statement سرعت بالاتری داره.
میتونید با کمی تغییر از Multiple Qurey استفاده کنید (اجرای چند دستور SQL با یک کوئری).
شاید Stored Procedure نتیجه‌ی بهتری بده.
راه رسیدن به این اسکریپت رو کوتاه کنید یعنی قبل و بعد از این اسکریپت کمترین پردازش اضافی اتفاق افتاده باشه...
و اینکه SQL Injection رو هم چک نکردی

خود کامت نباید اینقدر سنگین باشه که نیاز به بهینه کردن در این حد باشه ! اگر درست نبود شما بگید
منظورتون را از یه دونه چک کردم هم نفهمیدم

shahriyar3
چهارشنبه 08 خرداد 1392, 00:02 صبح
متن چت ها رو داخل یک div بریز. یوزر آیدی کاربر ها رو توی سشن بریز نیتجه کوئری رو توی اون div چاپ کن بعد با تابع setInterval مقدار داخل div و هر چند ثانیه یک بار ریفرش کن
یعنی به جای اینکه کل پروسه رو برای هر بار درخواست اجرا کنی فقط نتایج کوئری رو به ازای هر بار درخواست تجدید چاپ میکنی.
از ajax هم استفاده نکن

mohammad-gh
چهارشنبه 08 خرداد 1392, 06:19 صبح
یوزر آیدی کاربر ها رو توی سشن بریز

اینها رو همینظور میارم یعنی با استفاده از سشن

میشه یه کم بیشتر توضیح بدی و اینکه با این روش به چه صورتی بار سیستم کم میشه, یعنی خودتون تست کردین

shahriyar3
چهارشنبه 08 خرداد 1392, 11:12 صبح
اینها رو همینظور میارم یعنی با استفاده از سشن

میشه یه کم بیشتر توضیح بدی و اینکه با این روش به چه صورتی بار سیستم کم میشه, یعنی خودتون تست کردین
من یکبار برای یکی از مشتری ها سیستم چت با یوزر های آنلاین سایت و نوشتم از همین روشی که توضیح دادم استفاده کردم مشکلی نداشتم روی هاست اشتراکی . البته ساختار کدی که من نوشته بودم با این کد شما یکمی متفاوت بود.

mohammad-gh
چهارشنبه 08 خرداد 1392, 20:15 عصر
یه نمونه کد بزارید متوجه میشم که بدرد من می خوره یا نه
شاید برای سایت معمولی جواب بده ولی من برای جامعه مجازی می خوام
در ضمن من هاست اختصاصی دارم اما خودم روی هاست اشتراکی امتحان می کنم تا تست کامل بشه
حتما سیستمی که نوشتید یکی اسمی داره

mohammad-gh
پنج شنبه 09 خرداد 1392, 23:57 عصر
دوستانی که اینهمه سیستم کامت رو پیشنهاد کرده بودند یه نظری بدن
توی یکی از انجمنها مدیر این بخش هم سیستم کامت رو پیشنهاد کرده بود
ولی یا من درست اجراش نکردم یا کسانی که پیشنهاد داده بودند تستش نکرده بودند