امروزه بسیاری از سرورها از سیستمعامل لینوکس استفاده میکنند؛ این سیستمعامل به دلیل رایگان بودن و سازگاری بالا با نیازهای مختلف، بسیار محبوب است. همچنین، توسعهدهندگان زیادی مانند دبیان، اوبونتو و سنتوس، ابزارهای متنوعی را فراهم کردهاند که کار با برنامههای مختلف را آسانتر میکند. یکی از امور حیاتی در مدیریت سرورها، بهینهسازی حافظه است. بهینهسازی حافظه نه تنها باعث میشود برنامهها روانتر و سریعتر کار کنند، بلکه از اطلاعات در مقابل از دست رفتن و سرور در مقابل خرابی محافظت میکند. در این مطلب، روشهای سادهای برای بهبود حافظه در لینوکس را بررسی خواهیم کرد.
ابتدا با برخی اصطلاحات فنی شروع خواهیم کرد، در مورد نحوه مدیریت حافظه توسط لینوکس صحبت خواهیم کرد و سپس به شناسایی و حل مشکلات حافظه خواهیم پرداخت.
مقدار حافظه
میزان حافظهای که یک سیستم میتواند داشته باشد، به نوع سیستمعامل بستگی دارد. برای مثال، سیستمعاملهای ۳۲ بیتی فقط میتوانند تا ۴ گیگابایت حافظه را پشتیبانی کنند، در حالی که سیستمعاملهای ۶۴ بیتی میتوانند تا ۱۲۸ گیگابایت یا بیشتر را پشتیبانی کنند.
حافظه مجازی
کل حافظه در لینوکس، حافظه مجازی نامیده میشود که شامل حافظه فیزیکی (RAM) و حافظه Swap است. حافظه فیزیکی معمولاً با افزودن RAM بیشتر افزایش مییابد، اما حافظه مجازی را میتوان با استفاده از فضای swap از روی هارد دیسک افزایش داد.
۱ـ حافظه فیزیکی
مقدار RAM مشخص میکند که آیا دستگاه شما قادر است فرآیندهای سنگین حافظه را انجام دهد یا خیر. به عنوان مثال، برای اجرای پایگاه داده MongoDB روی سرور، حداقل ۱ گیگابایت حافظه RAM برای هر هزار دستگاه مورد نیاز است. برای اطمینان از عملکرد مناسب سرور، حافظه فیزیکی باید بیشتر از نیاز پایگاه داده باشد؛ در غیر این صورت، MongoDB به استفاده از فضای swap از هارد دیسک میپردازد که باعث کاهش عملکرد سیستم میشود. این امر به دلیل آن است که حافظه فیزیکی در کمترین زمان ممکن قابل دسترسی است، در حالی که حافظه swap نیاز به چندین برابر زمان برای دسترسی به داده دارد.
۲ـ حافظه Swap
زمانی که کامپیوتر حافظهاش پر میشود، به جای ذخیره تمام اطلاعات در حافظهی فیزیکی، بخشی از اطلاعات را به یک جای دیگر به نام “حافظه swap” منتقل میکند. این حافظه swap میتواند یک قسمت از دیسک یا یک فایل در دیسک باشد که در آن اطلاعات را ذخیره میکند.
حافظهی دیسک معمولاً بزرگتر از حافظهی فیزیکی است. وقتی کامپیوتر روشن است، اطلاعات مربوط به کارهایی که در حال حاضر انجام میشوند، در حافظهی فیزیکی نگهداری میشوند. اما اگر برق قطع شود، این اطلاعات از بین میروند. بنابراین مهم است که اطلاعات خود را بطور منظم ذخیره کنید، زیرا حافظهی دیسک این اطلاعات را برای همیشه نگهداری میکند.
میزان استفاده از حافظه در لینوکس
وقتی شما روی کامپیوتر خود کار میکنید و اطلاعاتی روی هارد دیسکتان ذخیره شده است، این اطلاعات به حافظه کامپیوترتان فرستاده میشود. اگر اطلاعات را میخواهید، حافظه کامپیوتر آنها را بارگیری میکند و به شما نشان میدهد. اگر اطلاعات نیاز به ذخیرهسازی دائمی دارند، حافظه کامپیوتر آنها را به هارد دیسک میفرستد.
وقتی که کامپیوتر باید چیزی را انجام دهد، دستورات به حافظه فرستاده میشوند. اگر دستورات نیاز به دسترسی سریع داشته باشند، حافظه آنها را مستقیماً به واحد پردازشی (CPU) میفرستد. اما اگر دستورات نیاز به ذخیرهسازی دائمی داشته باشند، حافظه آنها را به هارد دیسک ارسال میکند.
برای پیدا کردن مشکلات حافظه و بهینهسازی آن در لینوکس، ابزارهای خاصی وجود دارند. به عنوان مثال، اگر فکر میکنید مشکلی با حافظه دارید، میتوانید ماژولهای حافظه را جدا کنید و تست کنید که کدام یک مشکل ایجاد میکند.
برای دیدن اطلاعات سخت افزاری سیستمتان، ابزاری به نام dmidecode وجود دارد که به شما کمک میکند تا اطلاعات مربوط به سخت افزار را ببینید، مثل نسخه BIOS.
برای مثال:
dmidecode
اطلاعات حافظه را نشان میدهد.
بررسی میزان فضای خالی
یکی از دلایل رایج کندی کامپیوتر، کمبود فضای خالی برای انجام کارهاست. برای بررسی فضای خالی موجود در دستگاه، میتوانید از دستور «free» استفاده کنید.
free -g
این کد فضای خالی را برحسب گیگابایت نشان میدهد.
بررسی میزان استفاده CPU و حافظه
چندین ابزار خط فرمان برای بررسی میزان استفاده CPU و حافظه وجود دارد، از جمله htop، vmstat و ps.
htop اطلاعات لحظهای در مورد فرآیندهای CPU را نشان میدهد.
vmstat اطلاعاتی در مورد CPU، حافظه، فرآیندهای سیستم، صفحهبندی، وقفهها و زمانبندی CPU ارائه میدهد.
به عنوان مثال، با اجرای دستور زیر:
vmstat -a -S M
میتوانید اطلاعات مربوط به حافظه را به صورت مگابایت مشاهده کنید.
ps اطلاعاتی درباره فرآیندهای در حال اجرای لینوکس به ما میدهد.
به عنوان مثال، با اجرای دستور زیر:
ps -aux
میتوانید تمام فرآیندهای در حال اجرا را مشاهده کنید.
فرآیندهای مصرف کننده حافظه بالا در لینوکس
فرآیندهای زیادی در سرورهای لینوکس ممکن است زیادی از حافظه استفاده کنند. اولین چیزی که باید بررسی کنیم، دلایل ممکن این مصرف زیاد حافظه هستند.
فرآیندهای جاوا
برنامههای زیادی با استفاده از جاوا طراحی شدهاند و اشتباهات در پیکربندی یا پیادهسازی این برنامهها میتواند به مصرف بالای حافظه منجر شود. دو دلیل معمول، پیکربندی اشتباه در استفاده از حافظه موقت و استفاده نادرست از کش میباشد.
کش، یک روش معمول برای بهبود عملکرد برنامههاست، اما اگر به درستی پیکربندی نشود، میتواند به عملکرد سیستم آسیب برساند. پیکربندی اشتباه میتواند باعث افزایش سریع حافظه موقت شود و باقیماندن کمتر حافظه برای سایر فرآیندها را به دنبال داشته باشد.
استفاده از کش جلسه اغلب در هنگام ذخیره سازی وضعیت میانی برنامه استفاده میشود. این به توسعهدهندگان این امکان را میدهد که اطلاعات کاربر را در هر جلسه نگهداری کنند و دادههای مربوط به جلسه را به آسانی به دست آورند یا ذخیره کنند. با این حال، توسعهدهندگان اغلب فراموش میکنند که دادههای کش جلسه را پاک کنند پس از اتمام کار.
زمانی که در جاوا با پایگاه دادهها کار میکنیم، از یک مفهوم به نام “جلسه Hibernate” استفاده میشود که به ما کمک میکند تا اتصالات و مدیریت جلسات بین سرور و پایگاه داده را ایجاد کنیم. اما معمولاً، وقتی که توسعهدهندگان با این جلسات کار میکنند، یک مشکل مشخص بروز میکند.
این مشکل این است که به جای اینکه جلسات Hibernate به صورت جداگانه و در یک فضای ایمن در حالتهای مختلف ذخیره شوند، آنها در همان جلسه HTTP قرار میگیرند. این موضوع باعث میشود که برنامه بیشتر از حد لازم اطلاعات را در حافظه نگهداری کند و در نتیجه، هنگام استفاده از تعداد کمی از کاربران، مشکلاتی مانند افزایش شدید حافظه رخ دهد.
پایگاههای داده
وقتی در مورد مصرف حافظه صحبت میکنیم، باید به پایگاههای داده هم اشاره کنیم. زمانی که برنامه ما درخواستهای کاربر را پردازش میکند و به پایگاه داده دسترسی دارد، ممکن است مصرف حافظه به شدت افزایش یابد.
برای مثال، در نظر بگیرید یک پایگاه داده MySQL که برای بهبود عملکرد، از مکانیزم بافر برای ذخیره و نمایهسازی دادهها استفاده میکند. اما اگر پایگاه داده را به گونهای پیکربندی کنیم که هنگام درخواستهای متعدد، بیش از حد حافظه را استفاده کند، ممکن است با مشکلاتی مانند پر شدن زود هنگام حافظه سرور مواجه شویم.
زمانی که بیش از حد حافظه مصرف میشود (Memory Overcommit)
مفهوم “Memory Overcommit” زمانی به وقوع میپیوندد که به برنامهها اجازه میدهیم از حافظه مجازی بیشتر از حجم حافظه فیزیکی استفاده کنند. از یک طرف، این به سیستم کمک میکند تا از استفاده کم از رم جلوگیری کند، اما از طرف دیگر، اگر به برنامهها اجازه داده شود به طور نامحدود از حافظه مجازی استفاده کنند، در صورتی که حافظه فیزیکی موجود نباشد، ممکن است سیستم دچار مشکل شود.
بهترین دستورالعملها برای بهینهسازی حافظه
بهینهسازی حافظه در لینوکس یک فرآیند پیچیده است و نیازمند تلاش بسیار است. اما برخی راهکارهایی وجود دارند که میتوانند در جلوگیری از مشکلات مربوط به حافظه کمک کنند.
یک پارتیشن swap ایجاد کنید
یکی از این راهکارها، ایجاد یک پارتیشن swap است. با ایجاد یک پارتیشن swap، میتوانید از آن به عنوان حافظه مجازی برای سرور خود استفاده کنید. در صورتی که حافظه فیزیکی پر شود، اطلاعات مربوط به فرآیندهای غیرفعال به این فضای مبادله منتقل میشود و به فرآیندهای فعال که به حافظه نیاز دارند، اجازه فعالیت میدهد.
یک ramdisk ایجاد کنید
راهکار دیگر، ایجاد یک “ramdisk” است. Ramdisk یک فضای ذخیرهسازی سریع در رم است که برای کش کردن برنامهها یا مناطق کاری استفاده میشود. این فضای ذخیرهسازی سریعتر از حافظههای دیسکی معمولی عمل میکند و میتواند بهبود عملکرد فایلها را فراهم کند، بهویژه زمانی که برنامهها به منابع سختافزاری بسیاری نیاز دارند.
از پورت های باز محافظت کنید
برای کاهش احتمال هک، تنها پورتهای مورد نیاز خود را در زمانهای خاصی باز نگه دارید و از یک شبکه خصوصی مجازی برای محدود کردن دسترسی به پورتها استفاده کنید.
اگر به حملات بدافزاری مثل تلاش برای استخراج ارز دیجیتال دچار شدید، پورتهای ورودی و خروجی را مورد بررسی قرار دهید و تنها پورتهای لازم را باز کنید. سپس، crontab را از نمونههای مخرب پاک کرده و سرویسهای غیرفعال را خاموش یا متوقف کنید تا حافظه را بهینه سازی کنید.
سرویسهایی که استفاده نمیشوند را خاموش یا متوقف کنید
برای بهبود عملکرد حافظه دستگاه لینوکس، میتوانید خدمات در حال استفاده را متوقف کنید. به عنوان مثال، هنگامی که برنامهها را در یک محیط QA یا توسعه با استفاده از Docker اجرا میکنید، میتوانید یک ایمیج Docker ایجاد کرده و کانتینر Docker را برای اهداف آزمایشی استفاده کنید. پس از اتمام آزمایشات، میتوانید محیط را تمیز کنید.
جمعبندی
این بهینهسازی حافظه در دستگاه لینوکس شما منجر به صرفه جویی در حافظه و جلوگیری از ذخیره دادهها در فرآیندهای غیرضروری یا ذخیره دادههای بلااستفاده میشود. این امر باعث اجرای بهتر برنامههای شما میشود و خطر از دست دادن اطلاعات یا از کار افتادن سرور را کاهش میدهد.