มันคืออะไรแน่?
เหตุการณ์นี้ปกติก็จะเจอใน 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 นั่นแหละ