Docker采用客户端-服务器架构,主要包含以下组件:
# 查看宿主机上的Docker相关进程
ps aux | grep docker
# 查看容器内进程
docker top <container_id>
# 查看容器进程在宿主机上的PID
docker inspect --format '{{.State.Pid}}' <container_id>
Cgroups是Linux内核功能,用于限制、记录和隔离进程组的资源使用,主要包括:
子系统 | 功能 |
---|---|
cpu | 限制CPU使用 |
cpuacct | 统计CPU使用情况 |
cpuset | 分配独立CPU和内存节点 |
memory | 限制内存使用 |
devices | 控制设备访问 |
freezer | 挂起/恢复进程 |
net_cls | 标记网络数据包 |
blkio | 限制块设备I/O |
perf_event | 监控性能事件 |
net_prio | 设置网络流量优先级 |
hugetlb | 限制大页内存使用 |
Docker为每个容器创建Cgroup,默认位于/sys/fs/cgroup/
下各子系统的docker目录中。
# 查看容器的Cgroup路径
cat /proc/<container_pid>/cgroup
# 示例输出:
12:memory:/docker/<container_id>
11:devices:/docker/<container_id>
10:blkio:/docker/<container_id>
# 启动容器时限制CPU
docker run -it --cpus="1.5" ubuntu
# 相当于设置
# cpu.cfs_period_us = 100000
# cpu.cfs_quota_us = 150000
# 启动容器时限制内存
docker run -it -m 512m ubuntu
# 相当于设置
# memory.limit_in_bytes = 536870912
# 限制内存和交换分区
docker run -it -m 512m --memory-swap=1g ubuntu
# 限制块设备I/O
docker run -it --device-read-bps /dev/sda:1mb ubuntu
# 查看容器资源使用统计
docker stats <container_id>
# 查看Cgroup中的内存使用
cat /sys/fs/cgroup/memory/docker/<container_id>/memory.usage_in_bytes
问题1:容器内存不足
# 检查OOM状态
dmesg | grep -i oom
# 检查Cgroup内存限制
cat /sys/fs/cgroup/memory/docker/<container_id>/memory.limit_in_bytes
问题2:CPU使用率过高
# 查看容器CPU使用率
docker stats --no-stream <container_id>
# 调整CPU配额
echo 50000 > /sys/fs/cgroup/cpu/docker/<container_id>/cpu.cfs_quota_us
# 设置CPU共享权重 (默认1024)
docker run -it --cpu-shares=512 ubuntu
# 绑定到特定CPU核心
docker run -it --cpuset-cpus="0,1" ubuntu
# 限制磁盘I/O权重 (100-1000)
docker run -it --blkio-weight=500 ubuntu
理解Docker进程模型和Cgroups机制,能够帮助您更有效地管理和优化容器化应用。