เมื่อ du ให้ผลไม่เท่ากับ df

มันคืออะไรแน่?

เหตุการณ์นี้ปกติก็จะเจอใน server เวลาเราลบ file อะไร แล้วมักจะไม่ค่อยได้ที่คืน พอเวลา df ก็จะได้ ค่านึง แต่ du ก็จะได้อีกค่านึง จริงๆ มันเพราะเวลาเราลบ file มันดันยังมี process อ่าน file อยู่ ดังนั้น แม้ file จริงๆ จะหายไปแล้ว แต่พื้นที่นั่นก็ยังถูกคิดว่า ยังถูกใช้อยู่ เช่น

root@mango:/home/sipp11# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb2       168G  156G  3.3G  98% /data

root@mango:/home/sipp11# du -d 0 /data/ -h
68G /data/

ถ้าสังตอน df มีเหลือแค่ 3.3G ใช้ไปตั้ง 156G แต่ du ดันไม่เห็นอะไร เพราะว่าก็ยังใช้ที่แค่ 68G งานนี้ df ถูกนะ แค่ du อ่านผิด เพราะว่ามันไม่มี file ที่ยังกินที่อยู่นั่น link หายหมดละ

แก้ยังไง?

ง่ายๆ ก็คือ ต้องปิด process หรือ service ที่ยังทำงานอยู่ แต่เราจะหามันยังไง?

# lsof | grep '(deleted)'

แนะนำให้ใช้ root เพื่อจะได้ดูทุกๆ process จริงๆ สิ่งที่จะได้ก็จะประมาณนี้

COMMAND     PID   TID           USER   FD      TYPE             DEVICE    SIZE/OFF       NODE NAME
nodejs      833                 root    1w      REG               8,18 72618341995    4456537 /data/forever/gps/xsense.log.1 (deleted)

nodejs    21839                 root    1w      REG               8,18   994377313    4456541 /data/forever/gps/nakra.log (deleted)
nodejs    21839                 root    2w      REG               8,18   994377313    4456541 /data/forever/gps/nakra.log (deleted)
V8        21839 21840           root    1w      REG               8,18   994377313    4456541 /data/forever/gps/nakra.log (deleted)
V8        21839 21840           root    2w      REG               8,18   994377313    4456541 /data/forever/gps/nakra.log (deleted)
V8        21839 21841           root    1w      REG               8,18   994377313    4456541 /data/forever/gps/nakra.log (deleted)
V8        21839 21841           root    2w      REG               8,18   994377313    4456541 /data/forever/gps/nakra.log (deleted)

จะเห็นได้ว่า process 833 ยังอ่าน file /data/forever/gps/xsense.log.1 ซึ่งมีขนาด 72618341995 หรือ 72G อยู่ ทั้งๆที่ file จริงๆ ถูกลบไปแล้ว สิ่งที่ต้องทำก็คือ kill process นั่นไปซะ

# kill -9 833

บางอันก็จะเป็น process ห้อยตามกันเต็ม ก็ลบแค่ parent มันก็จบ

# kill -9 21839

แล้วก็จะได้พื้นที่คืนเต็มๆ

root@mango:/home/sipp11# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb2       168G   68G   92G  43% /data

แล้วทำไม desktop ไม่ค่อยเจอปัญหานี้?

ก็เพราะว่า เรา reboot เครื่องบ่อยกว่า process พวกนี้มันก็เลยหายไปเองทุกครั้งเวลา restart นั่นแหละ