docker启动线程创建异常 pthread_create EPERM | RuntimeError: can‘t start new thread
直接说答案,着急就复制过去使用
docker配置增加对应权限配置参数即可
--privileged如果上述不行,docker配置使用组合方式
--privileged\--ulimitnproc=65535:65535\--ulimitnofile=65535:65535\详细解释
下面逐项解释这些 Docker 参数的作用、底层含义、适用场景,以及可能的副作用。
1.--privileged
--privileged作用
给容器“接近宿主机 root”的权限。
默认情况下:
Docker 会限制容器:
- Linux Capabilities
/dev设备访问- 内核接口
- AppArmor / SELinux
- cgroup 权限
加上:
--privileged后:
- 容器获得所有 Linux capabilities
- 可以访问所有设备
- 可以执行很多原本禁止的操作
- AppArmor/SELinux 限制会被放宽
- 基本等于“容器内 root ≈ 宿主机 root”
常见用途
1)Docker in Docker
例如:
dockerrun--privilegeddocker:dind容器里再运行 Docker。
2)需要操作内核
例如:
- 挂载文件系统
- 修改 iptables
- 使用 FUSE
- 操作
/sys - 加载内核模块
3)某些 AI / GPU / 驱动环境
某些推理框架需要:
/dev/kfd/dev/dri- RDMA
- InfiniBand
风险
非常大。
如果容器被入侵:
- 可能直接控制宿主机
- 可逃逸
- 可读取宿主机设备
- 可修改网络
生产环境一般:
- 不建议使用
- 除非明确知道原因
更安全替代方案
通常只增加必要 capability:
--cap-add NET_ADMIN--device/dev/fuse而不是直接 privileged。
2.--ulimit nproc=65535:65535
--ulimitnproc=65535:65535作用
限制容器内:
单用户可创建的最大进程数(process number)
对应 Linux:
ulimit-u格式
soft:hard这里:
65535:65535表示:
- soft limit = 65535
- hard limit = 65535
soft/hard 区别
soft
当前生效限制。
普通程序可以降低。
hard
上限。
只有 root 才能提高到 hard。
为什么需要调大?
某些程序:
- Java
- Python 多线程
- OpenBLAS
- TensorFlow
- Gunicorn
- gevent
- JVM
- 大量协程框架
会创建很多:
- 线程
- worker
- fork
Linux 线程本质也是 task/process。
默认可能只有:
10244096容易出现:
pthread_create failed Resource temporarily unavailable can't start new thread你之前遇到的典型错误
你之前 Docker 里:
thread create failed
大概率就和:
- nproc 太小
- OpenBLAS 创建线程失败
有关。
3.--ulimit nofile=65535:65535
--ulimitnofile=65535:65535作用
限制:
最大可打开文件描述符数量(FD)
对应:
ulimit-n什么是文件描述符?
Linux 中:
一切皆文件
包括:
- 文件
- socket
- TCP连接
- 管道
- epoll
- device
都占 FD。
默认值通常很低
可能:
10244096高并发程序很容易炸。
常见错误
1)Too many open files
EMFILE Too manyopenfiles2)数据库连接异常
MySQL / Redis:
- 无法建立新连接
- socket 创建失败
3)Nginx
worker_connections exceedopenfileresource limit为什么 AI / Python 容器也要调?
因为:
- HTTP连接
- WebSocket
- 模型 mmap
- 日志文件
- multiprocessing pipe
都会占 FD。
报错信息
Failed to start thread"GC Thread#0"- pthread_create failed(EPERM)或者
Traceback(most recent call last): File"/tmp/main.py", line87,in<module>File"/tmp/main.py", line81,incheck_dependencies File"/usr/local/lib/python3.12/site-packages/moviepy/editor.py", line60,in<module>from .video.io.slidersimportsliders File"/usr/local/lib/python3.12/site-packages/moviepy/video/io/sliders.py", line1,in<module>importmatplotlib.pyplot as plt File"/usr/local/lib/python3.12/site-packages/matplotlib/pyplot.py", line57,in<module>importmatplotlib.image File"/usr/local/lib/python3.12/site-packages/matplotlib/image.py", line25,in<module>from matplotlib.backend_basesimportFigureCanvasBase File"/usr/local/lib/python3.12/site-packages/matplotlib/backend_bases.py", line49,in<module>from matplotlibimport(File"/usr/local/lib/python3.12/site-packages/matplotlib/text.py", line16,in<module>from .font_managerimportFontProperties File"/usr/local/lib/python3.12/site-packages/matplotlib/font_manager.py", line1643,in<module>fontManager=_load_fontmanager()^^^^^^^^^^^^^^^^^^^ File"/usr/local/lib/python3.12/site-packages/matplotlib/font_manager.py", line1637,in_load_fontmanager fm=FontManager()^^^^^^^^^^^^^ File"/usr/local/lib/python3.12/site-packages/matplotlib/font_manager.py", line1097,in__init__ timer.start()File"/usr/local/lib/python3.12/threading.py", line994,instart _start_new_thread(self._bootstrap,())RuntimeError: can't start new thread