当前位置: 首页 > Linux

记录一次errno.ENOSPEC

时间:2023-04-07 00:18:27 Linux

0x00导致的supervisor启动失败。原因是公司蓝鲸发布线上系统,近期又宕机了。之前搭建这个平台的师兄已经走了,所以我也奉命处理这个问题。只依稀记得那时候老头好像说经常宕机的原因是性能瓶颈,还升级了一次ECS配置,所以我第一反应是机器性能瓶颈,但是东西没那么简单。0x01分析1.现象分析和排除的过程我觉得和看病很像,所以首先要做的就是看现象。当时的现象是nginx返回了502码,根据502码的意思和之前的经验,我立马想到是后台服务宕机了,接下来查看确实是这样.那么接下来就是启动后端程序服务了。2.资料查找由于我从来没有接触过蓝鲸的发布平台,所以第一次发现是找官方文档,而不是直接操作飞梭。这是我这几年探索的。很重要的一点。查阅了官方资料,大概对蓝鲸的软件架构有了一个清晰的认识,了解到蓝鲸的主要服务都是由supervisor托管的,接下来就是启动这些服务了。3、故障排除Supervisor和systemd是Linux上使用最多的两个进程管理系统,我对它们也比较熟悉,所以当我尝试启动supervisord时,报错:Error:CannotopenanHTTPserver:socket。errorreportederrno.ENOSPC(28)看到这个错误的时候,和所有程序员一样,先把错误代码复制下来,然后在google里搜索,看看有没有结果。..不过我并没有犯和我一样的错误,只好去查看supervisor的官方文档,里面没有详细解释。然后又查了一些英文资料,也没有头绪。我开始感到有点焦虑。幸运的是,我明白越是解决问题,就越要冷静。像无头鸡一样飞来飞去,一点作用都没有。于是仔细阅读了报错信息的每一个字,最后觉得弄清楚错误码errno.ENOSPC(28)才是关键,于是转而搜索这条报错信息。原来这个错误在Node.js中是nospaceleftondevice(设备上没有剩余空间),那么在supervisor中可能也是类似的,顿时恍然大悟,接下来就去查一下磁盘空间。磁盘空间仍然相当充足,我又一次感到困惑。..这时突然想起不久前看过的一篇介绍Linux文件系统的文章(说明平时技术的积累也很重要)。文章说用文件系统格式化磁盘时,会分成三部分。两个存储区,即:superblock,用于存储整个文件系统的状态索引节点区,用于存储索引节点数据块区,用于存储文件数据。既然/dev/vdb1的数据块区是空闲的,那么索引节点还空闲吗?执行df-hi查看/dev/vdb1的IFree为0,再到/data目录下查找,发现有很多历史遗留的日志文件,真相大白。4、蓝鲸进程启动失败的原因是/dev/vdb1块设备上的索引节点被大量的日志占用,而之前的日志清理脚本并没有完全清理日志,所以有时候服务不可用。0x02解决找到问题原因后,我可以做两种解决方案:增加/dev/vdb1的索引节点,定期删除/dev/vdb1的日志。查阅资料后发现第一种方法需要重新格式化blockDevices是否要增加inode数量?要么完全增加磁盘容量(指南:增加VMware磁盘大小(VMDK)LVM),要么使用mkfs.ext4-i重新格式化磁盘以手动覆盖每个inode的字节数比率。所以这种方法是不能接受的。那我只能用定时删除日志的方法了。我写了一个crontab脚本来执行定时任务。至此,问题已经彻底解决。重要的是,我总结了排错的要点:根据现象分析问题,不要凭直觉入手,不要直奔梭子,做任何事情之前先看文档,大部分问题描述文件有问题,很正常,不要着急,冷静分析一下平时积累的很多技术,可能现在用不到,但是到时候总会有用的0x04Linux(如何在Linux上增加inode)