写入 /tmp 时“超出磁盘配额”,但空间充足(linux)

写入 /tmp 时“超出磁盘配额”,但空间充足(linux)

我有一个 VPS。它由著名的 Parallels Plesk 管理。

今天我开始看到消息(首先通过 wordpress,但也来自命令行 shell),说:“超出磁盘配额”。

user@machine:~$ echo aaa > /tmp/aaa
-bash: /tmp/aaa: Disk quota exceeded

但是机器上有很多空间,但只有 1 个分区。

user@machine:~$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/vzfs             100G   24G   77G  24% /

我从 /tmp/* 删除了所有文件但仍然如此。

我对“vzfs”一无所知,也许它就是罪魁祸首?

可能出了什么问题?如何解决?

解决方案!

(如果您不使用 Parallels Plesk,请参阅@Adalee 的回答)

请参阅@deltik 的解决方案,与 Parallel 的系统相关,就像我的情况一样。

df -i 立即给出了一个荒谬的 inode 数量:18,446,744,069,620,218,961,这对于 wordpress 网站来说是疯狂的。

我进一步探索,发现 qmail 的队列已满,里面满是 inode(一些黑客试图利用我的机器发送垃圾邮件,导致回复失败)

修复 qmail 与此无关,但我的解决方法与此相关:

  1. 停止 qmail 的服务
  2. 我无法下载句柄由于超额配额制度,所以我不得不
  3. 提取并上传脚本到另一个网站,
  4. 用以下命令删除队列:
  5. perl <(wget -O -http://link.to.my/script.pl)-D

这样,脚本就可以直接从网络运行(这不是一个安全的做法,但我自己把脚本放在那里),并使用命令行选项。

感谢@deltik 了解并及时现场识别出这种特殊设置,并提供进一步诊断的方法!

答案1

您有一个 VZFS 文件系统,这意味着您的 VPS 是 Parallels Virtuozzo 虚拟机。在 Virtuozzo 中,托管提供商可以对许多参数设置限制,包括您使用 VZFS 获得的分配。

原因:Inode 不足(最常见)

多年来,我们与数百名 Virtuozzo VPS 客户合作,他们遇到过无法创建文件的问题,尽管似乎有足够的可用空间,但绝大多数客户都已达到其 inode 限制。运行此命令可查看 inode 分配 ( Inodes)、已使用的 inode ( IUsed)、剩余 inode ( IFree) 以及已使用的 inode 百分比 ( IUse%):

df -i

出现 100% inode 使用率的情况很常见。根据我的经验,常见原因如下:

  • 垃圾邮件退回
  • 出站垃圾邮件排队
  • 存储了大量的入站电子邮件
  • 有些用户将他们的 PHP 会话垃圾收集 ( session.gc_maxlifetime) 设置为超过一百年
  • 常规缓存文件过多
  • WordPress 插件 W3 Total Cache 中启用了对象缓存
  • Magento 错误日志(每个错误都会生成一个新文件)
  • 其他配置不当或设计不当的程序/脚本,会生成一堆文件,然后忘记删除它们

故障排除

如果你发现 inode 数量很少或者用完了,但又不知道大多数 inode 在哪里,我有一个 Bash 单行程序,它可以搜索当前目录并计算文件夹深度为 1 的 inode 数量:

for i in $(find $(pwd) -maxdepth 1 -type d | sort); do echo -e "$(find "$i" | wc -l)\t: $(readlink -f "$i")"; done | sort -nr

您可以继续更改当前工作目录,直到/找到耗尽 inode 分配的罪魁祸首。

解释

您的 VPS 位于 VZFS 文件系统上,它是 Parallels Virtuozzo 的一部分(不是 OpenVZ,它与 VZ 类似且基于相同技术,但 OpenVZ 不会使用 VZFS)。

由于 Virtuozzo 在 VZFS 中存储文件的方式,inode 的限制通常比 ext4 或 XFS 等其他文件系统的限制更严格。主机会跟踪所有这些文件,对于托管服务提供商来说,不让单个 VPS 占用数亿个 inode 是有利的。因此,托管服务提供商可能会将 inode 限制设置为较低,例如 1,000,000 个 inode。

经过多年与数百名在 Virtuozzo 上耗尽 inode 分配的客户合作,这些“神秘的”磁盘配额问题不再让我感到惊讶。

原因:其他 Virtuozzo 限制

我合作过的 Virtuozzo VPS 客户中,只有极少数人遇到了文件系统问题,因为他们遇到了其他限制。您可以使用以下命令查看部分(但不是全部)限制:

cat /proc/user_beancounters

故障排除

如果failcnt列的值大于 0 或held列值等于相应limit值,则表示已达到限制。

您可以查看每个参数的含义OpenVZ 的 wiki 在这里. 参数可能是“主要的”,“次要的”,或“辅助的”。

如果您发现无法减少heldVPS 所达到的限制数量,您应该联系您的托管服务提供商以获得进一步的帮助。

根据哪些 bean 达到最大值,这个答案可以进行很大程度的扩展,因为达到不同的限制会导致不同的症状。

原因:达到后限制降低

关于/proc/user_beancountersdf -i,有时,Virtuozzo 系统管理员可能会将limit参数的降低到低于该held值。

例如,如果该diskinodes参数的原始限制为 1,500,000,并且您达到了该限制,则托管服务提供商的某个人将您的 inode 限制设置为 1,000,000,那么您将看到一个奇怪的 inode 报告,df -i这毫无意义。

在你的终端,你可能会看到一个不合理的大数字,例如 18,446,744,069,620,218,961

我认为这是托管服务提供商的一种险恶行为,特别是如果他们没有通知你,因为你看到的不寻常的值与没有使用 Virtuozzo/OpenVZ 经验的超级用户的知识相悖,从而导致误导性的建议(例子另一个例子)。

故障排除

联系您的托管服务提供商。向他们展示您的发现并与他们合作以使您持有的 bean 低于限制。

如果他们拒绝帮助您,请放弃您的托管服务提供商,并寻找另一个不使用 Virtuozzo/OpenVZ 虚拟化的提供商。KVM 虚拟化、VMware 虚拟化、Xen 虚拟化或裸机服务器受到的限制比 Virtuozzo/OpenVZ 要少得多。

解释

您的托管服务提供商可能正在审核或响应警报,并发现您的 VPS 使用了太多特定资源(几乎总是 inode 限制,这是diskinodes他们那边的参数)。

托管服务提供商的一位缺乏经验的 Virtuozzo 管理员认为,他们可以通过将限制降低到低于实际资源使用量来解决这个问题。就 inode 而言,即使您的实际当前使用量可能更高,如 1,500,000,您的分配也可能较低,如 1,000,000。

Virtuozzo 管理员可以在其控制面板中看到您的实际使用情况和新的限制,但您会看到虚假的数字,由于 Virtuozzo 的虚拟化方式,这些数字可能高得不合理。

疏忽的 Virtuozzo 管理员不会通知您此更改,这就是为什么如果您遇到这种情况,您应该联系您的托管服务提供商。

答案2

“超出磁盘配额”并不意味着您的磁盘上没有可用空间,而是指您不允许使用那么多空间。

一般来说,配额是管理员设置的一些限制 - 您可以运行的最大进程数、您可以占用的空间、您可以拥有的文件数等。可以设置磁盘配额以限制最大 inode 和磁盘块数。

尝试运行quotaquota -g(或者,您可以运行repquota -urepqouta -g)以查看您的用户是否以这种方式受到限制以及如何限制。如果是,您可以使用编辑这些配额edquota或使用命令将其关闭quotaoff。您可能需要以 root 身份登录,具体取决于您的设置。

本网站涵盖了一些如何使用配额的示例,还包含指向有用命令的手册页的链接。

相关内容