آیا به تدریج در حال رشد استفاده از مبادله شاخصی برای نشت حافظه است؟

ساخت وبلاگ

من سعی می کنم درک کنم که آیا من یک نشت حافظه روی سرور خود دارم (ویندوز سرور 2012R2). این سرور دارای 48 گیگابایت رم است و برای اجرای فقط DBMS (یک SQL Server 2014) طراحی شده است اما ابزارهای دیگری مانند Symantec Endpoint Protection ، Fireeye و برخی از ابزارهای نظارتی/خدمات نصب شده نیز وجود دارد. در حال حاضر تنظیم شده است تا 42 گیگابایت به DBMS رزرو کند و 6 گیگابایت را به سیستم عامل و سایر خدمات منتقل کند. خطاهای خارج از حافظه وجود داشت که تنها 4 گیگابایت برای سیستم عامل و سایر خدمات محفوظ بود ، که پس از افزایش این کار به 6 گیگابایت ناپدید شدند. استفاده از رم بالا به خودی خود برای یک دستگاه SQL Server طبیعی است ، زیرا SQL Server داده های موجود در RAM را بافر می کند.

What worries me is that swap usage (performance counter Paging File->استفاده) به تدریج در 2 ماه گذشته در حال حاضر به 15 ٪ از 24 گیگابایت (اندازه پرونده مبادله) می رسد. من مطمئن نیستم که آیا این خوب است زیرا ویندوز حتی در شرایط عادی چیزهایی را در مبادله قرار می دهد یا این نشانگر این است که 6 گیگابایت نیز بعد از مدتی کافی نخواهد بود. در نمودار زیر خط سبز استفاده از RAM است (وقتی سرور SQL را مجدداً راه اندازی می کنم و به سرعت از خواب بلند می شود) و به رنگ زرد از اواسط ماه مه استفاده می شود.

مبادله تصویر استفاده

Swap usage image

کاری که من انجام داده ام:

Dumped the performance counters “Process->بایت های خصوصی ". هیچ چیز واقعاً مشکوک در اینجا نیست. TOP10 در MBS (در کل 44711 مگابایت) است:

  • SQLSERVER 41322
  • XAGT#5 504
  • CCSVCHST 316
  • Splunkd 285
  • CCSVCHST#1 260
  • MonitoringHost 233
  • XAGT#1 151
  • MonitoringHost#1 129
  • HealthService 116
  • Svchost#4 110

سعی در راه اندازی مجدد خدمات فردی (SQL Server ، XAGT/Fireeye ، Splunkd). این هیچ تاثیری در استفاده از مبادله نداشت.

سعی کردم اطلاعات بیشتری را با استفاده از ابزارهای Rammap از Sysinteals و VMMAP کسب کنم زیرا من گمان می کردم برخی از فرآیند حافظه را از طریق پرونده های نقشه برداری شده از حافظه نشت می کند ، که به بایت های خصوصی حساب نمی شوند.

گزارش های RAMMAP در زیر (متأسفانه پرونده های مربوط به خلاصه پرونده/جزئیات پرونده فقط به کمتر از 300 مگابایت مورد استفاده اضافه می شود ، هرچند 2659 مگابایت گزارش شده به عنوان فعال برای پرونده های نقشه برداری):

عکس از Rammap

Screenshot from rammap

من یک سرور دیگر با همان ابزارهای نصب شده ، اما 96 گیگابایت رم و تعویض 16 گیگابایتی دارم. استفاده از رم زیر 50 ٪ است ، اما میزان استفاده از مبادله نیز در حال حاضر (تقریباً) در حال حاضر با 28 ٪ افزایش می یابد.

تعویض استفاده از سرور دیگر

Swap usage on another server

آیا این نوع رفتار طبیعی است؟اگر اینطور نیست ، چگونه می توانم روند مشکل ساز را پیدا کنم؟

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

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

3 پاسخ 3

پشتیبان گیری Swap Storage پارامتری است که قابل مشاوره است. وقتی کافی باشد ، تعهد بیش از حد حافظه لازم نیست. پاسخ قبلی من توضیح واقعی نبود.

نتیجه گیری این است که پوستر دارای یک نشت حافظه واقعی است که در ابزارها نشان نمی دهد. این معمولاً بدان معنی است که نشت در ویندوز یا برخی از درایور شخص ثالث است.

پیدا کردن چنین نشت هایی بسیار سخت است و هنگامی که یافت می شود اغلب در کد اختصاصی هستند که قابل تغییر نیستند.

از آنجا که نشت در این حالت بسیار ناچیز است و هیچ عملکردی ندارد ، مشکل بیشتر فقط یک دلخوری است. هر چند وقت یک بار می توان آن را با راه اندازی مجدد ثابت کرد. در مورد پوستر این حتی می تواند چیزی به اندازه یک بار در ماه باشد.

پاسخ قبلی وقتی اطلاعات کمتری در دسترس بود:

شما ظاهراً تحت این تصور هستید که فضای مبادله فقط زمانی استفاده می شود که ویندوز (یا هر سیستم عامل) از رم خارج شود. این خیلی از موضوع دور است.

سیستم عامل باید در هنگام خسته شدن RAM آماده مبادله فرآیندها باشد. به همین دلیل ، برای هر فرایندی که از RAM درخواست می کند ، سیستم عامل فضای مبادله ای را که برابر با مبلغ درخواست شده است ، اختصاص داده و حتی قبل از آنکه درخواست RAM را اعطا کند ، آن را اختصاص می دهد. فضای مبادله اختصاص یافته لزوماً به عنوان بخش های خاص دیسک اختصاص نمی یابد ، اما سیستم عامل اطمینان می دهد که فضای آزاد کافی در صورت نیاز وجود دارد.

افزایش شما مشاهده می کنید به این معنی است که DBMS شما به آرامی اندازه حافظه خود را افزایش می دهد و از RAM بیشتری درخواست می کند. مبادله بر این اساس افزایش می یابد.

برای اینکه کاملاً ایمن باشد ، فضای مبادله باید با اندازه رم برابر باشد. 6 گیگابایتی که اختصاص داده اید به دور از کافی نیست. افزایش مصرف مبادله نباید نگران کننده باشد.

توجه: اگرچه سرورها می توانند سالها بدون راه اندازی مجدد بروند ، اما راه اندازی مجدد گاه به گاه ممکن است در شروع مجدد همه چیز کمک کند.

من می دانم که ویندوز حتی وقتی RAM هنوز در دسترس است ، از مبادله استفاده می کند. این افزایش تدریجی استفاده در طی روزها و هفته ها است که باعث می شود فکر کنم به نوعی نشت حافظه دارم."افزایش شما مشاهده می کنید به این معنی است که DBMS شما به آرامی اندازه حافظه خود را افزایش می دهد و از RAM بیشتری درخواست می کند."این قطعاً درست نیست. DBMS خیلی سریع به تنظیمات حداکثر می رسد و در آنجا می ماند. هنگامی که من سرویس DBMS را مجدداً راه اندازی کردم (استفاده از رم انجام شد) ، استفاده از مبادله نیز کاهش نیافته است ، بنابراین احتمالاً استفاده از مبادله به DBMS وصل نشده است. اندازه مبادله 24 گیگابایت است. 6 گیگابایت رم برای سیستم عامل و سایر خدمات محفوظ است ، DBMS.

در این حالت ، شما نشت حافظه دارید. این می تواند هر چیزی باشد - یک درایور یا بخشی از ویندوز. پیدا کردن چنین نشتی ها همه چیز غیرممکن است ، و حتی اگر ممکن است نتوانید ویندوز را برطرف کنید. من در مورد شما ابتدا 6 گیگابایت را افزایش می دهم و تماشا می کنم. اگر این افزایش هنوز هم اتفاق بیفتد ، یک راه حل برای تنظیم مجدد راه اندازی مجدد مکرر با فرکانس مناسب است و سپس می توانید نگرانی در مورد آن را متوقف کنید.

-1 توضیح در مورد چگونگی استفاده از مبادله ، و "هر" سیستم عامل "برای تخصیص مبادله به همان میزان رم اعطا شده برای من کاملاً اشتباه به نظر می رسد. هیچ نیاز منطقی وجود ندارد که باید برای هر سیستم عامل اینگونه باشد ، و این اتفاقی است که در هر یک از ماشینهایی که در دهه های گذشته با آنها کار کرده ام اتفاق می افتد (به عنوان مثال لینوکس ، برخی از موارد مختلف ، مکوس ، ویندوز و غیره). ممکن است برخی از اثرات نامربوط وجود داشته باشد که - به طور غیرمستقیم - ممکن است منجر به یک رفتار مشابه شود (یعنی اگر سیستم عامل از طریق مبادله خواب زمستانی به دیسک را پیاده سازی کند) ، اما همانطور که در اینجا برای این سؤال ایستاده است ، برای من اشتباه به نظر می رسد.

"سیستم عامل اختصاص داده شده از فضای مبادله ای که برابر با مبلغ درخواست شده است ، و حتی قبل از اعطای درخواست RAM ، آن را اختصاص می دهد" آیا این بی اهمیت توسط آمار OP در سوال آنها وجود ندارد؟SQL Server از 42 گیگابایت رم استفاده می کند که از کل پرونده مبادله بزرگتر است. به معنای واقعی کلمه غیرممکن است که سیستم عامل فضای مبادله پشتی برابر را اختصاص داده است ، همانطور که می گویید این کار را انجام می دهد.

من فکر می کنم این به دلیل:

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

همچنین از اظهار نظر در آنجا ، مایکروسافت توصیه می کند که مبادله شما به اندازه کافی بزرگ باشد که در هر زمان معین فقط 50-75 ٪ استفاده می شود. که در اینجا مشکلی نیست.

مایکروسافت همچنین توصیه می کند (از همان لینک):

حافظه ، صفحات خروجی/SEC: این پیشخوان نشان می دهد که چند صفحه حافظه مجازی به صفحه صفحه ارسال شده است تا قاب های صفحه RAM را برای اهداف دیگر در هر ثانیه رایگان کند.

اگر گمان می کنید صفحه بندی تنگنای عملکرد شماست ، این بهترین پیشخوان برای نظارت است. حتی اگر بایت های متعهد از RAM نصب شده بیشتر باشد ، اگر صفحات خروجی/ثانیه کم یا صفر باشد ، بیشتر اوقات مشکل عملکرد قابل توجهی از رم کافی وجود ندارد.

نسخه کوتاه: سیستم عامل های مدرن مانند Hoarders هستند. آنها فقط وقتی مجبور می شوند چیزی را رها کنند (به برخی از محدودیت ها برخورد می کنند و چیزهای قدیمی را پاک می کنند ، یا چیزی تغییر کرده است ، بنابراین اجازه می دهد از نسخه قدیمی خارج شود) اساساً زیرا می تواند و ممکن است روزی مفید باشد.

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

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

در لینوکس ، پرخاشگری این فرآیند توسط vm. swappiness تعیین شده است. من نمی دانم ویندوز تنظیم تنظیم مشابهی دارد یا خیر.

15 ٪ از پرونده مبادله 24 گیگابایتی شما فقط 3. 6 گیگابایت است ، در اندازه 6 گیگابایتی که برای همه چیز به جز DBMS رزرو کرده اید.

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

بهترین حالت زمانی است که چنین صفحه ای حتی هرگز خوانده نمی شود ، بنابراین می تواند بیرون بماند یا رم. سپس فضای مبادله شما کار خود را انجام می دهد و RAM بیشتری را برای ذخیره دیسک و سایر موارد مفید در دسترس قرار می دهد.

اما پاسخ @user3067860 سرنخ بسیار مفید دیگری را ارائه می دهد: ویندوز حتی اگر دوباره خوانده شود ، صفحه ای را در فضای مبادله باقی می گذارد ، بنابراین می توان دوباره از RAM به صورت رایگان ، بدون I/O بیرون کشید. اگر صفحه اصلاح شود ، فقط از مبادله کاهش می یابد (یا حدس می زنم ، به عنوان مثال با شروع مجدد هر فرآیند متعلق به آن).

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

اما بقیه صفحات آنها که در هنگام راه اندازی از آنها کثیف شده اند ، دیگر هرگز نوشته نمی شوند ، و بیشتر آنها حتی اگر سرویس ویندوز لازم نباشد ، حتی خوانده نمی شوند.

بنابراین طولانی مدت ، ما انتظار داریم که بیشتر این صفحات (صفحات پشته و خصوصی . data / . bss و تخصیص پویا ، "Heap") در نهایت از صفحه خارج شوند. هر چیزی که خوانده می شود اما نوشته نشده است ، در نهایت در فضای مبادله به پایان می رسد ، اما در رم نیز داغ می ماند.

و البته مواردی غیر از DBM های شما وجود دارد که کارهایی را انجام می دهند ، مانند احتمالاً Windows Update و ورود به سیستم ، بنابراین زمینه ای برای رشد کل حافظه حافظه فراتر از آنچه که بعد از بوت بود ، وجود دارد.

این پاسخ یک حدس است که بر اساس نحوه طراحی سیستم عامل ها به طور کلی ، تجربه صفر با تنظیم واقعی سرور ویندوز است. ممکن است یک مشکل واقعی وجود داشته باشد ، اما همچنین ممکن است در صورت ترک آن ، استفاده از مبادله شما فلات شما را فلات کند. من به آن توجه می کنم ، اما نگران نخواهم شد مگر اینکه استفاده از مبادله شما بیش از 6 گیگابایت باشد. اگر به 12 گیب رسید ، ممکن است یک راه اندازی مجدد برنامه ریزی کنید.

از آنجا که شروع به کار مجدد DBM های شما در استفاده از مبادله تأثیر نمی گذارد ، به نظر می رسد که این صفحات از آن نبودند. این معنی دارداین در واقع کار واقعی را انجام می دهد و احتمالاً بیشتر صفحات حافظه آن را به طور مکرر می نویسد. و پارتیشن بندی شما از قوچ فیزیکی شاید باعث شود ویندوز سعی نکند صفحات خود را پس بگیرد.

فارکس حرفه ای...
ما را در سایت فارکس حرفه ای دنبال می کنید

برچسب : نویسنده : مرتضی احباب بازدید : 67 تاريخ : سه شنبه 8 فروردين 1402 ساعت: 22:13