0

我有几个码头集装箱。我正面临存储问题。

当我执行以下命令时,主机(不在 docker 容器中)以测量所有文件的大小

du -sh /

我可以看到总大小是总存储空间的 50%。

当我这样做时

df -h 

我可以看到我有 20% 的可用空间,而我使用了 80%。

我使用 lsof 命令来查找已删除的打开文件,它提到了来自 Docker 容器的许多文件:

lsof -nP | grep '(deleted)'

如何解释差异?我想念 docker 配置的东西?

4

1 回答 1

0

这个问题在 Unix 环境中是一个非常普遍的问题。

在 Unix 中,您可以从文件系统中删除文件,但如果有一个进程仍在该文件上持有打开的文件句柄,则该文件仍存储并保存在磁盘上,只能通过该文件句柄使用。一旦文件句柄被删除(关闭或进程终止),内核将负责从磁盘中删除文件的其余部分并释放磁盘空间。

这样的临时文件会影响 的输出df,但不会出现在du只扫描目录的输出中。

此功能通常用于使用应在进程终止时自动删除的临时文件:为了获得这样的东西,进程创建一个文件(通过打开它进行写入)并保持文件句柄打开但删除(unlink(2))文件本身(即删除目录条目)。然后进程仍然可以通过文件句柄写入该文件并从中读取,并且在终止后它不必自行清理。

Docker 的东西似乎经常有这样的东西。

您的解决方案是关闭所有这些打开的文件句柄。

这可以通过(从霰弹枪到手术刀)来实现:

  1. 重新启动。这是一个明确的方案,通常是一个很好的解决方案。
  2. 杀死所有持有打开文件句柄的进程。这避免了重新启动,因此可以保持所有与情况无关的进程不受伤害。
  3. 关闭所有持有打开文件句柄的进程中的所有临时文件描述符。这可能是一种选择,当然很大程度上取决于您的流程。

要查看进程已打开的文件句柄,您可能(取决于您的系统)查看/proc/<PID>/fd/. 对于每个进程,存在这样一个目录并代表文件句柄。

于 2018-10-18T12:48:57.583 回答