最近遇到一個(gè)Linux機(jī)器上Java程序向/tmp文件夾寫入臨時(shí)文件報(bào)錯(cuò)問題,報(bào)錯(cuò)信息如下:
Caused by: java.nio.file.FileSystemException: /tmp/imageio8208234794343042842.tmp: No space left on device
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)
at java.nio.file.Files.newByteChannel(Files.java:361)
at java.nio.file.Files.createFile(Files.java:632)
at java.nio.file.TempFileHelper.create(TempFileHelper.java:138)
at java.nio.file.TempFileHelper.createTempFile(TempFileHelper.java:161)
at java.nio.file.Files.createTempFile(Files.java:897)
at javax.imageio.stream.FileCacheImageInputStream.<init>(FileCacheImageInputStream.java:102)
at com.sun.imageio.spi.InputStreamImageInputStreamSpi.createInputStreamInstance(InputStreamImageInputStreamSpi.java:69)
at javax.imageio.ImageIO.createImageInputStream(ImageIO.java:357)
... 41 more
從報(bào)錯(cuò)信息/tmp/imageio8208234794343042842.tmp: No space left on device字面意思來看應(yīng)該是磁盤空間不足,于是我們通過du -f查看了一下啊磁盤空間的占用情況:
[root@iZ23yaz766kZ ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 40G 24G 14G 63% /
tmpfs 7.8G 0 7.8G 0% /dev/shm
/dev/xvdb1 40G 25G 13G 67% /alidata1
從輸出信息可以看出磁盤空間并沒有滿,還有很多的富裕,而且我們磁盤的空間的使用率是有監(jiān)控的,一旦超過閾值就會(huì)發(fā)送報(bào)警信息,但是我們并沒有收到相應(yīng)的報(bào)警信息,所以可以推斷出不是磁盤空間不足的問題,那到底是什么問題導(dǎo)致報(bào)錯(cuò)呢?
通過查詢資料了解到,除了磁盤空間可能導(dǎo)致無法寫入文件外,還有磁盤的inode數(shù)量也會(huì)影響文件的寫入,當(dāng)inode數(shù)量不足時(shí),也會(huì)導(dǎo)致無法寫入文件,于是通過df -i查看了一下inode的數(shù)量:
[root@iZ23yaz766kZ ~]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/xvda1 2621440 2581440 40000 99% /
tmpfs 2041364 1 2041363 1% /dev/shm
/dev/xvdb1 2621440 230217 2391223 9% /alidata1
從輸出可以看到inode使用的數(shù)量占到了99%,幾乎滿了,從而我們我們推斷很可能是當(dāng)時(shí)的inode數(shù)量不足導(dǎo)致無法向/tmp寫入文件。
解決inode數(shù)量不足的方法有兩種
-
清理inode占用過高的文件和目錄
通過
for i in /*; do echo $i; find $i | wc -l; done統(tǒng)計(jì)了一下每個(gè)文件夾下的inode數(shù)量,找到了占用數(shù)量比較多的文件夾,然后,逐層進(jìn)入inode占用最高的目錄,繼續(xù)執(zhí)行上述指令,逐步定位占用過高空間的文件或目錄,最后進(jìn)行相應(yīng)清理。 -
修改inode的數(shù)量,這種方法需要重新格式化磁盤。具體方法如下:
-
執(zhí)行如下命令,卸載系統(tǒng)文件。
umount /home -
執(zhí)行如下命令,重新建立文件系統(tǒng),指定inode節(jié)點(diǎn)數(shù)。
mkfs.ext3 /dev/xvdb -N 1638400 -
執(zhí)行如下命令,修改fstab文件。
vim /etc/fstab -
執(zhí)行如下命令,查看修改后的inode節(jié)點(diǎn)數(shù)。
dumpe2fs -h /dev/xvdb | grep node
-
我們通過第一種方法清理了一下占用inode數(shù)量比較多的文件解決了該問題。