今天上服务器是下载文件时系统提示“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脚本运行。结束掉这个进程问题就解决了!
发表评论