问题描述
Docker 过一段时间找不到 N 卡,Failed to initialize NVML: Unknown Error
错误解决
解决方案
- stop 所有已启动的 docker 算法服务,然后修改 docker 配置文件:
{
- "exec-opts": ["native.cgroupdriver=systemd"],
+ "exec-opts": ["native.cgroupdriver=cgroupfs"],
"log-driver": "json-file",
"log-opts": {"max-size":"500m", "max-file":"3"},
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
-
重启 docker 服务
-
启动 docker 算法服务
问题原因
主机执行 daemon-reload
(或类似操作)。如果容器使用systemd来管理cgroups,守护进程重新加载“会触发重新加载任何具有对NVIDIA GPU引用的单元文件”。然后,容器将失去对重新加载的GPU引用的访问权限。
nvidia - Failed to initialize NVML: Unknown Error in Docker after Few hours - Stack Overflow
在Linux系统中,cgroupfs
(Control Groups File System)和systemd
都是关于进程管理和资源控制的重要组件。
-
cgroupfs:
cgroupfs
是 Linux 内核提供的一种机制,用于限制、监控和分配系统资源(如 CPU、内存、磁盘 I/O 等)给进程组。它允许系统管理员将系统资源划分为多个分组,以便更精细地管理和控制进程的资源使用。- cgroupfs 允许管理员创建 cgroup,将进程添加到这些 cgroup 中,并为每个 cgroup 分配资源限制。这使得管理员可以限制特定进程组的资源使用量,或者确保某些进程组具有优先权。
cgroupfs
通常通过挂载在文件系统的方式使用,一般挂载在/sys/fs/cgroup
下。
-
systemd:
systemd
是一个系统和服务管理器,旨在提供一个更加全面和统一的启动和管理系统服务的方式。它被广泛用于许多现代 Linux 发行版中,取代了传统的init
系统。systemd
不仅仅是一个简单的 init 替代品,它还提供了许多附加功能,包括服务管理、日志记录、用户会话管理、定时任务等。systemd
使用了cgroup
来跟踪和管理系统中运行的服务的资源使用情况。它能够利用cgroup
提供的资源控制功能,确保系统中运行的服务不会超出分配的资源限制。- 此外,
systemd
还提供了systemd-cgtop
工具,用于监视和显示cgroup
中各个进程组的资源使用情况。
总的来说,cgroupfs
提供了 Linux 内核级别的资源控制机制,而 systemd
则是一个更高级别的系统和服务管理器,它利用 cgroup
来管理系统中运行的服务和进程组的资源使用。