• 磁盘有空间但无法创建文件


    面试原题

    我们去面试的时候,面试官通常会问一个问题, “小伙子,你在这些年的工作中,遇到过什么棘手的问题没有?

    面试官问这个问题,无非想知道以下几件事情

    1. 你有没有过处理疑难问题的经验
    2. 你解决问题的思路和能力如何
    3. 你是怎么解决的
    4. 你解决完这个问题有哪些收获

    面试错误示范

    面对这样的问题,很多小伙伴手无足措,甚至回答出了让面试官啼笑皆非的答案,我们来看看小王的经历。
    面试官:你遇到过什么棘手的问题?

    小王:遇到过一次宕机事故,数据库宕机。

    面试官: 宕机多久?

    小王:两三天吧

    面试官: 这么长时间,那你是怎么解决的?

    小王:我当时刚到公司,就在旁边看老员工做。

    面试官:那你还记得老员工是怎么解决的吗?

    小王:时间太久了,忘了。

                                                            
    面试者啥也不会的能力,淋漓尽致的展现了出来,让面试官吐血而亡。
    为了解决啥也不会的尴尬,我们今天来聊聊磁盘有空间但是无法创建文件的处理方案。
     

    问题再现

     问题出现,小王今天要往磁盘里创建内检,发现系统提示磁盘不足,使用df -h查看了一下磁盘的使用情况,发现磁盘只使用了90%,还有3G的剩余空间,但是无法创建文件。


    小王的排查思路
    小王查看了一下自己使用的用户是root,之前备份的md5值也没有任何的告警,可以确认服务器没有被黑。
    小王又使用df -h 命令查看下磁盘的可用空间

    1. [root@gaosh-1 ~]# df -h
    2. Filesystem Size Used Avail Use% Mounted on
    3. /dev/sda2 20G 18G 1.9G 90% /
    4. tmpfs 1.8G 228K 1.8G 1% /dev/shm


    小王判断,既然有空间,而且自己也有权限,一定是可以创建文件的,小王突然想起了inode节点问题,是不是inode号不够了。
    毕竟我们创建的任何一个文件都需要消耗一个inode号,我们找个正常机器来测试下inode,看看是不是创建文件的时候消耗inode 号

    可以看到现在的inode -free 有1177557

    可以看到inode消耗了两个,一个文件消耗一个。
    想起了这个原理之后,小王查看了一下自己的/data目录的索引节点,发现inode已经使用百分比了

    1. # df -i
    2. 文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
    3. /data 5242880 5242880 0 100% /

    查找原因
    小王通过排查,发现/data/cache目录中存在数量非常多的小字节缓存文件,占用的Block不多,但是占用了大量的inode。


    解决方案
    解决方案1:删除/data/cache目录中的部分文件,释放出/data分区的一部分inode。

    解决方案2 :在/data备份好一些文件,然后删除这些文件,释放一些inode。然后创建一个文件夹/data/cache2。将/data/cache2 挂载到另外一块硬盘上去,下次写数据就直接写在/data/cache2,事实上就相当于写在第二块硬盘上了。


    提问环节
    磁盘分完区之后,inode号还可以增加吗?
    答,不可以, inode的总数是在格式化的时候就固定下来的。


    融会贯通
    接下来,我们看看,面试遇到面试官问,小伙子,你遇到的最棘手的问题是啥啊,你试着把本文的内容变成你的,讲述给面试官。
    小王:好的,面试官,说到棘手的问题的话,我在上家公司有遇到这么一个问题,有一次一个开发找我请教,说他的磁盘还有空间,但是无法创建文件。
    我查看了一下,当时开发的测试目录剩余空间还有两个G,创建文件自然是绰绰有余的,而且开发用的用户也有在此目录创建文件的权限。
    我试着创建了一下也是不成功, 要创建文件必须满足两个条件,一个是要有足够的磁盘空间,另一个是要有足够的inode号,既然磁盘空间还有,就有可能是inode号不足导致的
    我使用 `df -i `查看了一下,发现开发这台测试机上的inode号已经耗尽了,我询问了一下开发,目录下都是存的什么问题, 开发反馈说是小图片。
    那么真相就浮出水面了,每个小文件占用一个inode号,但是一个小图片占用的空间可能没有达到block的大小,但是占用了一个inode,长久积累下来就变成了 空间还有,但inode号耗尽的情况。
    于是让开发确认了一下哪些是不需要的空间,予以删除,释放空间,同时创建了 data2目录挂载到了一块新硬盘上,扩充了空间。这样问题就解决了。
    总结
    关于棘手问题,再来回顾下遇到这个问题的回答思路

    问题产生时候的情景再现阐述分析问题的过程阐述解决问题的思路阐述如何解决的通过这次棘手问题,你学到了哪些,或者你做了哪些措施来确保后期不再复现。

  • 相关阅读:
    按钮控制LED灯、蜂鸣器、风扇实验
    面试那些事——Java全栈
    DIY操作系统(6):特权级、CPL、DPL、RPL
    c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下))
    电商兴桃,打造乡村振兴新样本
    【无标题】
    Blog搭建:pycharm+虚拟环境+django
    Leetcode2937. 使三个字符串相等
    UDP攻击是什么?
    [oeasy]python0013_ASCII码表_英文字符编码_键盘字符
  • 原文地址:https://blog.csdn.net/qq_36733838/article/details/127863552