Linux服务器硬盘空间不足无法写入,硬盘还有剩余,原来是Inodes惹的祸!

Ubuntu系统当你遇到硬盘空间不足无法写入的问题

服务器中,即使硬盘空间看起来还有剩余,但仍可能遇到文件的情况。这通常是由于 已用完导致的。

当遇到硬盘无法写入而还有剩余时,很可能是 inodes 用尽导致。可以通过清理小文件、调整或归档存储等方法解决问题,同时配合监控和优化设计来避免类似问题再次发生。

Linux服务器硬盘空间不足无法写入,硬盘还有剩余,原来是Inodes惹的祸!-1

什么是 inodes?

inodes 是文件系统中的数据结构,用于存储文件的元信息(例如、所有者、创建时间等)。
每个文件都会占用一个 inode,无论文件的大小是多少。如果 inodes 耗尽,即使硬盘还有,也无法创建新的文件。

如何检查硬盘和 inodes 使用情况?

检查磁盘空间

df -h

这会显示硬盘的使用情况(以人类可读的格式)。

检查 inodes 使用情况

df -i

输出示例:

Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 1000000 999999 1 100% /

IUse% 表示 inodes 的使用率,如果 IUse% 达到 100%,说明 inodes 已耗尽。

  • 小文件过多,大量小文件会消耗大量 inodes,特别是文件、临时文件等。
  • 文件系统类型,某些文件系统(如 ext4)在创建时会固定分配 inodes 数量,无法动态调整。
  • 应用问题,应用程序可能不断生成小文件,导致 inodes 被迅速耗尽。

inodes 占用 100%的解决方法

首先删除系统的日志文件

sudo rm -rf /var/log/*.log

删除系统日志文件后,发现inodes 的使用率依旧是100%或者只减少了一点点,这时,需要查明在系统中哪些目录文件占用过大。

一般在Linux中,/home存放的是网站程序文件,系统程序文件一般在/var目录中。

下面排查一下哪些目录占用过大,查看一下根目录下文件夹大小,按大小排序。

du -h --max-depth=1 / | sort -hr

按目录大小进一步排查在var目录中哪些目录占用文件大,按照这个方法,排查其它目录。

du -h --max-depth=1 /var | sort -hr

在排查过程中,发现 /usr/local/lsws/logs 占用了9.4G,进入目录中看到一个 auditmodsec.log 文件就占用了差不多8G

auditmodsec.log 是 的审计日志文件,记录了触发安全规则的 HTTP 请求及其响应数据。

继续排查 发现 /var/lib/lsphp/session/lsphp83 目录占用空间过大,而且文件数量过多。

/var/lib/lsphp/session/lsphp83 目录是与 PHP (lsphp) 会话相关的存储目录。这个目录通常与 LSAPI (LiteSpeed SAPI) 相关,它是 LiteSpeed Web Server 用来处理 PHP 脚本的 API。

/var/lib/lsphp/session是LiteSpeed PHP 会话文件存放的目录。PHP 会话文件在这里存储并按会话 ID 命名。

如果会话目录中的文件过多或过大,可能会导致存储空间不足问题。定期清理无效的会话文件。

上面提到的inodes占用100%。大多就是这个目录的问题,由于/var/lib/lsphp/session文件夹内的文件数量巨大,导致inodes占用100%,硬盘无法写入文件,除了硬盘满了之外还有一个就是inodes占用100%

这两种问题都会导致硬盘无法写入内容,当硬盘无法写入文件后,web或者数据库在运行过程中都需要写入临时文件。无法写入临时文件会导致网站瘫痪,数据库瘫痪等等问题。

清理和管理会话文件

可以使用 cron 定期清理过期的会话文件,防止目录占用过多空间。通常,过期会话文件会根据系统设置自动清理,或者可以通过设置 session.gc_maxlifetime 来控制。

首先在php的中启用回收管理。

在 PHP 中,Session 垃圾回收 (Garbage Collection, GC) 是用于清理过期会话数据的机制。根据你的环境需求(例如开发环境、高流量生产服务器等),可以对 session.gc_probability、session.gc_divisor 和 session.gc_maxlifetime 做出优化配置。

以下是 启用回收的最佳设置建议,具体视你的实际场景而定。

关键参数优化解释

session.gc_probability

作用: 控制每次会话初始化时触发垃圾回收的概率。
推荐设置:
开发环境: 1,便于频繁清理会话数据以减少调试干扰。
生产环境: 1,确保垃圾回收机制开启。

session.gc_divisor

作用: 与 session.gc_probability 一起决定垃圾回收的触发概率。垃圾回收的概率公式为:
复制代码
垃圾回收概率 = gc_probability / gc_divisor
推荐设置:
开发环境: 100(即 1/100 的概率触发垃圾回收)。
高流量生产环境: 1000(即 1/1000 的概率触发垃圾回收,降低性能开销)。

session.gc_maxlifetime

作用: 设置会话文件的最大存活时间(秒)。超过此时间未使用的会话将被视为“垃圾”。
推荐设置:
开发环境: 根据需要调整,通常设置较短时间(如 1440 秒 = 24 分钟)。
生产环境: 较长时间,根据应用需求和用户习惯设置。
例如:
普通电商平台:3600(1 小时)
企业后台系统:7200(2 小时)或更高,如 14400(4 小时)。

; 启用垃圾回收机制,生产环境推荐设置
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 14400 ; 设置为 4 小时,根据业务需求可调整

或者使用 cron 作业或其他工具定期清理会话数据,而非依赖 PHP 的垃圾回收机制

find /var/lib/lsphp/session/lsphp83 -type f -mmin +240 -delete

上述命令清理最后修改时间超过 240 分钟的会话文件。

好了,到这里系统遇到无法写入的问题就已经解决完了!

评分

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注