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

Ber*_*ala 9 linux parallels inode quota

我有一个 VPS。它由臭名昭著的 plesk 管理。

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

user@machine:~$ echo aaa > /tmp/aaa
-bash: /tmp/aaa: Disk quota exceeded
Run Code Online (Sandbox Code Playgroud)

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

user@machine:~$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/vzfs             100G   24G   77G  24% /
Run Code Online (Sandbox Code Playgroud)

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

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

出了什么问题?以及如何修复它?

解决方案!

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

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

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

我进一步探索并发现 qmail 的队列中充满了 inode(它充满了一些黑客的尝试使用我的机器发送垃圾邮件,以及失败回复)

修复 qmail 在这里不相关,但我的解决方法是相关的:

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

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

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

Del*_*tik 15

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

原因:索引节点不足(最常见)

在与数百名无法创建文件的 Virtuozzo VPS 客户合作多年后,即使似乎有足够的可用空间,他们中的绝大多数人也达到了 inode 限制。运行此命令以查看 inode 分配 ( Inodes)、已使用 inode ( IUsed)、剩余 inode ( IFree) 和已使用 inode 百分比 ( IUse%):

df -i
Run Code Online (Sandbox Code Playgroud)

100% 的 inode 使用率经常发生。我的经验中的常见原因:

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

故障排除

如果您发现 inode 不足或不足,但不知道大多数 inode 在哪里,我有这个 Bash one-liner 可以搜索当前目录并在文件夹深度为 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
Run Code Online (Sandbox Code Playgroud)

您可以不断更改当前工作目录,/直到您找到用完 inode 分配的罪魁祸首。

解释

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

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

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

原因:其他 Virtuozzo 限制

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

cat /proc/user_beancounters
Run Code Online (Sandbox Code Playgroud)

故障排除

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

您可以在此处查看 OpenVZ 维基每个参数。参数可以是“主要的”、“次要的”或“辅助的”。

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

这个答案可以根据哪些豆子被最大化而扩展很多,因为达到的不同限制会导致不同的症状。

原因:被击中后限制减少

关于/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 经验的超级用户的知识背道而驰,这会导致误导建议(例如另一个例子)。

故障排除

请联系您的托管服务提供商。向他们展示您的发现并与他们合作,让您持有的豆子低于限制。

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

解释

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

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

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

一个疏忽的 Virtuozzo 管理员不会通知您这一变化,这就是为什么如果您发生这种情况,您应该联系您的托管服务提供商。


Ada*_*lee 5

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

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

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

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