今天一台配置不错的服务器出现奇葩的问题,上面才上了40多个站,服务器是16H/32G的配置哟,唯一缺点就是硬盘小了点,200多G而已。但是不至于会出现问题啊。
新建站点和绑定域名,都会提示错误[Errno 28] No space left on device,如下图所示:
问题解析
根据上图报错提示,是硬盘不够的,但是我在宝塔面板里看,数据还有很多啊,没满。如下图:
当然我们也可以登录SSH里去查看硬盘的情况。输入命令:
df -h
结果如下:
原因到这个地方,对于一个非专业的服务器维护人员来说,就懵逼了,既然提示“ No space left on device”,但是事实上磁盘有空间啊。于是我疯狂查找答案,最后从一个大佬博客上找到了,是服务器的inodes占满了,对于inodes,估计很多人不知道啥玩意,包括我哈。先说下原因吧,我们可以输入命令:
df -i
去查找服务器的inodes剩下的内存,如下所示:
root@ubuntu:~# df -i Filesystem Inodes IUsed IFree IUse% Mounted on tmpfs 4109141 682 4108459 1% /run /dev/vda2 26212864 146029 26066835 1% / tmpfs 4109141 4 4109137 1% /dev/shm tmpfs 4109141 4 4109137 1% /run/lock /dev/vdb1 13107200 13107200 0 100% /www/wwwroot tmpfs 821828 26 821802 1% /run/user/0
我们发现挂载目录/dev/vdb1内存已经100%了,难怪我们新建什么东西都不行的,原因就这么找到啦。接下来,我们就知道怎么去解决了,清理空间呗。
解决问题的方案
在我们寻找解决方案之前,先跟大家分享下inodes是啥东西吧。
介绍 inodes
理解inode,要从文件储存说起。
文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。
文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。
inode的内容
inode包含文件的元信息,具体来说有以下内容:
-
文件的字节数
-
文件拥有者的User ID
-
文件的Group ID
-
文件的读、写、执行权限
-
文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
-
链接数,即有多少文件名指向这个inode
-
文件数据block的位置
inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。
每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。
查看每个硬盘分区的inode总数和已经使用的数量,可以使用df -i命令。
df -i
查看每个inode节点的大小,可以用如下命令:
sudo dumpe2fs -h /dev/hda | grep "Inode size"
由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。
解决inode内存问题
了解完inode的基础知识后,我们就要去解决我们最开始提到的问题啦。接下来,我们就分享昂的方法,走起!
首先,既然是inode内存不足,说明服务器上的文件太多了,导致问题,这个时候我们可以找运维商扩大内存,去解决,这个对于我们来说不可取。
其次呢,我们对内存不足的磁盘进行分析,去看下是什么东西占用的内存多,然后删除下就好。
我们进入/www/wwwroot,然后看下目录的大小,命令如下:
cd /www/wwwroot du -sh *
上述截图图片不是完整版哈,我们发现的是做泛站的两个目录缓存太高了,我们需要去删除cache目录下的东西。
cd /www/wwwroot/fan_SA.com
然后删除:
rm -rf /www/wwwroot/fan_SA.com/cathe/xxx
等待一会,删除完,我们再去执行df -i 命令后,发现内存下来了。
这个时候,我们再去宝塔上去新建站点和一些操作,发现就没问题啦。
总结
其实关于 inodes 内存问题,也是第一次遇到啊,虽然解决问题的过程有些折腾人,但是结果还是好的。以后还是要多学习下服务器相关的知识点吧。
网友评论文明上网理性发言 已有0人参与
发表评论: