PDA

View Full Version : آزاد نشدن حافظه تخصیص داده شده در SQL Server



m-khorsandi
دوشنبه 19 اردیبهشت 1384, 15:33 عصر
من یه Database دارم با حجم 40 Gig با 60-70 تا کاربر، مشکلم این هست که تازگی حافظه ایی که تخصیص داده میشه برای هر کاربر موقعیکه به Server وصل میشه آزاد نمیشه. و بعد از 3-4 ساعت کار حتما باید Server رو Restart کنن.

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

به کمک و راهنمائی دوستان واقعا نیاز دارم.

AminSobati
دوشنبه 19 اردیبهشت 1384, 23:06 عصر
دوست عزیزم،
Restart کردن سرور فقط باعث زیاد شدن زحمت SQL Server میشه! این تفکر که اشغال شدن حافظه باعث بروز اشکال برای سرور ممکنه بشه، یک اشتباه رایجه.
SQL Server به طور کامل از Memory Management برخورداره و زمانی که ویندوز نیاز به حافظه داشته باشه، بلافاصله SQL Server در اختیارش قرار میده. البته به این معنی نیست که SQL Server در مدیریت حافظه، جای ویندوز رو میگیره! بلکه کاملا با هم همکاری دارند.
موضوع از این قراره که با هر Query، نتایج رو SQL Server در حافظه Cache میکنه چون قطعا کاربران دیگه ای هم دیر یا زود به همون نتایج نیاز پیدا میکنن. پس با صرف کمترین زمان، بدون نیاز به رجوع کردن به دیسک، اطلاعات از Cache تقدیم به کلاینت میشه! این روند به همین منوال ادامه پیدا میکنه و مرتبا اطلاعات Cache میشن تا جاییکه قسمت عمده حافظه توسط SQL Server اشغال میشه. ولی به محض در خواست برای حافظه، قسمتی از Cache خالی میشه و در اختیار ویندوز قرار میگیره.
اگر اکثر حافظه شما پر شده، میشه گفت که این سرور تقریبا به طور انحصاری به SQL Server تعلق گرفته و برنامه خاصی نیست که نیاز به حافظه زیادی داشته باشه، لذا SQL Server اطلاعاتش رو با خیال راحت در حافظه مستقر کرده.
Restart کردن سرور باعث میشه Cache از دست بره و مدتی باید کاربرها با سرور کار کنن تا دوباره اطلاعات در Cache پر بشه.
اگر واقعا سرور کند شده، بهترین ابزار شما Performance Monitor هستش که نشون میده کدومیک از سه عامل Disk, Memory, CPU تحت فشار هستند.
موفق باشید

small_programmer
سه شنبه 20 اردیبهشت 1384, 21:15 عصر
من هم تجربه کار عملی با بانکهای بزرگ را داشته ام (البته حدود 3-4 گیگ نه 40G) که براتون می نویسم
sql دو نوع مدیریت حافظه دارد یکی داینامیک و دیگری ثابت که می توان برای هرکدام مقدار حداکثر تعیین کرد به نظر من استفاده از داینامیک بهتر است(برای تنظیم حافظه در EM به پنجره SQL Server Properties مراجعه کنید و در آن به برگه memory بروید)
من از این روش استفاده می کردم که حافظه مربوط به sql sever را کمی کمتر از حداکثر آن قرار می دادم مثلا اگر 1G رم داشتم حدود 700 مگ آنرا به sql اختصاص می دادم.(به صورت پیش فرض sql مقدار 1G را در نظر می گیرد)
با این کار مطمئن بودم مقداری حافظه خالی داشتم که باعث می شد که هم خودم پشت سرور راحت کار کنم(و همچنین DBA) و هم اگر برنامه ای در حال اجرا است (مانند IIS) سریع بتواند از سیستم حافظه بگیرد و منتظر خالی شدن حافظه توسط sql نباشد.این مقدار کم کردن حافظه تقریبا روی sql تاثیر منفی نمی گذاشت.
البته این 1G را برای مثال عرض کردم وگرنه همانطور که دوست بزرگوارمان آقای ثباتی گفتند sql از رم به بهترین نحو استفاده می کند. و پیشنهاد می شود که هرچه بیشتر بهتر. (به نظر من حداقل 4-5 گیگ برو بالا تا 10-15)
لطفا سیستم عامل و مشخصات سخت افزاریتان را بنویسید
مثلا win 2003 به طور عادی 32 گیگ و حداکثر تا 64 گیگ حافظه را ساپورت می کند.

اگر دیگران هم اطلاعات بیشتری دارند استفاده می کنیم.
:موفق:

m-khorsandi
سه شنبه 20 اردیبهشت 1384, 21:28 عصر
با تشکر از آقای ثباتی و مصطفی عزیز.

سیستم عامل Server مورد نظر Windows 2003 با 4 گیگ Ram هست، البته این رو بگم که این مشتری گرامی حجم اطلاعات بالایی داره و روز به روز هم بیشتر میشه.

یه سئوال از آقای ثباتی دارم که Performance Monitor همونی که تو Task Manager هست منظورتونه :oops:
و در مورد اینکه آقای ثباتی فرمودند "اگه واقعا سرور کند شده "، دقیقا همینطور هست، شما فکر کنید 60-70 تا کاربر
از طریق Application کار میکنند و تعدادی دیگه هم از طریق Web.

نظر دوستان رو در مورد برنامه تحت Web میتونم بپرسم که اون چه تاثیری میتونه داشته باشه.
باز هم از دوستانی که لطف میکنند تا مشکل من حل بشه متشکرم.

AminSobati
سه شنبه 20 اردیبهشت 1384, 23:46 عصر
اگر سرور شما نرم افزار دیگه ای غیر از SQL Server داره که به حافظه قابل توجهی نیاز داره، خوبه که به توصیه دوستمون عمل کنین و حداکثر حافظه SQL Server رو مثلا به 60 یا 70 درصد(هر قدر که لازمه) محدود کنین.
اگر چه گفته شد مدیریت حافظه باعث میشه مشکلی پیش نیاد، اما همین مسئله که SQL Server مرتب مجبور میشه حافظه رو Page کنه (بیاره روی دیسک) و مقداری از اون رو آزاد کنه، ایده آل نیست. لذا با محدود کردن حداکثر حافظه، همیشه یک مقداری از اون برای سایر نرم افزارها باقی میمونه و SQL Server هم تکلیفش رو میدونه که از یک حدی نباید تجاوز کنه.
ولی اگر این سرور فقط در اختیار SQL Server هستش، اون رو محدود نکنین.

یه سئوال از آقای ثباتی دارم که Performance Monitor همونی که تو Task Manager هست منظورتونه
نه، اونی که توی Administrative Tools هست!

نظر دوستان رو در مورد برنامه تحت Web میتونم بپرسم که اون چه تاثیری میتونه داشته باشه.
به هر حال اونها هم کاربر SQL Server محسوب میشن. چه از طریق Web چه از طریق LAN. با Performance Monitor تکلیف همشون روشن میشه!

m-khorsandi
چهارشنبه 21 اردیبهشت 1384, 11:12 صبح
آقای ثباتی عزیز،
من توی Administrative Tools چیزی به اسم Performance Monitor ندیدم، فقط یه Performance بود،
که در اون هم باید یه سری از Object هایی رو که نیاز داریم تا مانیتور کنه اضافه کنیم. از همین باید استفاده
کنم؟

AminSobati
چهارشنبه 21 اردیبهشت 1384, 13:58 عصر
بله. موقع نصب SQL Server میبایست Performance Counter رو انتخاب کرده باشین البته

m-khorsandi
شنبه 24 اردیبهشت 1384, 15:05 عصر
آقای ثباتی عزیز،
به غیر از SQL Server و آنتی ویروس نرم افزار دیگری روی این Server نصب نیست، میشه گفت خاص SQL Server
هست و برنامه دیگری هم از حافظه استفاده نمیکند.

فکر کنم استفاده از Performance Monitor بهترین راه باشه.

AminSobati
شنبه 24 اردیبهشت 1384, 20:57 عصر
قطعا :)