حافظه دسترسی تصادفی (RAM) برای رایانه.
subin-ch / Shutterstock.com

مقدار تعویض لینوکس هیچ ارتباطی با مقدار RAM قبل از شروع تعویض ندارد. این یک اشتباه گسترده گزارش شده و کاملاً معتبر است. ما توضیح می دهیم که واقعاً چطور است.

افسانه های متلاشی کننده درباره Swapiness

مبادله روشی است که در آن داده ها در حافظه دسترسی تصادفی (RAM) به یک مکان خاص روی دیسک سخت شما نوشته می شود ، یا یک پارتیشن مبادله یا پرونده مبادله

لینوکس تنظیماتی دارد به نام مقدار swappiness. در مورد آنچه این تنظیم کنترل می کند ، سردرگمی زیادی وجود دارد. معمول ترین توصیف نادرست از swappiness این است که آستانه استفاده RAM را تعیین می کند و هنگامی که مقدار RAM استفاده شده به آن آستانه رسید ، تعویض شروع می شود.

این تصور غلطی است که بارها تکرار شده است و اکنون عقل دریافت می شود. . اگر (تقریبا) هر کس دیگری به شما می گوید دقیقاً چطور سرعت عمل می کند ، چرا وقتی ما می گوییم اینگونه نیست ، باید به ما اعتقاد داشته باشید؟

ساده. ما می خواهیم آن را اثبات کنیم.

RAM شما Split Into Zones است

لینوکس فکر نمی کند که RAM شما به عنوان یک حافظه بزرگ همگن باشد. آن را در نظر می گیرد که به تعدادی از مناطق مختلف به نام مناطق تقسیم شود. اینکه کدام مناطق در رایانه شما موجود است بستگی به این دارد که 32 بیتی باشد یا 64 بیتی. در اینجا شرح ساده ای از مناطق ممکن در رایانه معماری x86 آورده شده است.

  • دسترسی مستقیم به حافظه (DMA) : این حافظه کم 16 مگابایت است. این منطقه نام خود را می گیرد زیرا مدت ها قبل رایانه هایی وجود داشتند که فقط می توانند دسترسی مستقیم حافظه را به این قسمت از حافظه فیزیکی انجام دهند.
  • Direct Memory Access 32 : علیرغم نام آن ، دسترسی مستقیم به حافظه مستقیم 32 (DMA32 ) منطقه ای است که فقط در لینوکس 64 بیتی یافت می شود. حافظه کم 4 گیگابایتی است. لینوکس که روی رایانه های 32 بیتی کار می کند ، تنها DMA را می تواند به این مقدار RAM انجام دهد (مگر اینکه آنها از هسته فیزیکی آدرس (PAE) استفاده کنند) ، به این ترتیب منطقه نام خود را پیدا کرده است. اگرچه ، در رایانه های 32 بیتی ، به آن HighMem گفته می شود.
  • Normal : در رایانه های 64 بیتی ، حافظه معمولی همه رم های بالاتر از 4 گیگابایت (تقریباً) است. در دستگاههای 32 بیتی ، این رم بین 16 مگابایت و 896 مگابایت است.
  • HighMem : این تنها در رایانه های 32 بیتی لینوکس وجود دارد. همه رم های آن بالاتر از 896 مگابایت است ، از جمله رم بالای 4 گیگابایت در دستگاه های به اندازه کافی بزرگ.

RAM PAGESIZE Value

در صفحات ، که اندازه ثابت دارند اختصاص می یابد. این اندازه توسط هسته در زمان بوت با شناسایی معماری رایانه مشخص می شود. به طور معمول اندازه صفحه در رایانه های لینوکس 4 Kbytes است.

اندازه صفحه خود را می توانید با استفاده از دستور getconf مشاهده کنید:

 getconf PAGESIZE 

 getconf PAGESIZE

به گره ها متصل شده اند

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

مفهوم گره ها به CPU ها گره خورده اجازه می دهد تا انواع حافظه مخلوط در رایانه های چند CPU ویژه ، با استفاده از Non – معماری دسترسی به حافظه یکنواخت.

این همه بسیار عالی است. متوسط ​​کامپیوتر لینوکس دارای یک گره واحد به نام گره صفر خواهد بود. تمام مناطق به آن گره تعلق دارند. برای دیدن گره ها و مناطق موجود در رایانه ، به پرونده / proc / buddyinfo نگاه کنید. برای این کار از کمتر استفاده خواهیم کرد:

 کمتر / proc / buddyinfo 

 کمتر / proc / buddyinfo در یک پنجره ترمینال

این نتیجه از 64 بیتی است. رایانه این مقاله در مورد:

 گره 0 ، منطقه DMA 1 1 1 0 2 1 1 0 1 1 3
گره 0 ، منطقه DMA32 2 67 58 19 8 3 3 1 1 1 17 

یک گره منفرد وجود دارد ، گره صفر. این رایانه تنها 2 گیگابایت رم دارد ، بنابراین هیچ منطقه "عادی" وجود ندارد. فقط دو منطقه وجود دارد ، DMA و DMA32.

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

  • 2 : 2 از 2 ^ ( 0 * PAGESIZE) تکه های حافظه وجود دارد.
  • 67 : 67 از 2 ^ ( 1 * PAGE_SIZE) قطعات حافظه وجود دارد.
  • 58 : تعداد 58 عدد از 2 ^ ( 2 * PAGESIZE) حافظه موجود است
  • و به همین ترتیب ، تا پایان …
  • 17 : 17 نفر از 2 ^ ( 512 * PAGESIZE) قطعات وجود دارد.

اما واقعاً ، تنها دلیل ما در حال بررسی این اطلاعات هستیم تا رابطه گره ها و مناطق را مشاهده کنیم.

صفحات پرونده و صفحات ناشناس

در نگاشت حافظه از مجموعه ای از ورودی های جدول صفحه استفاده می کند تا صفحات حافظه مورد استفاده قرار گیرد و چه چیزی [19659006] نگاشتهای حافظه می توانند عبارتند از:

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

برای تعویض ، فقط باید خودمان را با دو مورد اول در لیست نگران کنیم: صفحات پرونده و صفحات ناشناس.

Swappiness

در اینجا توضیحات swappiness آورده شده است. از اسناد لینوکس در GitHub:

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

مقدار پیش فرض 60 است. »

به نظر می رسد که swappiness به شدت یا بالا می رود. جالب است بدانید که تعویض صفر تغییر نمی کند. این امر به هسته دستور می دهد تا زمانی که شرایط خاصی برآورده نشود ، مبادله کنید. اما تعویض هنوز هم ممکن است رخ دهد.

بگذارید عمیق تر حفار شویم. در اینجا تعریف و مقدار پیش فرض vm_swappiness در پرونده منبع هسته vmscan.c آورده شده است:

/ *
* از 0 .. 100. بالاتر به معنی شادتر است.
* /
int vm_swappiness = 60؛

مقدار swappiness می تواند از 0 تا 100 باشد. باز هم ، مطمئناً این نظر به نظر می رسد که مقدار swappiness تاثیری در میزان مبادله با رقم بالاتر دارد. منجر به تعویض بیشتر شود.

در ادامه در پرونده کد منبع ، می توانیم ببینیم که یک متغیر جدید به نام swappiness مقداری را اختصاص داده است که با عملکرد mem_cgroup_swappiness () . برخی ردگیری بیشتر از طریق منبع منبع نشان می دهد که مقدار برگشتی توسط این تابع vm_swappiness است . بنابراین ، اکنون متغیر swappiness برابر است با هر مقدار vm_swappiness تنظیم شده است.

int swappiness = mem_cgroup_swappiness (memcg)؛ ] کمی پایین تر در همان پرونده کد منبع ، ما این را می بینیم:

/ *
* با سرعت زیاد در 100 ، ناشناس و پرونده دارای اولویت مشابه هستند.
* این اولویت اسکن در اصل است. معکوس از هزینه IO.
* /
anon_prio = swappiness؛
file_prio = 200 - anon_prio؛

جالب است. دو مقدار مجزا از swappiness گرفته شده است. متغیرهای anon_prio و file_prio متغیرها این مقادیر را نگه می دارند. با افزایش یکی ، دیگری کاهش می یابد و برعکس .

مقدار swappiness لینوکس در واقع نسبت را بین بین دو قرار می دهد.

طلایی Ratio

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

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

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

همانطور که می بینید از آخرین قطعه کد ، دو متغیر وجود دارد. file_prio را برای "اولویت پرونده" ، و دیگری با نام anon_prio را "اولویت ناشناس" نامید.

  • متغیر anon_prio به مقدار swappiness لینوکس تنظیم شده است.
  • مقدار file_prio مقدار 200 منهای مقدار anon_prio تنظیم شده است.

این متغیرها مقادیری را دارند که به طور همزمان کار می کنند. اگر هر دو به 100 تنظیم شوند ، برابرند. برای هر مقادیر دیگر ، anon_prio از 100 به 0 کاهش می یابد ، و file_prio از 100 به 200 افزایش می یابد. این دو مقدار به یک الگوریتم پیچیده که مشخص می کند هسته لینوکس با چه میزان است ، کاهش می یابد. ترجیح برای بازپس گیری (آزاد کردن) صفحات پرونده یا صفحات ناشناس.

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

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

When Swap واقعاً از بین می رود؟

ما دریافتیم که مقدار swappiness لینوکس اولویت را برای نوع صفحات حافظه است که برای احیای بالقوه اسکن می شوند. خوب است ، اما چیزی باید تصمیم بگیرد چه موقع تعویض تغییر خواهد کرد.

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

برای بررسی اینکه علائم آب زیاد و پایین شما چیست ، به پرونده / proc / zoneinfo با این دستور نگاه کنید:

 کمتر / proc / zoneinfo 

 کمتر / proc / zoneinfo در یک پنجره ترمینال

هر یک از مناطق دارای مجموعه ای از مقادیر حافظه هستند که در صفحات اندازه گیری می شوند. در اینجا مقادیر مربوط به منطقه DMA32 در دستگاه تست آورده شده است. علامت آب کم 13966 صفحه ، و علامت آب زیاد 16759 صفحه است:

 مقادیر علامت آب DMA32 در یک پنجره ترمینال

  • در شرایط عادی اجرا ، هنگامی که حافظه آزاد در یک منطقه پایین می آید. با توجه به مقادیر نسبی anon_prio و file_prio اگر الگوریتم مبادله منطقه ، اسکن صفحات حافظه را جستجو می کند تا بتواند آن را بازیابی کند.
  • مقدار swappiness روی صفر تنظیم شده است ، مبادله ای زمانی اتفاق می افتد که مقدار ترکیبی صفحات پرونده و صفحات رایگان کمتر از علامت آب زیاد باشد.

بنابراین می بینید که نمی توانید از مقدار swappiness Linux استفاده کنید تا روی رفتار swap با توجه به RAM تأثیر بگذارد. استفاده

چه چیزی باید Swapiness تنظیم شود؟

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

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

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

اینها نکاتی است که باید در نظر بگیرید:

  • "غیرفعال کردن مبادله" با تنظیم مقدار تعویض لینوکس به صفر ، فعالیت هارد دیسک مرتبط با مبادله را به فعالیت هارد دیسک مربوط به فایل تغییر می دهد.
  • اگر پیری ، دیسک های سخت مکانیکی دارید ، ممکن است سعی کنید مقدار swappiness Linux را کاهش دهید. به تعصب دور از احیای صفحه ناشناس و کاهش churn پارتیشن swap. البته ، هنگامی که یک تنظیم را خاموش می کنید ، تنظیم دیگر افزایش می یابد. كاهش مبادله مبادله ای احتمالاً باعث افزایش جذابیت سیستم فایل خواهد شد. اما ممکن است رایانه شما از یک روش نسبت به روش دیگر خوشحال تر باشد. در واقع ، تنها راه برای اطمینان مطمئناً امتحان کردن و دیدن است.
  • برای سرورهای یک منظوره ، مانند سرورهای پایگاه داده ، می توانید از تهیه کنندگان نرم افزار بانک اطلاعاتی راهنمایی بگیرید. در اکثر اوقات ، این برنامه ها روال حافظه پنهان پرونده و مدیریت حافظه را برای خود طراحی کرده اند که بهتر است به آنها اعتماد کنید. ارائه دهندگان نرم افزار ممکن است با توجه به مشخصات دستگاه و حجم کار ، مقدار تعویض لینوکس را پیشنهاد دهند.
  • برای متوسط ​​کاربر رومیزی با سخت افزار معقول اخیر؟

نحوه تنظیم مقدار Swappiness Linux

قبل از تغییر مقدار swappiness ، باید بدانید که ارزش فعلی آن چیست. اگر می خواهید آن را کمی کاهش دهید ، سوال کمی کمتر از چه چیزی است؟ با این دستور می توانید اطلاعات کسب کنید:

 cat / proc / sys / vm / swappiness 

 cat / proc / sys / vm / swappiness

برای پیکربندی مقدار تعویض ، از دستور sysctl :

 sudo sysctl vm.swappiness = 45 

 sudo sysctl vm.swappiness = 45 در پنجره ترمینال

مقدار جدید بلافاصله استفاده می شود ، بدون راه اندازی مجدد مورد نیاز است.

در واقع ، اگر دوباره راه اندازی مجدد کنید ، مقدار swappiness به مقدار پیش فرض 60 برمی گردد. وقتی آزمایش را تمام کردید و درمورد مقدار جدیدی که می خواهید استفاده کنید تصمیم گرفتید ، می توانید آنرا ثابت نگه دارید. با افزودن آن به پرونده /etc/sysctl.conf راه اندازی مجدد می شود. می توانید از هر ویرایشگر مورد نظر خود استفاده کنید. برای ویرایش پرونده با ویرایشگر nano از دستور زیر استفاده كنید:

 sudo nano /etc/sysctl.confociation19659028 قراردادآوری19459041 نظراتsudo nano /etc/sysctl.conf در پنجره ترمینال " width="646" height="57" src="/pagespeed_static/1.JiBnMqyl6S.gif" onload="pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);" onerror="this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);"/> 

وقتی nano باز شد ، به پایین پرونده بروید و این خط را اضافه کنید. ما از 35 به عنوان مقدار تعویض دائمی استفاده می کنیم. شما باید مقدار مورد نظر خود را جایگزین کنید.

 vm.swappiness = 35 

 /etc/sysctl.conf در ویرایشگر نانو در یک پنجره ترمینال

برای ذخیره تغییرات خود و خروج از nano ، "Ctrl + O" را فشار دهید ، "Enter" را فشار دهید و "Ctrl + Z" را فشار دهید.

مدیریت حافظه پیچیده است

مدیریت حافظه پیچیده است. و به همین دلیل است که برای یک کاربر متوسط ​​معمولاً بهتر است آن را روی هسته بگذارید.

فکر می کنید که از RAM بیشتری استفاده می کنید بسیار ساده است. برنامه های کاربردی مانند top و free می توانند برداشت غلط کنند. لینوکس از RAM رایگان برای اهداف مختلف خود مانند حافظه پنهان دیسک استفاده می کند. این به طور مصنوعی رقم حافظه "استفاده شده" را بالا می برد و از حافظه "رایگان" می کاهد. در حقیقت ، رم استفاده شده به عنوان حافظه نهان دیسک پرچم گذاری شده است و به عنوان "مورد استفاده" و "در دسترس" قرار می گیرد ، زیرا در هر زمان ، خیلی سریع قابل بازپرداخت است.

به عنوان خوانده شده که ممکن است مانند مبادله باشد ، کار نمی کند ، یا که ارزش swappiness به تغییر نیاز دارد.

شیطان مانند همیشه در جزئیات است. یا ، در این حالت ، Daemon. مبلغ هسته مبادله.