عنوان:

‫تنظیمات پیشنهادی حداکثر حافظه‌ی مصرفی اس کیوال سرور


نویسنده: وحید نصیری
تاریخ: ۱۳۸۷/۱۱/۰۶ ۱۶:۳۶:۱۱
آدرس: www.dntips.ir

به صورت پیش فرض تنظیمات حافظه‌ی اس کیوال سرور به صورتی است که به آن اجازه می‌دهد تمامی حافظه‌ی مهیای سیستم عامل را مصرف کند! اگر شخصی با این مساله آشنایی نداشته باشد احتمالا تصور خواهد کرد که اس کیوال سرور نشتی حافظه دارد یا کلا مشکلی در سیستم روی داده است که تا این حد مصرف حافظه بالا رفته است.
برای مشاهده‌ی این تنظیمات روی instance سرور مورد نظر کلیک راست کرده و گزینه خواص را انتخاب کنید. سپس در صفحه‌ی باز شده گزینه memory را مشاهده نمائید.
البته این‌کار را با استفاده از دستورات T-SQL هم می‌توان انجام داد:

EXEC sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE

EXEC sp_configure 'max server memory (MB)'

EXEC sp_configure 'show advanced options', 0
RECONFIGURE WITH OVERRIDE

نتیجه‌ی آن بر روی سیستم برنامه نویسی من به صورت زیر است:



که البته عمدا آن‌را بر روی یک گیگ تنظیم کرده‌ام تا عملکرد سیستم مختل نشود. (چون اگر غیر از این باشد، تعارفی نداشته و هر آنچه را که صلاح بداند مصرف می‌کند!)
کمی در بلاگ‌های رسمی برنامه نویس‌های اس کیوال سرور در سایت MSDN در این‌‌باره جستجو کردم و نتیجه آن به صورت زیر است:

تنظیمات حداکثر حافظه‌ی مصرفی اس کیوال سرورهای 2005 و 2008
برای یک سیستم عامل 64 بیتی:

Physical RAM MaxMem Setting
2GB 1500
4GB 3200
6GB 4800
8GB 6700
12GB 10600
16GB 14500
24GB 22400
32GB 30000
48GB 45000
64GB 59000


برای سروری 32 بیتی این اعداد حداکثر را تقریبا منهای 300 مگابایت نمائید. (و البته همانطور که مطلع هستید در سیستم عامل‌های سرور 32 بیتی، اگر بیشتر از 2 گیگا بایت رم داشتید سوئیچ 3GB و اگر بیشتر از 4 گیگابایت رم مهیا بود، سوئیچ PAE باید در boot.ini تنظیم شوند. در غیر اینصورت هزینه‌ی سخت افزاری بیهوده‌ای را متحمل شده‌اید، زیرا استفاده‌ی بهینه‌ای از آن در یک سیستم عامل 32 بیتی نخواهد شد)

و این اعداد را همانطور که ذکر شد، در تنظیمات سرور می‌توان وارد نمود ( از طریق management studio ) و یا با استفاده از دستورات T-SQL نیز این امر میسر است: (در مثال زیر حداکثر حافظه مجاز مصرفی به 2300 مگابایت تنظیم می‌شود)

EXEC sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE

EXEC sp_configure 'max server memory (MB)', 2300

EXEC sp_configure 'show advanced options', 0
RECONFIGURE WITH OVERRIDE

و البته لازم به ذکر است که اعداد فوق برای حالتی پیشنهاد شده است که سرور مورد نظر فقط یک کار و آن‌هم اجرا و سرویس دهی اس کیوال سرور را به عهده داشته باشد. بدیهی است اگر از این سرور استفاده‌های دیگری هم می‌شود این اعداد را باید کمتر نیز در نظر گرفت.


برای مطالعه‌ی بیشتر
http://sqlnerd.blogspot.com/2006/07/memory-use-in-sql-server.html
http://blogs.msdn.com/axperf/archive/2008/03/10/welcome-database-configuration-checklist-part-1.aspx
http://technet.microsoft.com/en-us/library/bb124810.aspx

نظرات

  • مهمان در ۱۳۸۹/۰۷/۲۲ ۲۲:۰۷:۰۳
    اگر این سرور وظیفه ی وب سروری رو هم داشته باشه(IIS) چه درصدی رو پیشنهاد میکنید?
    البته DNS هم هست طبیعتا!!
  • وحید نصیری در ۱۳۸۹/۰۷/۲۲ ۲۳:۰۵:۳۱
    برای IIS حدود حداقل یک گیگ و اگر تعداد کاربر زیاد است تا یک و نیم گیگ را کنار بگذارید. DNS Server زیاد حافظه مصرف نمی‌کند. یا حداقل به اندازه‌ی IIS نیست. تا 300 مگ برای آن زیاد هم هست.
    بنابراین اگر مثلا سرور شما 4 گیگ رم دارد و IIS و DNS و SQL Server و غیره را با هم دارد، حداکثر حافظه مصرفی SQL Server را به حدود 2.3 گیگ محدود کنید و گرنه خیلی زود صدای کاربران سایت‌(ها) در خواهد آمد که باز هم کند شد ... باز هم کند شد ...
  • وحید نصیری در ۱۳۹۸/۰۲/۲۸ ۱۹:۱۵
  • وحید نصیری در ۱۴۰۴/۰۷/۰۴ ۱۲:۲۸
    مدیریت حافظه SQL Server: توصیه‌های جدید مایکروسافت

    یکی از جنبه‌های حیاتی بهینه‌سازی عملکرد برنامه‌های مبتنی بر دات‌نت (.NET) که از SQL Server به عنوان پایگاه داده استفاده می‌کنند، مدیریت صحیح تخصیص حافظه (RAM) به موتور SQL Server است. تخصیص نادرست حافظه می‌تواند منجر به رقابت بر سر منابع، کاهش عملکرد سیستم‌عامل، و در نهایت، کندی برنامه شما شود. مایکروسافت اخیراً توصیه‌های خود را برای تنظیمات حافظه SQL Server به‌روزرسانی کرده است که توسعه‌دهندگان دات‌نت باید از آن مطلع باشند.

    توصیه‌های جدید: ۷۵٪ حداکثر و ۰٪ حداقل

    توصیه‌ی جدید و رسمی مایکروسافت که شاید بسیاری از توسعه‌دهندگان از آن غافل بوده‌اند، به‌شرح زیر است:
    حداکثر حافظه سرور (Max Server Memory):
    • توصیه جدید: 75 از کل حافظه فیزیکی (RAM).
    حداقل حافظه سرور (Min Server Memory):
    • توصیه جدید: 0 (صفر).
    این توصیه‌ها اکنون در مستندات رسمی مایکروسافت در ستون "Recommended" (توصیه شده) درج شده‌اند و همچنین توسط ویزارد نصب SQL Server 2022 در صورت انتخاب تنظیمات پیشنهادی اعمال می‌شوند.

    چرا 75 و 0؟

    این تنظیمات در واقع رویکردی مدیریت خودکار (Auto-Managed) برای حافظه را تقویت می‌کنند:
    • حداقل حافظه 0: با تنظیم حداقل حافظه روی صفر، شما به SQL Server اجازه می‌دهید تا در صورت عدم وجود فشار، حافظه کمتری مصرف کند. مهم‌تر از آن، اجازه می‌دهد تا در مواقعی که سیستم‌عامل یا سایر فرآیندها (مانند IIS، سرویس‌های دات‌نت، ویندوز و غیره) به حافظه بیشتری نیاز دارند، حافظه آزاد کند.
    • حداکثر حافظه 75: این تنظیم تضمین می‌کند که 25 از کل حافظه فیزیکی سرور همیشه برای سیستم‌عامل (OS) و سایر برنامه‌های مهم (مانند IIS که میزبان برنامه‌های ASP.NET شماست، یا خود CLR دات‌نت) آزاد باقی بماند. این کار از مشکل رایج صفحه‌بندی (Paging) حافظه (استفاده از دیسک سخت به جای RAM) که به‌شدت عملکرد را کاهش می‌دهد، جلوگیری می‌کند.

    چالش‌ها و ملاحظات اضافی برای سرورهای بزرگ

    اگرچه توصیه 75درصد برای سرورهای کوچک تا متوسط (مثلاً تا 64GB RAM) بسیار مناسب است، اما برای سرورهای بسیار بزرگ که دارای 512GB حافظه یا بیشتر هستند، نگه داشتن 25 حافظه آزاد می‌تواند غیرضروری باشد.
    • مثال: در یک سرور 1TB (ترا بایت) حافظه، 25 معادل 250GB حافظه آزاد است که مقدار زیادی است. این میزان می‌تواند به‌طور مؤثری برای کش کردن داده‌ها و بهبود عملکرد SQL Server مورد استفاده قرار گیرد.

    رویکرد جایگزین برای سرورهای حجیم

    توسعه‌دهندگان و مدیران پایگاه داده (DBAs) معمولاً برای سرورهای بزرگ از یک قانون ترکیبی استفاده می‌کنند که هم درصد و هم یک حداقل آستانه مطلق (Floor) را در نظر می‌گیرد. یک توصیه رایج این است که:
    • تنها 10 تا 15 از کل RAM یا یک مقدار ثابت (مثلاً 4GB)، هر کدام که بیشتر است، را برای سیستم‌عامل آزاد بگذارید.
    این رویکرد تضمین می‌کند که در یک سرور کوچک، حداقل حافظه مورد نیاز برای سیستم‌عامل آزاد بماند، و در یک سرور بزرگ، درصد کمتری از کل حافظه برای OS رزرو شود.

    نکته مهم برای توسعه‌دهندگان دات‌نت:
    هنگام تنظیم حداکثر حافظه SQL Server، باید حافظه مصرفی توسط وب‌سرویس‌های دات‌نت (به ویژه اگر از IIS یا Kestrel در کنار SQL Server استفاده می‌کنید) را در نظر بگیرید. 25 باقیمانده برای هر دوی سیستم‌عامل و برنامه دات‌نت شماست.

    مدیریت پیشرفته و خودکارسازی

    برای توسعه‌دهندگان دات‌نت و ادمین‌هایی که چندین Instance از SQL Server را مدیریت می‌کنند، می‌توان این تنظیمات را به‌صورت خودکار مدیریت کرد تا در صورت تغییر اندازه ماشین مجازی، نیازی به تنظیم دستی مجدد نباشد.
    کد T-SQL زیر یک نمونه از منطق خودکارسازی را نشان می‌دهد که حداکثر حافظه را به 85 کل RAM یا کل RAM منهای 4GB (هر کدام که کوچکتر است) تنظیم می‌کند. این کار اطمینان می‌دهد که حداقل 15 یا 4GB حافظه (بسته به بزرگی سرور) آزاد باقی بماند:
    /* تنظیم حداکثر حافظه سرور (MB) بر اساس 85% از کل RAM، یا کل RAM منهای 4GB، هر کدام که کوچکتر است. */
    DECLARE @target_mb BIGINT;
    DECLARE @total_physical_kb BIGINT;
    
    SELECT @total_physical_kb = physical_memory_kb 
    FROM sys.dm_os_sys_info;
    
    SELECT @target_mb = CASE
        -- اگر 85% + 4GB از کل RAM بیشتر باشد، 4GB را کم کن
        WHEN (@total_physical_kb * .85) + (4 * 1024 * 1024) >= @total_physical_kb
        THEN (@total_physical_kb - (4 * 1024 * 1024)) / 1024
        -- در غیر این صورت 85% را در نظر بگیر
        ELSE (@total_physical_kb * .85) / 1024
        END;
    
    -- اعمال تنظیمات
    EXEC sys.sp_configure N'max server memory (MB)', @target_mb;
    RECONFIGURE WITH OVERRIDE;

    نتیجه‌گیری

    توصیه رسمی مایکروسافت مبنی بر تنظیم Max Server Memory روی 75 و Min Server Memory روی 0 یک نقطه شروع مطمئن و عالی برای اکثر محیط‌ها، به‌ویژه برای توسعه‌دهندگان دات‌نت که بهینه‌سازی منابع مشترک با SQL Server برایشان حیاتی است، می‌باشد. با این حال، در محیط‌های بسیار بزرگ، استفاده از یک قانون ترکیبی درصدی و آستانه‌ای ثابت (مانند 10 یا 4GB) می‌تواند کارآمدتر باشد تا حداکثر استفاده از RAM سرورهای گران‌قیمت تضمین شود.