−25%

روی پرداخت سالانه Windows، تا ۳۱ اکتبر. مشاهده پلن‌ها

EQVPS

چطور فضای دیسک VPS را بدون خراب کردن چیزی آزاد کنیم

دیسک VPS پر شده؟ با du و ncdu پیدا کنید چه چیزی فضا را گرفته و کش apt، ژورنال، باقی‌مانده‌های Docker و لاگ‌ها را بدون از دست دادن داده پاک کنید.

پیام "No space left on device" هیچ‌وقت سر وقت مناسب نمی‌آید. پایگاه داده دیگر نوشتن را قبول نمی‌کند، apt نمی‌تواند به‌روزرسانی را تمام کند و Docker حاضر نیست همان ایمیجی را که همین حالا لازم دارید دانلود کند. خبر خوب: روی یک VPS کوچک مقصر تقریباً همیشه یکی از پنج چیز است و در دو دقیقه پیدایش می‌کنید.

۱. اوضاع چقدر بد است؟

df -h /
df -i /

خط اول فضای مصرف‌شده را نشان می‌دهد. خط دوم inodeها را — اگر inodeها به ۱۰۰ درصد برسند در حالی که فضا خوب به نظر می‌رسد، میلیون‌ها فایل ریز دارید (فایل‌های نشست، صف ایمیل، پوشه‌ی کش). مشکل متفاوت، همان علامت.

۲. پیدا کنید چه چیزی بزرگ است

درخت را از بالا مرور کنید و بر اساس اندازه مرتب کنید:

du -xh / --max-depth=1 2>/dev/null | sort -h | tail -15

گزینه‌ی -x روی یک فایل‌سیستم می‌ماند تا وارد /proc نشود. بعد سراغ بزرگ‌ترین مورد بروید. برای گشتن تعاملی، ncdu خیلی راحت‌تر است:

apt install -y ncdu
ncdu -x /

کلیدهای جهت برای جابه‌جایی، d برای حذف. با آخری مراقب باشید.

۳. بردهای سریع

این‌ها روی هر سرور Ubuntu یا Debian امن‌اند:

apt clean
apt autoremove --purge -y
journalctl --disk-usage
journalctl --vacuum-size=200M

apt autoremove کرنل‌های قدیمی را هم پاک می‌کند. ژورنال systemd همان چیزی است که همه را غافلگیر می‌کند — اگر رهایش کنید می‌تواند تا چند گیگابایت بزرگ شود. برای محدود کردن دائمی‌اش، SystemMaxUse=200M را در /etc/systemd/journald.conf تنظیم کنید و systemctl restart systemd-journald را اجرا کنید.

۴. باقی‌مانده‌های Docker

اگر Docker دارید، اول این‌جا را ببینید. ایمیج‌های قدیمی و کش بیلد با هر دیپلوی روی هم جمع می‌شوند:

docker system df
docker image prune -a
docker builder prune

docker image prune -a ایمیج‌هایی را که هیچ کانتینر در حال اجرایی استفاده نمی‌کند حذف می‌کند. معمولاً همین را می‌خواهید، اما دیپلوی بعدی دوباره دانلودشان می‌کند.

خطرناکش docker system prune -a --volumes است. ولوم‌ها داده‌های شما را نگه می‌دارند، و ولومی که به یک کانتینر متوقف وصل است بلااستفاده حساب می‌شود. آدم‌ها این‌طوری پایگاه داده‌شان را از دست می‌دهند. این را از جواب یک انجمن کپی نکنید.

مصرف‌کننده‌ی پنهان دیگر، لاگ کانتینرهاست. در /etc/docker/daemon.json محدودشان کنید:

{
  "log-driver": "json-file",
  "log-opts": { "max-size": "10m", "max-file": "3" }
}

بعد Docker را ری‌استارت کنید. این محدودیت فقط روی کانتینرهایی اعمال می‌شود که بعداً ساخته می‌شوند، پس کانتینرهای پرسروصدا را با docker compose up -d --force-recreate دوباره بسازید.

۵. لاگ‌ها و فایل‌های فراموش‌شده

فایل‌های بزرگ را در هر جای دیسک پیدا کنید:

find / -xdev -type f -size +500M -exec ls -lh {} + 2>/dev/null
find /var/log -type f -size +100M -exec ls -lh {} + 2>/dev/null

یافته‌های همیشگی: یک backup.tar.gz مال شش ماه پیش در /root، یک دامپ پایگاه داده که کسی می‌خواست دانلودش کند، لاگ برنامه‌ای که هیچ‌وقت چرخانده نمی‌شود.

لاگی را که یک سرویس هنوز در آن می‌نویسد با rm پاک نکنید — خالی‌اش کنید:

truncate -s 0 /var/log/myapp/app.log

اگر قبلاً یکی را پاک کرده‌اید و فضا برنگشته، پردازه‌ای هنوز بازش نگه داشته:

lsof +L1

سرویسی را که آن‌جا فهرست شده ری‌استارت کنید و فضا برمی‌گردد.

وقتی پاک‌سازی کافی نیست

گاهی داده‌ها واقعاً لازم‌اند — پایگاه داده‌ای که بزرگ می‌شود، فایل‌های کاربران، یک فایل مدل. آن‌وقت راه‌حل صادقانه دیسک بیشتر است. ارتقای پلن دیسک را در جای خودش بزرگ می‌کند و همه چیز را نگه می‌دارد: Nano ۱۵ گیگابایت، Micro ۲۵ گیگابایت، Small ۳۵ گیگابایت و Medium ۴۵ گیگابایت دارد. سرور یک بار ری‌استارت می‌شود. جزئیات در مستندات پلن‌ها است.

یک چیز دیگر هم بی‌صدا فضا می‌خورد: فایل swap. اگر راهنمای swap را دنبال کرده‌اید، آن ۱ تا ۲ گیگابایت عمداً کنار گذاشته شده. و اگر بزرگ‌ترین مصرف‌کننده Docker است، راهنمای نصب Docker و راهنمای استک‌های Compose نشان می‌دهند چطور ایمیج‌ها را کنترل کنید.

عادتی که جلوی همه‌ی این‌ها را می‌گیرد: ژورنال و لاگ‌های Docker را از روز اول محدود کنید. دو خط تنظیمات، و «دیسک پر است» تقریباً دیگر اتفاق نمی‌افتد.

پرسش‌های متداول

آیا اجرای 'docker system prune -a' امن است؟

کانتینرهای متوقف، شبکه‌های بلااستفاده، کش بیلد بی‌صاحب و هر ایمیجی را که هیچ کانتینر در حال اجرایی از آن استفاده نمی‌کند حذف می‌کند. داده‌های شما می‌مانند، مگر اینکه --volumes را اضافه کنید. با --volumes، ولوم‌های بلااستفاده هم پاک می‌شوند — و ولوم یک کانتینر پایگاه داده‌ی متوقف، بلااستفاده حساب می‌شود. اگر مطمئن نیستید این گزینه را نزنید.

یک فایل لاگ بزرگ را پاک کردم ولی df هنوز دیسک را پر نشان می‌دهد. چرا؟

یک پردازه‌ی در حال اجرا هنوز فایل را باز نگه داشته، پس کرنل فضا را آزاد نمی‌کند. با 'lsof +L1' پیدایش کنید و آن سرویس را ری‌استارت کنید. دفعه‌ی بعد لاگ فعال را به جای حذف، با 'truncate -s 0 file' خالی کنید.

چقدر فضای خالی باید نگه دارم؟

دست‌کم ۱۰ تا ۱۵ درصد. پایگاه‌های داده، به‌روزرسانی بسته‌ها و دانلود ایمیج‌های Docker به فضای موقت نیاز دارند، و دیسکِ ۱۰۰ درصد پر ممکن است وسط نوشتن، پایگاه داده را خراب کند.

می‌توانم بدون نصب مجدد دیسک بیشتری بگیرم؟

بله. ارتقا به پلن بزرگ‌تر، دیسک را در جای خودش بزرگ می‌کند و داده‌ها را نگه می‌دارد — Nano ۱۵ گیگابایت، Micro ۲۵ گیگابایت، Small ۳۵ گیگابایت و Medium ۴۵ گیگابایت دارد. ارتقا سرور را یک بار ری‌استارت می‌کند.

معمولاً چه چیزی یک VPS کوچک را پر می‌کند؟

طبق تجربه‌ی ما: ایمیج‌ها و کش بیلد Docker، ژورنال systemd، لاگ‌های برنامه که کسی آن‌ها را نمی‌چرخاند، و دامپ‌های پایگاه داده یا آرشیوهای پشتیبان فراموش‌شده در /root.

نظرات

هنوز نظری نیست. اولین نفر باشید.

یک نظر بگذارید

نظرات پیش از نمایش بررسی می‌شوند.