如何找出我在 Amazon EC2 上的存储空间已满的原因? [关闭]

Posted

技术标签:

【中文标题】如何找出我在 Amazon EC2 上的存储空间已满的原因? [关闭]【英文标题】:How can I find out why my storage space on Amazon EC2 is full? [closed] 【发布时间】:2013-11-30 15:33:08 【问题描述】:

当我在我的 Amazon EC2 服务器上运行 df -h 时,输出如下:

[ec2-user@ip-XXXX ~]$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/xvda1             25G   25G     0 100% /
tmpfs                 4.0G     0  4.0G   0% /dev/shm

由于某种原因,有些东西占用了我的存储空间。

我正在尝试查找所有大文件/文件夹 这就是我得到的回报:

[ec2-user@ip-XXXX ~]$ sudo du -a / | sort -n -r | head -n 10
993580  /
639296  /usr
237284  /usr/share
217908  /usr/lib
206884  /opt
150236  /opt/app
150232  /opt/app/current
150224  /opt/app/current/[deleted].com
113432  /usr/lib64

我怎样才能知道是什么占用了我的存储空间?

【问题讨论】:

这次事件发生后别忘了设置logroate。 【参考方案1】:

嗯,我认为它的一个(或多个)日志文件变得太大,需要删除/备份。我建议先处理大文件。所以找到所有大于10 MB的文件(10MB是足够大的文件大小,1MB同样可以选择+1M)

sudo find / -type f -size +10M -exec ls -lh  \;

现在您可以确定是哪些问题造成了问题并相应地进行处理。

至于你原来的du -a / | sort -n -r | head -n 10 命令,因为它是按大小排序的,所以它不起作用,因此,一个大文件的所有祖先目录都会向上金字塔,而单个文件很可能会被遗漏。

注意:在您找到的文件所在位置注意到类似的其他日志文件/二进制文件的出现应该很简单,因此作为建议,在包含要清理的原始文件的目录中执行cd更多同类文件。您还可以使用命令对大小大于1MB next 的文件进行迭代,依此类推。

【讨论】:

【参考方案2】:

如果您找不到任何巨大的文件,杀死一些进程可能会解决问题(它对我有用,阅读完整答案以了解原因)

之前:

/dev/xvda1 8256952 7837552 0 100% /

现在

/dev/xvda18256952 1062780 6774744 14% /

原因: 如果您对当前由任何进程打开的文件执行rm <filename>,它不会删除该文件,并且该进程仍可能正在写入该文件。 find 命令找不到这些ghost文件,也无法删除。使用此命令找出哪些进程正在使用已删除的文件:

lsof +L1

杀死进程以释放文件。有时很难杀死所有使用该文件的进程。尝试重新启动系统(我感觉不太好,但这是一个快速的解决方案,确保没有进程使用已删除的文件)

阅读: https://serverfault.com/questions/232525/df-in-linux-not-showing-correct-free-space-after-file-removal/232526

【讨论】:

由于某种原因,我的实例今天空间不足,我重新启动后,它的使用率从 100% 变为 24%。我们知道这其中的原因吗?我不希望它在生产中发生,因为这会导致真正的问题! 我再也没有遇到过这个问题。我认为这是内存泄漏或服务器日志(我没有重定向到文件) 啊,就我而言,原来它是一个巨大的日志文件 (6gb)。修复!干杯! 也为我修复了,谢谢。 我的 sql server 即使在清理了一些空间后也无法连接。重新启动实例可以解决问题并清理空间。我看到错误 ERROR 2003 (HY000): Can't connect to mysql server on '127.0.0.1' (2) while trying to connect to mysql。非常感谢您的回答【参考方案3】:

/,键入du -hs *root

$ sudo su -
cd /; du -hs *

您将看到所有文件夹的完整大小并确定较大的文件夹。

【讨论】:

这个对故障排除很有帮助。但有时当您进入子目录并再次运行命令时,数字不会相加。【参考方案4】:

这个空间被邮件通知占用

你可以通过输入来检查它

sudo find / -type f -size +1000M -exec ls -lh  \;

它将显示大于 1000MB 的大文件夹

结果会有一个文件夹

/var/mail/username

您可以通过运行以下命令来释放该空间

> /var/mail/username

注意,大于(>)符号不是提示符,你必须用它运行cmd。

现在检查你的空间可用空间

df -h

现在你有足够的可用空间了,尽情享受吧... :)

【讨论】:

【参考方案5】:

ansh0l 的答案是查找大文件的方法。但是,如果您想查看文件系统中每个目录占用了多少空间,请 cd 到根目录,然后执行 du -k --max-depth='。这将显示根目录中的每个子目录占用了多少空间。当您发现罪魁祸首时,cd 到该目录,然后再次运行相同的命令并重复,直到找到占用所有空间的文件。

【讨论】:

虽然我同意这是一个很好的解决方案,但我认为必须一遍又一遍地迭代没有多大意义。 通常,您要寻找的罪魁祸首不应该太深而无法找到,但如果他们是(并且可能也是如此),请执行简单的 find 然后 cding 进入文件的目录将比手动迭代更有效。 我在不同时间都使用过这两种方法。就像你说的,罪魁祸首通常不是很深,所以使用du 通常只需要几次迭代。如果文件很小,但其中有很多(例如写入单个文件的事务日志记录),则查找大文件的 find 命令将找不到它们。

以上是关于如何找出我在 Amazon EC2 上的存储空间已满的原因? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

从 EC2 实例本地访问 Amazon S3 存储桶

如何通过 Amazon EC2 将 postgresql 数据移动到 Ubuntu 上的另一个目录?

Amazon 实例 Ec2 连接超时

Amazon S3 存储桶策略:如何锁定仅访问您的 EC2 实例

Amazon AWS EC2 已删除密钥被锁定在根目录之外

如何将映像传输到 Amazon EBS 卷以供 EC2 使用?