我有一个 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 与此无关,但我的解决方法与此相关:
- 停止 qmail 的服务
- 我无法下载句柄由于超额配额制度,所以我不得不
- 提取并上传脚本到另一个网站,
- 用以下命令删除队列:
- 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 在这里. 参数可能是“主要的”,“次要的”,或“辅助的”。
如果您发现无法减少held
VPS 所达到的限制数量,您应该联系您的托管服务提供商以获得进一步的帮助。
根据哪些 bean 达到最大值,这个答案可以进行很大程度的扩展,因为达到不同的限制会导致不同的症状。
原因:达到后限制降低
关于/proc/user_beancounters
或df -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 和磁盘块数。
尝试运行quota
和quota -g
(或者,您可以运行repquota -u
和repqouta -g
)以查看您的用户是否以这种方式受到限制以及如何限制。如果是,您可以使用编辑这些配额edquota
或使用命令将其关闭quotaoff
。您可能需要以 root 身份登录,具体取决于您的设置。
本网站涵盖了一些如何使用配额的示例,还包含指向有用命令的手册页的链接。