บางทีเวลาทำงานบนเซิร์ฟเวอร์ เราอยากรู้ว่าแต่ละโฟลเดอร์ใช้พื้นที่ไปเท่าไหร่ เช่น ไฟล์ที่ผู้ใช้ upload เข้ามาในเว็บเรากินพื้นที่ไปแล้วเท่าไหร่ บน Linux มีคำสั่ง du (disk usage) ให้เช็คได้เลย คำสั่งในโพสต์นี้ใช้ได้กับ Ubuntu และ Linux ตัวอื่น ส่วนบน macOS ใช้ได้เกือบทั้งหมด ต่างกันแค่จุดเดียวซึ่งมีบอกไว้ด้านล่าง
ดูขนาดรวมของโฟลเดอร์ด้วย du -sh
du -sh .
-s(summarize) แสดงแค่ขนาดรวมของโฟลเดอร์-h(human readable) แสดงขนาดแบบคนอ่านรู้เรื่อง เช่น140Mแทน143260ที่เป็นกิโลไบต์
ถ้าไม่ใส่ -s คำสั่งจะ list ทุกโฟลเดอร์ย่อยข้างในออกมาหมด ถ้ามีโฟลเดอร์อย่าง vendor หรือ node_modules ก็ยาวเป็นหน้า ๆ เลย 😅
ผลลัพธ์ประมาณนี้
8.1G .
จะดูโฟลเดอร์อื่นก็ใส่ path แทน . เช่น du -sh storage/app หรือดูหลายโฟลเดอร์พร้อมกันก็ได้ เช่น du -sh storage vendor node_modules
ดูว่าโฟลเดอร์ย่อยไหนใหญ่ด้วย --max-depth
ขนาดรวมยังไม่บอกว่าโฟลเดอร์ย่อยไหนกินพื้นที่ ใส่ --max-depth (หรือ -d) เพื่อบอกว่าจะให้ list ลงไปกี่ชั้น แล้วส่งต่อให้ sort -h เรียงจากเล็กไปใหญ่ ตัวที่ใหญ่ที่สุดจะอยู่ล่างสุด อ่านง่ายกว่าเยอะ
du -h --max-depth=1 | sort -h
24K ./routes
40K ./tests
56K ./misc
156K ./config
216K ./lang
244K ./bootstrap
884K ./app
7.4M ./resources
45M ./node_modules
104M ./vendor
226M ./storage
634M ./.git
2.3G ./public
4.9G ./database
8.1G .
ทีนี้ก็เห็นชัดว่าในโปรเจกต์นี้ database กับ public ใช้พื้นที่มากที่สุด แล้วค่อย cd เข้าไปสั่งคำสั่งเดิมซ้ำ ไล่ลงไปทีละชั้นจนเจอตัวการ
ดูพื้นที่ที่เหลือทั้งดิสก์ด้วย df -h
du บอกว่าโฟลเดอร์ใช้ไปเท่าไหร่ ส่วน df บอกว่าดิสก์แต่ละลูกมีเท่าไหร่ ใช้ไปเท่าไหร่ และเหลือเท่าไหร่
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 79G 71G 8.0G 90% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
ดูแถวที่ Mounted on เป็น / ถ้า Use% ขึ้นไปถึง 90% ก็ถึงเวลาไล่หาว่าอะไรกินพื้นที่แล้ว
ไล่หาว่าอะไรทำดิสก์ VPS เต็ม
เริ่มจาก root ของเครื่อง ใช้ sudo เพราะหลายโฟลเดอร์ user ทั่วไปอ่านไม่ได้
sudo du -xh -d 1 / 2>/dev/null | sort -h
-x ให้ du นับแค่ดิสก์ลูกเดียวกับ / ไม่ข้ามไปนับดิสก์ที่ mount เพิ่ม ส่วน 2>/dev/null ซ่อนข้อความ error ของโฟลเดอร์ที่อ่านไม่ได้ จากนั้นก็ไล่ลงไปทีละชั้นเหมือนเดิม
บนเซิร์ฟเวอร์ที่รันเว็บ Laravel ลองดูที่พวกนี้ก่อน
-
/var/lib/mysqlถ้าในนั้นมีไฟล์binlog.000xxxเยอะ ๆ นั่นคือ binary log ของ MySQL อ่านวิธีลบอย่างปลอดภัยได้ใน ไฟล์ binlog ใน MySQL กินพื้นที่ดิสก์ ลบยังไง ห้ามลบไฟล์พวกนี้ด้วยrmเอง -
storage/logsของ Laravel ถ้าใช้ log channel แบบsingleไฟล์laravel.logจะโตไปเรื่อย ๆ ไม่มีวันหยุด เปลี่ยนเป็นแบบdailyใน.envให้ Laravel ขึ้นไฟล์ใหม่ทุกวันและลบไฟล์ที่เก่ากว่าจำนวนวันที่ตั้งไว้ (เอกสาร Laravel)LOG_STACK=daily LOG_DAILY_DAYS=14 -
/var/logโดยเฉพาะ log ของ systemd ดูขนาดด้วยjournalctl --disk-usageแล้วลดลงด้วยsudo journalctl --vacuum-size=500M
ถ้าไล่ด้วย du แล้วเหนื่อย ลองติดตั้ง ncdu (sudo apt install ncdu) แล้วสั่ง sudo ncdu -x / จะได้หน้าจอที่เรียงโฟลเดอร์จากใหญ่ไปเล็ก กดลูกศรเข้าออกโฟลเดอร์ได้เลย
ดูขนาดไฟล์ทีละไฟล์ด้วย ls -lh
du เหมาะกับโฟลเดอร์ ถ้าอยากเห็นขนาดของแต่ละไฟล์ในโฟลเดอร์ ใช้ ls -lh ใส่ -S เพิ่มให้เรียงไฟล์ใหญ่ขึ้นก่อน
ls -lhS storage/logs



