生產(chǎn)上的 Linux 服務(wù)器磁盤空間不足,后面排查得知是某個(gè)應(yīng)用頻繁寫 log 導(dǎo)致总寒。于是加了一條自動(dòng)清理過期日志的 crontab 糕簿。
具體的排查過程記錄如下,都是很基礎(chǔ)的命令埃唯。
一、df
df -h
命令查看當(dāng)前磁盤空間的使用情況:
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 50G 50G 0G 100% /
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 24K 3.9G 1% /dev/shm
tmpfs 3.9G 476K 3.9G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
tmpfs 783M 0 783M 0% /run/user/0
系統(tǒng)只有一個(gè)磁盤分區(qū) /dev/vda1
鹰晨,大小為 50G墨叛,已掛載到根目錄下,用量為 100%模蜡,確實(shí)沒有剩余空間漠趁。
以此可斷定并非存在分區(qū)劃分不合理的情況。比如磁盤大部分容量分配給了其他分區(qū)忍疾,掛載到諸如 /home
闯传、/usr
等目錄下導(dǎo)致 /
路徑下沒有足夠的空間。
二卤妒、lsblk
lsblk
命令查看硬盤的分區(qū)與掛載點(diǎn):
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 37M 0 rom
vda 253:0 0 50G 0 disk
`-vda1 253:1 0 50G 0 part /
當(dāng)前只有一塊硬盤 vda
甥绿,大小為 50G,全部分配給了唯一的分區(qū) vda1
则披,不存在剩余空間妹窖。
此處可以確定硬盤的所有容量都已被分配使用。不存在剩余空間(未分配區(qū)域)或者因?yàn)?LVM 卷導(dǎo)致仍有空閑存儲(chǔ)未被使用等情況收叶。
三、du
du
命令統(tǒng)計(jì)文件和目錄占用的磁盤空間大小共苛。
du
命令默認(rèn)會(huì)以遞歸的方式輸出當(dāng)前路徑中包含的所有文件的大信忻弧(以目錄為單位顯示),信息量有時(shí)會(huì)比較龐大隅茎。
可以使用 -s
選項(xiàng)獲取當(dāng)前目錄下所有文件的大小總和澄峰。或者使用 -d
選項(xiàng)指定遍歷的深度辟犀,即只統(tǒng)計(jì)到某一層目錄而無需展開到更深層的子目錄俏竞。
當(dāng)前 Linux 服務(wù)器上的應(yīng)用都部署在某個(gè)特定的路徑下,因此切換到該目錄并統(tǒng)計(jì)其中文件占用的磁盤空間大小總和:
# du -sh
12G .
通過 -d
選項(xiàng)指定遍歷的層數(shù)為 1,顯示當(dāng)前路徑下包含的每一個(gè)子目錄各自占用的磁盤空間總和:
# du -hd1
80K ./work
7.6M ./lib
12G ./logs
236K ./conf
4.0K ./temp
221M ./webapps
15M ./backup
860K ./bin
12G .
可以看到 logs
子目錄下的文件總共占用了 12G 存儲(chǔ)空間魂毁,幾乎與整個(gè)目錄大小相當(dāng)玻佩。因此基本可以確定 logs
目錄為需要進(jìn)一步排查的對(duì)象。
PS:如當(dāng)前路徑下子目錄眾多席楚,也可以使用 sort
命令對(duì)輸出結(jié)果按大小進(jìn)行排序咬崔。
# du -d1 | sort -nr
12448764 .
12199320 ./logs
225988 ./webapps
14432 ./backup
7736 ./lib
860 ./bin
236 ./conf
80 ./work
4 ./temp
sort
命令的 -n
選項(xiàng)表示以數(shù)字大小為排序依據(jù),-r
則表示逆序輸出排序結(jié)果烦秩。
du
命令去掉 -h
選項(xiàng)則避免將文件大锌逅埂(bytes)自動(dòng)轉(zhuǎn)換為 KB、MB只祠、GB 等導(dǎo)致單位不一致兜蠕。可以使用 -k
或 -m
等選項(xiàng)手動(dòng)指定 du
命令的單位抛寝。
四熊杨、ls
ls
命令獲取指定目錄下包含的文件列表(及詳細(xì)信息)。
# ls -Slh logs | head -8
total 12G
-rw-r--r-- 1 tomcat Devops 3.5G Dec 29 01:40 catalina.out
-rw-r----- 1 root root 108M Nov 15 00:00 localhost_access.2019-11-14.log
-rw-r----- 1 root root 107M Nov 22 00:00 localhost_access.2019-11-21.log
-rw-r----- 1 root root 106M Nov 14 00:00 localhost_access.2019-11-13.log
-rw-r----- 1 root root 104M Nov 17 00:00 localhost_access.2019-11-16.log
-rw-r----- 1 root root 104M Nov 23 00:00 localhost_access.2019-11-22.log
-rw-r----- 1 root root 104M Nov 13 00:00 localhost_access.2019-11-12.log
其中 -S
選項(xiàng)用于將輸出結(jié)果按文件大小排序墩剖,-l
選項(xiàng)指定輸出各文件的詳細(xì)信息猴凹。由于 logs
目錄下文件眾多,使用 head -8
篩選前 8 條輸出進(jìn)行顯示岭皂。
此時(shí)即可根據(jù)對(duì)文件大小和功能的判斷手動(dòng)執(zhí)行刪除操作郊霎。
五、find
find
命令篩選指定時(shí)期內(nèi)創(chuàng)建的文件
logs
目錄下每天都會(huì)創(chuàng)建新的日志文件爷绘,導(dǎo)致占用的磁盤空間與日俱增书劝。因此需要定期刪除指定日期以前的舊文件,釋放不必要的空間占用土至。
如刪除當(dāng)前目錄下只在 60 天以前修改過的文件购对,保留最近兩個(gè)月的日志記錄:
# find . -mtime +60 -type f -exec rm {} \;
將該命令添加到 crontab
中,設(shè)置好定時(shí)規(guī)則陶因,即可定期執(zhí)行清理任務(wù)骡苞,避免過高的磁盤占用。
命令總結(jié)
-
du -h
:查看當(dāng)前系統(tǒng)中磁盤空間的使用情況 -
lsblk
:查看當(dāng)前系統(tǒng)中磁盤的分區(qū)和掛載情況 -
du -hd1
:查看當(dāng)前目錄下各子目錄分別占用的磁盤空間大小 -
ls -Slh | head -8
:列出當(dāng)前目錄下所有文件的詳細(xì)信息楷扬,結(jié)果由大到小排序解幽,輸出前 8 條 -
find . -mtime +60 -type f -exec rm {} \;
:查找當(dāng)前目錄下所有 60 天之前修改過的文件并刪除