ubuntu 在Docker中构建AOSP:打开的文件太多

mwecs4sa  于 5个月前  发布在  Docker
关注(0)|答案(1)|浏览(88)

如何解决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)

mzaanser

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工作区挂载到另一个设备。

mount /dev/loop16 /var/lib/docker
systemctrl restart docker

mount /dev/loop14 /mnt/aosp
docker create ... --mount type=bind,source=/mnt/aosp,destination=/aosp/workspace aosp:latest

字符串
问题消失了。
(My构建没有立即工作,因为repo是错误的,有时我删除了工作区并重新同步,但随后构建能够完成)

相关问题