AWS ElasticBeanstalk docker-thin-pool 已满并导致文件系统重新挂载为只读?

std*_*ave 12 filesystems lvs amazon-web-services docker

我无法弄清楚 AWS 如何在 ElasticBeanstalk 上设置他们的 Docker“瘦池”以及它是如何被填满的。我的 docker 精简池不知何故填满并导致我的应用程序在尝试写入磁盘时崩溃。

这是来自容器内部:

>df -h
>     /dev/xvda1                  25G  1.4G   24G   6%
Run Code Online (Sandbox Code Playgroud)

事实上,EBS 有一个 25GB 的磁盘分配给它;du -sh /返回的是 1.6 GB 。

在 EC2 之外,它开始时足够无害......(通过lvs

LV          VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
docker-pool docker twi-aot--- 11.86g             37.50  14.65
Run Code Online (Sandbox Code Playgroud)

但是,文件系统很快将重新挂载为只读。通过 dmesg:

[2077620.433382] Buffer I/O error on device dm-4, logical block 2501385
[2077620.437372] EXT4-fs warning (device dm-4): ext4_end_bio:329: I/O error -28 writing to inode 4988708 (offset 0 size 8388608 starting block 2501632)
[2077620.444394] EXT4-fs warning (device dm-4): ext4_end_bio:329: I/O error     [2077620.473581] EXT4-fs warning (device dm-4): ext4_end_bio:329: I/O error -28 writing to inode 4988708 (offset 8388608 size 5840896 starting block 2502912)

[2077623.814437] Aborting journal on device dm-4-8.
[2077649.052965] EXT4-fs error (device dm-4): ext4_journal_check_start:56: Detected aborted journal
[2077649.058116] EXT4-fs (dm-4): Remounting filesystem read-only
Run Code Online (Sandbox Code Playgroud)

退出 EC2 实例域,Docker 报告:(来自docker info

Pool Name: docker-docker--pool
Pool Blocksize: 524.3 kB
Base Device Size: 107.4 GB
Backing Filesystem: ext4
Data file:
Metadata file:
Data Space Used: 12.73 GB
Data Space Total: 12.73 GB
Data Space Available: 0 B
Metadata Space Used: 3.015 MB
Metadata Space Total: 16.78 MB
Metadata Space Available: 13.76 MB
Thin Pool Minimum Free Space: 1.273 GB
Run Code Online (Sandbox Code Playgroud)

LVS 转储此信息:

  --- Logical volume ---
  LV Name                docker-pool
  VG Name                docker
  LV UUID                xxxxxxxxxxxxxxxxxxxxxxxxxxxx
  LV Write Access        read/write
  LV Creation host, time ip-10-0-0-65, 2017-03-25 22:37:38 +0000
  LV Pool metadata       docker-pool_tmeta
  LV Pool data           docker-pool_tdata
  LV Status              available
  # open                 2
  LV Size                11.86 GiB
  Allocated pool data    100.00%
  Allocated metadata     17.77%
  Current LE             3036
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:2
Run Code Online (Sandbox Code Playgroud)

这个瘦池是什么,为什么它会填满,我该如何阻止它这样做?另外,如果我的 / 卷上的容器内部有 20+ GB 可用空间,为什么它会停止新的写入?据我所知,它没有连接到我的程序正在写入的文件。

谢谢!

小智 9

.ebextensionsDavid Ellis的建议对我有用。我无法评论他的回答,但我想补充一点,您可以创建一个新的 EBS 卷,而不是使用快照。要挂载 40GB EBS 卷,我使用了以下内容:

option_settings:
  - namespace: aws:autoscaling:launchconfiguration
    option_name: BlockDeviceMappings
    value: /dev/xvdcz=:40:true
Run Code Online (Sandbox Code Playgroud)

另请参阅此文档,其中包含将新的 100GB EBS 卷映射到/dev/sdh.

true在最后的手段“删除终止”。

我创建了一个.ebextensions包含ebs.config上述代码文件的新目录,然后将该目录与我的Dockerrun.aws.json. 请注意,Dockerrun 文件必须位于 zip 的顶层,而不是子目录内。

要查找 Elastic Beanstalk 安装卷的位置,请lsblk在发生故障的实例上使用。它也/dev/xvdcz适合我,所以也许这就是标准。


小智 3

我们遇到了同样的问题。根本原因似乎是 Docker 没有使用devicemapper这些选项安装其存储引擎(Elastic Beanstalk 中默认采用精简配置)discard,这反过来又会填充块直到损坏。

我无法找到明确的解决方案,但这里有一个解决方法(请参阅此评论),我可以在受影响的实例上使用它:

docker ps -qa | xargs docker inspect --format='{{ .State.Pid }}' | xargs -IZ fstrim /proc/Z/root/
Run Code Online (Sandbox Code Playgroud)

  • @ThomasGrainger .ebextensions 文件。世界上最令人讨厌的创造物之一。它们在系统启动时运行。 (2认同)