如何解决Docker容器中的too many open files
错误?
我试图在一台22.04机器上的Docker Desktop(v2.25.2)中为我的AOSP构建创建一个Ubuntu 20.04容器(AOSP的供应商MOD将其限制为20.04...)。128 GiB RAM,2 TiB空闲。
容器本身非常简单,我绑定了工作区,但是当我运行构建时,我经常碰到too many open files
我在这里看到了很多关于首先运行清除挂起的图像/卷,提高ulimit,* 等等 * 的帖子,似乎没有什么帮助。唯一有影响的是当我提高虚拟磁盘限制时,但即使将其提高到800 GiB也只让我摆脱了lunch
并进入了构建的最开始。
我正在创建一个容器:
docker create \
-it \
--privileged \
--ulimit 'nofile=1000000' \
--name "aosp" \
--mount type=bind,source=/my/host/workspace,destination=/aosp/workspace \
--mount type=tmpfs,destination=/tmp \
aosp:latest
字符串
(Not显示的是ccache目录和私有文件(如.netrc
、.git-credentials
、* 等 *)的挂载--ulimit
选项似乎没有影响。
问题似乎不是文件描述的数量:
(container)
# sysctl fs.file-nr
fs.file-nr = 1840 0 6635196
型
事实上,似乎没有什么是有限的:
(container)
# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 259210
max locked memory (kbytes, -l) 82000
max memory size (kbytes, -m) unlimited
open files (-n) 1000000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
型
至于资源,我在Docker Desktop中设置:
- CPU:40
- 内存限制:64 GiB
- 交换:3 GiB
- 虚拟磁盘限制:776 GiB
我不想强加任何我所知道的限制:
(host)
❯ dkCin -f "{{.HostConfig.Ulimits}}" aosp
[nofile=1000000:1000000]
型
我的主机文件系统:
(host)
❯ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme0n1 259:0 0 3.7T 0 disk
...
└─nvme0n1p3 259:3 0 3.7T 0 part
└─nvme0n1p3_crypt 253:0 0 3.7T 0 crypt
├─vgubuntu-swap 253:1 0 11.4G 0 lvm [SWAP]
└─vgubuntu-root 253:2 0 3.7T 0 lvm /var/snap/firefox/common/host-hunspell
/
❯ df
Filesystem Size Used Avail Use% Mounted on
tmpfs 13G 2.8M 13G 1% /run
/dev/mapper/vgubuntu-root 3.7T 2.0T 1.6T 57% /
❯ mount
/dev/mapper/vgubuntu-root on / type ext4 (rw,relatime,errors=remount-ro)
型
1条答案
按热度按时间mzaanser1#
虽然我不知道确切的问题,但根据@charles-duffy在评论/聊天中的建议,我切换了Docker to using the BTRFS storage driver(Linux的Docker Desktop不支持)。我推测原因是我的本地设置+ docker + AOSP构建的资源密集度。
这解决了我在AOSP构建中的问题,当我将其应用于另一个同样具有大型构建系统的容器时,它大大加快了速度(我还没有很好的统计数据,但一些组件构建有5倍的加速)
为了设置这个,我使用
losetup
遵循this page to create virtual block devices(但使用mkfs.btrfs
进行格式化)。我为AOSP创建了一个~ 400 GiB的设备,为Docker创建了一个~ 100 GiB的设备。我在docker设备上挂载了
/var/lib/docker/
(如这里的说明所示),在/etc/docker/daemon.json
中将我的storage-driver
更改为btrfs
,重新启动docker,并将我的AOSP工作区挂载到另一个设备。字符串
问题消失了。
(My构建没有立即工作,因为
repo
是错误的,有时我删除了工作区并重新同步,但随后构建能够完成)