# ดิสก์เซิร์ฟเวอร์ Linux เต็ม: ตรวจหาสิ่งที่ใช้พื้นที่

ดิสก์เต็มมักมีสาเหตุที่ชัดเจนหนึ่งหรือสองอย่าง ให้ตรวจจากภาพรวมลงไปทีละระดับ อ่านให้เข้าใจก่อนลบ และอย่าลบไฟล์ใน /var/lib ด้วยตนเอง เว้นแต่จะทราบว่าเซอร์วิสใดเป็นเจ้าของ

## 1. ยืนยันว่าระบบไฟล์ใดเต็ม

รัน df -h แล้วดูคอลัมน์ Use% และ Mounted on ระบบไฟล์ที่เต็มอาจเป็น / หรือจุดเมานต์แยกต่างหาก เช่น /var, /home หรือ /data การล้างผิดที่จะไม่ช่วยแก้ปัญหา
รัน df -i ด้วย ระบบไฟล์อาจมีพื้นที่ว่างแต่ไม่มี inode เหลือ ซึ่งเกิดเมื่อมีไฟล์ขนาดเล็กจำนวนมหาศาลสะสมอยู่ (เซสชัน คิวอีเมล ไฟล์แคช) หาก IUse% ใกล้ 100% แสดงว่าต้องค้นหาไฟล์เล็กจำนวนมาก ไม่ใช่ไฟล์ใหญ่เพียงไม่กี่ไฟล์

## 2. ค้นหาไดเรกทอรีที่ใหญ่ที่สุด

รัน sudo du -xh --max-depth=1 / | sort -h แล้วอ่านบรรทัดท้ายสุด ตัวเลือก -x จะจำกัดอยู่ในระบบไฟล์เดียว ดังนั้นดิสก์ที่เมานต์และระบบไฟล์เสมือนจะไม่ทำให้ผลคลาดเคลื่อน จากนั้นทำซ้ำภายในไดเรกทอรีที่ใหญ่ที่สุด เช่น sudo du -xh --max-depth=1 /var | sort -h
หากติดตั้ง ncdu แล้ว (sudo apt install ncdu บน Debian และ Ubuntu) คำสั่ง sudo ncdu -x / จะช่วยให้เลื่อนดูข้อมูลชุดเดียวกันแบบโต้ตอบได้

## 3. ตรวจหาไฟล์ที่ถูกลบแต่ยังเปิดค้างอยู่

หาก du แสดงค่าน้อยกว่า df มาก อาจมีโปรเซสที่ยังเปิดไฟล์ที่ถูกลบแล้วค้างอยู่ ซึ่งมักเป็นไฟล์ล็อกขนาดใหญ่ sudo lsof +L1 จะแสดงรายการไฟล์ที่เปิดอยู่และมีจำนวนลิงก์เป็นศูนย์ พื้นที่จะถูกคืนเมื่อโปรเซสนั้นปิดไฟล์ ซึ่งโดยปกติหมายถึงการรีสตาร์ตเซอร์วิสที่เป็นเจ้าของไฟล์ ควรทำในช่วงที่ไม่ยุ่ง ไม่ใช่ช่วงที่มีคำขอสูงสุด

## 4. ตรวจสอบสาเหตุที่พบบ่อย

ล็อก: ดูใน /var/log และตรวจสอบ journal ด้วย journalctl --disk-usage หากมีขนาดใหญ่ ดูคู่มือของเราเรื่องการจำกัดขนาด journald
แพ็กเกจ: sudo apt clean จะลบไฟล์แพ็กเกจที่ดาวน์โหลดไว้ ส่วน sudo apt autoremove จะแสดงรายการแพ็กเกจและเคอร์เนลเก่าที่ไม่จำเป็นอีกต่อไป และแสดงสิ่งที่จะลบก่อนที่คุณจะยืนยัน ควรเก็บเคอร์เนลที่กำลังใช้งานและเวอร์ชันก่อนหน้าไว้หนึ่งเวอร์ชัน
Docker: docker system df แสดงอิมเมจ คอนเทนเนอร์ วอลุ่ม และแคชของการสร้าง ส่วน docker system prune จะลบคอนเทนเนอร์ที่หยุดทำงาน เครือข่ายที่ไม่ได้ใช้ และอิมเมจแบบ dangling แต่จะไม่ลบวอลุ่มเว้นแต่จะเพิ่ม --volumes ดังนั้นควรอ่านข้อความที่ปรากฏก่อนตอบ
Snap: snap list --all จะแสดงรีวิชันเก่าของ snap ที่ปิดใช้งานอยู่ ซึ่งลบได้ทีละรายการด้วย snap remove NAME --revision=NUMBER

## 5. หลังจากเพิ่มพื้นที่ว่างแล้ว

รัน df -h อีกครั้ง และตรวจสอบว่าเซอร์วิสที่หยุดทำงานเพราะดิสก์เต็มกลับมาทำงานแล้ว (systemctl --failed) ฐานข้อมูลที่เจอปัญหาดิสก์เต็มอาจต้องรีสตาร์ตหรือตรวจสอบก่อนจะเชื่อถือได้
จากนั้นกำหนดขีดจำกัดเพื่อไม่ให้เกิดซ้ำ ได้แก่ การหมุนเวียนล็อก ขีดจำกัดของ journald และการแจ้งเตือนก่อนดิสก์ถึง 90%

## FAQ

**การลบไฟล์ใน /var/log ปลอดภัยหรือไม่**

ล็อกที่หมุนเวียนและบีบอัดแล้ว (เช่น syslog.1 หรือไฟล์ .gz) มักลบได้เมื่อไม่ต้องการใช้อีก อย่าลบไฟล์ล็อกปัจจุบันของเซอร์วิสที่กำลังทำงาน ให้ตัดเนื้อหาอย่างระมัดระวังหรือปล่อยให้ logrotate จัดการ และตรวจสอบก่อนว่าเซอร์วิสนั้นคาดหวังอะไร

**ทำไม df แสดงว่าดิสก์เต็ม แต่ผลรวมของ du ไม่ตรงกัน**

โดยทั่วไปมีโปรเซสที่กำลังทำงานยังเปิดไฟล์ที่ถูกลบแล้วค้างอยู่ (ดู lsof +L1) หรือตัวเลขมาจากระบบไฟล์คนละระบบ ใช้ du -x และเปรียบเทียบกับ df สำหรับจุดเมานต์เดียวกัน

**ควรรัน docker system prune บนเซิร์ฟเวอร์ production หรือไม่**

ควรทำหลังจากตรวจ docker system df และดูว่าอะไรไม่ได้ใช้งานแล้วเท่านั้น คำสั่งนี้อาจลบอิมเมจที่คุณยังตั้งใจจะเริ่มใช้งาน โดยค่าเริ่มต้นวอลุ่มจะถูกเก็บไว้ แต่ควรตรวจสอบให้แน่ใจว่ามีข้อมูลสำรองของทุกสิ่งที่สำคัญ

Source: https://raincleaner.eu/th/guides/linux-server-disk-full-find-what-is-using-space