PDA

View Full Version : سوال: بالا بودن مصرف ram روی هاست



mohammadyaser
یک شنبه 19 آذر 1391, 11:19 صبح
با سلام
من اطلاعات کاربران سایتم رو در سشن نگهداری میکنم.وقتی سایت رو اپلود کردم هر چند دقیقه یک بار این سشن ها پاک می شد.با مدیر هاست که تماس گرفتم گفت ما بررسی کردیم میزان مصرف ram سایتت بالا است به همین این هی سرور ریست میشه.
میخواستم بدونم چه نکاتی رو باید در کدنویسی رعایت کرد که میزان استفاده پایین بیاد.
البته من از کامپوننت گزارشگیری stimul report نسخه رایگانش هم استفاده میکنم.
با تشکر

mehrbani
یک شنبه 19 آذر 1391, 12:03 عصر
گویا هاست شما میزان رم خیلی کمی رو برای Application Pool شما در نظر گرفته.
شما می تونین نحوه نگه داری Session ها رو از رم به SQL یا SessionState Server تغییر بدین.
پیشنهاد می کنم از ASP.NET Membership استفاده کنین چون Authentication Ticket ها رو به صورت امن بر روی Cookie نگه داری می کنه

mohammadyaser
یک شنبه 19 آذر 1391, 12:15 عصر
گویا هاست شما میزان رم خیلی کمی رو برای Application Pool شما در نظر گرفته.
شما می تونین نحوه نگه داری Session ها رو از رم به SQL یا SessionState Server تغییر بدین.
پیشنهاد می کنم از ASP.NET Membership استفاده کنین چون Authentication Ticket ها رو به صورت امن بر روی Cookie نگه داری می کنه
ممنون از راهنمایی شما
اگر امکان داره مقداری در مورد هر کدام توضیح بفرمایید

mehrbani
دوشنبه 20 آذر 1391, 02:11 صبح
Session State به جای نگه داری اطلاعات Session ها اونها رو بر روی file نگه داری میکنه.اگر از هاست اشتراکی استفاده می کنین باید ببینین هاستنگتون ارائه می ده این امکان رو یا نه

Cybersilent
دوشنبه 20 آذر 1391, 12:23 عصر
شاید باید در نحوه استفاده از Session برای نگهداری اطلاعات تجدید نظر بکنید.
ببینید در حالت پیش فرض وقتی یک فیلد رو در سشن نگهداری می کنید دارید سرور رو ملزم به نگهداری اون در رم می کنید و در صورتی که اطلاعات زیاد بشوند اونوقت چاره ای جز ریست کردن نداره.
شما فقط باید شناسه دسترسی کاربر رو در سشن ذخیره کنید و برای اینکار باید یک کلاس مثل SessionManager رو ایجاد کنید

public class SessionManager
{
Page bridge = new Page();
public string LogedinId
{
get
{
if (bridge.Session["LogedinId"] != null)
{
return bridge.Session["LogedinId"].ToString();
}
else
{
return "";
}
}
set
{
bridge.Session["LogedinId"] = value;
}
}
}

سپس شناسه ورود رو به عنوان Property اون تعریف کنید .(مثل بالا)
موقع لاگین یک وهله سازی از شی SessionManager انجام بدید و مقدار فیلد رو به اون بدید.
اینطوری اطلاعات به صورت کلاس در میان و سیستم عامل میتونه اطلاعات سشن رو در صورت پر شدن رم در هارد ذخیره کنه و در نتیجه اطلاعات قابل نگهداری خیلی بیشتر می شوند و مشکلی پیش نمیاد.
امیدوارم متوجه شده باشید.

mehrbani
دوشنبه 20 آذر 1391, 12:55 عصر
شاید باید در نحوه استفاده از Session برای نگهداری اطلاعات تجدید نظر بکنید.
ببینید در حالت پیش فرض وقتی یک فیلد رو در سشن نگهداری می کنید دارید سرور رو ملزم به نگهداری اون در رم می کنید و در صورتی که اطلاعات زیاد بشوند اونوقت چاره ای جز ریست کردن نداره.
شما فقط باید شناسه دسترسی کاربر رو در سشن ذخیره کنید و برای اینکار باید یک کلاس مثل SessionManager رو ایجاد کنید

public class SessionManager
{
Page bridge = new Page();
public string LogedinId
{
get
{
if (bridge.Session["LogedinId"] != null)
{
return bridge.Session["LogedinId"].ToString();
}
else
{
return "";
}
}
set
{
bridge.Session["LogedinId"] = value;
}
}
}

سپس شناسه ورود رو به عنوان Property اون تعریف کنید .(مثل بالا)
موقع لاگین یک وهله سازی از شی SessionManager انجام بدید و مقدار فیلد رو به اون بدید.
اینطوری اطلاعات به صورت کلاس در میان و سیستم عامل میتونه اطلاعات سشن رو در صورت پر شدن رم در هارد ذخیره کنه و در نتیجه اطلاعات قابل نگهداری خیلی بیشتر می شوند و مشکلی پیش نمیاد.
امیدوارم متوجه شده باشید.

دوست عزیز ، فرقی نمی کنه که Session تو کلاس نوشته بشه یا نه برای تغییر نحوه نگهداری Session باید تغییراتی در قسمت SessionState فایل Web.config بدین

mehrbani
دوشنبه 20 آذر 1391, 12:56 عصر
به جای ایجاد Page Bridge بهتره از System.Web.HttpContext.Current.Session استفاده کنین

Cybersilent
دوشنبه 20 آذر 1391, 13:20 عصر
به جای ایجاد Page Bridge بهتره از System.Web.HttpContext.Current.Session استفاده کنین
چرا بهتره؟
چه تغیری باید در Config بدم؟

mehrbani
دوشنبه 20 آذر 1391, 14:13 عصر
چون از ساختن اضافی کلاس bridge خلاص میشین.

<sessionState mode="SQLServer" cookieless="true " regenerateExpiredSessionId="true " timeout="30" sqlConnectionString="Data Source=MySqlServer;Integrated Security=SSPI;" stateNetworkTimeout="30"/>

به عنوان مثال کد بالا Session هارو در SQL Server نگهداری میکنه