紧急:dsmgr过时Docker API和containerd cgroup错误共同导致系统iowait持续20%+
问题描述
在fnOS系统中发现两个严重问题共同导致系统iowait持续高达20-30%:
- dsmgr使用过时Docker API:
dsmgr进程使用Docker API v1.24,而系统Docker是v1.52,导致每10秒产生API版本错误
- containerd cgroup v2兼容性问题:在cgroup v2环境下,containerd无法解析AdGuard Home容器的hugetlb配置,每秒产生错误日志
这两个问题的错误日志大量写入syslog,频繁的磁盘写入导致系统iowait异常高,严重影响系统性能。
系统环境
- 系统版本: fnOS(1.1.8)
- 内核版本: 6.12.18-trim
- Cgroup版本: v2 (cgroup2fs)
- Docker版本: 29.1.2(API v1.52,最低支持1.44)
- containerd版本: v2.2.0
- 硬件配置: 4 CPU,系统盘SSD,存储盘HDD
问题表现
- 系统iowait持续20-30%
- syslog文件快速增长(每小时可达几十MB)
- 磁盘频繁写入,ext4 journal活跃
- 系统响应缓慢,特别是IO操作
错误日志示例
问题1:dsmgr Docker API版本错误(每10秒)
text
2025-12-29T23:25:08.854593+08:00 fnOS dsmgr[46063]: time="2025-12-29T23:25:08+08:00" level=error msg="runStats err:Error response from daemon: client version 1.24 is too old. Minimum supported API version is 1.44, please upgrade your client to a newer version"
2025-12-29T23:25:18.859579+08:00 fnOS dsmgr[46063]: [Stats]Close the channel, err:Error response from daemon: client version 1.24 is too old. Minimum supported API version is 1.44, please upgrade your client to a newer version"
问题2:containerd cgroup解析错误(每1秒)
text
2025-12-29T23:10:49.338915+08:00 fnOS containerd[1820]: time="2025-12-29T23:10:49.338470902+08:00" level=error msg="unable to parse \"max 0\" as a uint from Cgroup file \"/sys/fs/cgroup/system.slice/docker-9d176292c4734fd5b6684981ceeabf431eabec39c6a706b46b205ab1c3b2a0c5.scope/hugetlb.2MB.events\""
诊断信息
1. 系统状态检查
bash
# Cgroup版本:v2
stat -fc %T /sys/fs/cgroup/ # 输出: cgroup2fs
# Docker cgroup配置
docker info | grep -i cgroup
# 输出:
# Cgroup Driver: systemd
# Cgroup Version: 2
# containerd配置:无配置文件,使用默认
ls -la /etc/containerd/config.toml # 不存在
2. 问题影响分析
- 错误频率:
- dsmgr:每10秒2条错误 → 720条/小时
- containerd:每1秒1条错误 → 3600条/小时
- 总计:4320条错误日志/小时
- 磁盘写入量:
- 每条错误约300字节
- 每小时约1.3MB错误日志写入
- 加上ext4 journal开销,实际磁盘写入更大
已尝试的解决方案
对于dsmgr问题:
- ❌ 停止服务:
sudo systemctl stop dsmgr → 自动重启
- ❌ 禁用服务:
sudo systemctl disable dsmgr → 仍然重启
- ❌ 设置环境变量:
DOCKER_API_VERSION=1.44 → 无效
- ✅ 日志过滤:部分缓解,但问题根源未解决
对于containerd问题:
- ❌ 重新创建AdGuard Home容器 → 错误依旧
- ✅ 创建containerd配置:
disable_hugetlb_controller = true → 有效但需要配置文件
- ❌ 切换cgroup v1 → 需要系统重启,影响大
根本原因分析
问题1:dsmgr Docker API版本不匹配
- 根源:
/usr/trim/bin/dsmgr二进制文件静态链接了过时的Docker客户端库(API v1.24)
- 表现: 硬编码使用v1.24,无法通过环境变量修改
- 影响: 每10秒产生错误,写入syslog
问题2:containerd cgroup v2兼容性
- 根源: 系统使用cgroup v2,但containerd默认配置不兼容hugetlb控制器
- 表现: 解析cgroup文件时遇到
"max 0"字符串,期望是数字
- 触发: AdGuard Home容器使用了hugetlb资源
- 影响: 每秒产生错误,写入syslog
建议的修复方案
方案A:更新相关组件(推荐)
- 更新dsmgr:使用与系统Docker版本兼容的API客户端
- 提供containerd配置:默认包含cgroup v2优化配置
- 更新AdGuard Home镜像:优化cgroup配置
方案B:系统级配置优化
- fnOS默认containerd配置:
toml
[plugins."io.containerd.grpc.v1.cri"]
disable_hugetlb_controller = true
- dsmgr配置选项:
- 添加Docker API版本配置参数
- 或自动检测并使用系统Docker API版本
方案C:错误处理优化
- 降低日志级别:API版本不匹配应记录为警告而非错误
- 优雅降级:检查失败时降低频率而非持续报错
- 智能重试:检测到问题后延长检查间隔
临时缓解措施(用户可操作)
对于dsmgr问题:
bash
# 创建rsyslog过滤规则
sudo tee /etc/rsyslog.d/99-filter-dsmgr.conf << 'EOF'
:programname, isequal, "dsmgr" ~
EOF
sudo systemctl restart rsyslog
对于containerd问题:
bash
# 创建containerd配置
sudo mkdir -p /etc/containerd
sudo tee /etc/containerd/config.toml << 'EOF'
version = 2
[debug]
level = "warn"
[plugins."io.containerd.grpc.v1.cri"]
disable_hugetlb_controller = true
EOF
sudo systemctl restart containerd
影响范围评估
受影响的用户:
- 所有使用Docker功能的fnOS用户(dsmgr问题)
- 在cgroup v2环境下运行容器的用户(containerd问题)
- 特别是运行AdGuard Home等可能使用hugetlb的容器用户
严重性等级:
- dsmgr问题: P1(紧急)- 影响所有用户,高频错误
- containerd问题: P2(高)- 影响部分容器用户
复现步骤
- 安装fnOS并启用Docker
- 运行AdGuard Home容器
- 监控syslog:
sudo tail -f /var/log/syslog
- 查看iowait:
iostat -x 1
请求研发团队
请优先处理以下问题:
- 立即修复:更新dsmgr组件,支持Docker API v1.44+
- 配置优化:提供默认的containerd cgroup v2兼容配置
- 长期方案:建立组件版本兼容性检查机制
附加技术信息
相关文件位置:
- dsmgr二进制:
/usr/trim/bin/dsmgr
- containerd配置:
/etc/containerd/config.toml(不存在)
- Docker配置:
/etc/docker/daemon.json
- 系统日志:
/var/log/syslog
系统监控数据:
bash
# 典型问题状态
avg-cpu: %user %nice %system %iowait %steal %idle
2.02 0.00 2.53 23.74 0.00 71.72
# 错误频率统计
# dsmgr: 6次/分钟,containerd: 60次/分钟
