Docker容器编译AOSP时‘too many open files’错误求助
解决Docker容器编译AOSP时
too many open files错误的方案 检查Docker守护进程全局文件描述符限制
即使容器内设置了--ulimit,Docker守护进程本身的限制可能会成为瓶颈。修改守护进程配置:- 编辑
/etc/docker/daemon.json,添加全局ulimit配置:{ "default-ulimits": { "nofile": { "Name": "nofile", "Hard": 1048576, "Soft": 1048576 } } } - 重启Docker服务:
sudo systemctl restart docker - 重新创建容器,此时容器的文件描述符限制会继承全局配置并生效。
- 编辑
调整主机系统的全局文件描述符限制
主机的系统级限制会约束所有进程(包括Docker):- 临时生效命令:
sudo sysctl -w fs.file-max=1048576 sudo ulimit -n 1048576 - 永久生效配置:
- 编辑
/etc/sysctl.conf,添加:fs.file-max=1048576 - 编辑
/etc/security/limits.conf,添加:* soft nofile 1048576 * hard nofile 1048576 root soft nofile 1048576 root hard nofile 1048576 - 重启系统或重新登录使配置生效。
- 编辑
- 临时生效命令:
降低AOSP编译的并行任务数
过多的并行编译进程会同时打开大量文件,超出限制。手动指定合理的并行数:make -j$(nproc --ignore=8)预留8个核心避免进程过载,可根据实际情况调整
--ignore的数值。检查绑定挂载分区的文件系统参数
绑定的ext4分区可能存在自身的文件描述符限制:- 查看当前挂载参数:
mount | grep /my/host/workspace - 临时调整挂载参数:
sudo mount -o remount,nr_open=1048576,max_file=2097152 /my/host/workspace - 永久生效需编辑
/etc/fstab,在对应分区的挂载选项中添加nr_open=1048576,max_file=2097152。
- 查看当前挂载参数:
验证容器内的实际限制
进入容器后执行以下命令确认限制是否生效:ulimit -Hn # 查看硬限制 ulimit -Sn # 查看软限制 sysctl fs.file-max若数值仍不符合预期,需检查是否有SELinux/AppArmor等安全模块限制了资源配置,或Docker Desktop的资源分配是否正确应用。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

