kavin

Linux下报错No space left on device的排查与处理方法

kavin linux 2018-05-27 5486浏览 0

今天上服务器是下载文件时系统提示No space left on device使用tab补全命令的时候同样会提示这个错误。

猜想一、磁盘空间占满,我们删除点文件看下效果。

# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 29G 29G 0 100% /
udev  10M 0 10M 0% /dev
tmpfs  101M 232K 100M 1% /run
tmpfs  5.0M 0 5.0M 0% /run/lock
tmpfs  405M 0 405M 0% /run/shm

看到这里,我以为磁盘真的被 100% 占用了,于是就查看了各目录的占用情况:

# du -sh /*
8.8M /bin
30M /boot
0 /dev
5.3M /etc
24K /home
0 /initrd.img
205M /lib
4.0K /lib64
16K /lost+found
8.0K /media
4.0K /mnt
4.0K /opt
0 /proc
2.5G /root
232K /run
5.2M /sbin
8.0K /srv
0 /sys
4.0K /tmp
2.6G /usr
1.8G /var
0 /vmlinuz

很明显,总共的磁盘占用完全不到 10G,磁盘理论上并未被占满。

猜想二、可能是很多小文件导致inode 急剧增加消耗完了inode 区域的空间如果确实是这样即使磁盘没有满也是会出现这个错误,因为无法创建新的inode来存储文件的元信息。

同样用df来检测下:

# df -ih
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/vda1 1.9M 299K 1.6M 17% /
udev  123K 299 123K 1% /dev
tmpfs  126K 249 125K 1% /run
tmpfs  126K 4 126K 1% /run/lock
tmpfs  126K 2 126K 1% /run/shm

可以看到,inode 区域只被占用了一小部分,还有大量的空间未使用,所以也不是 inode 区域被占满的问题。

猜想三、可能有些文件在删除时占用了进程,但这些文件并没有真正的被删除,只是被标记为deleted状态,只有结束进程才会真正删除文件

我们先用lsop命令看下进程占用的文件:

# lsof | grep deleted
mysqld 1952 2982 mysql 5u REG  254,1  0 127 /tmp/ibzMEe4z (deleted)
apache2 2869  root 9u REG  254,1  0 168 /tmp/.ZendSem.2w14iv (deleted)
(显示太多此处忽略)...
python 3102  root 1w REG  254,1 22412342132 264070 /var/log/nohup.out (deleted)

发现确实是这个原因导致,有个python脚本运行。结束掉这个进程问题就解决了!

 


继续浏览有关 Linux报错 的文章
发表评论