跳转到内容

CPU 或负载居高不下 ​

适用范围 ​

  • 仪表盘或性能统计里,CPU 或平均负载长时间很高。
  • 在 shell 里 top、uptime 显示负载很高,风扇一直在响,界面变得卡顿。
  • 收到 OMV 的邮件告警:「监测 - 平均负载」「监测 - CPU 使用量」「监测 - 内存使用量」。

不适用:只是某次文件传输慢,见SMB 传输慢;硬盘一直在转,见硬盘不休眠。

开始排查前 ​

先分清两个概念:

  • CPU 使用率:CPU 有多少时间在干活。
  • 平均负载(load average):正在运行、或排队等待运行的任务数,也包括正在等磁盘 I/O 的任务。

所以:负载高但 CPU 其实空闲,多半是在等磁盘;负载高并且 CPU 也高,才是有进程在占 CPU。负载要和 CPU 核心数对比,负载在核数以内,通常说明机器没有排队。

OMV 默认的监控告警阈值(每 30 秒检查一次):5 分钟平均负载大于核数持续 3 个周期,1 分钟平均负载大于核数的 2 倍持续 3 个周期,内存使用率超过 90%,CPU 的用户、系统或 I/O 等待占用超过 95% 连续 2 个周期。这些告警需要邮件通知可用,并且「监测」类的通知项是开启的(默认开启)。

短时间的高负载往往是正常的:刚开机、刚更新完、RAID 正在检查、媒体库在扫描。要关注的是长时间不降的情况。本页的检查都是只读的。

排查步骤 ​

1. 在界面里看趋势 ​

诊断 → 性能统计(Diagnostics → Performance Statistics)里有 CPU、平均负载、内存用量的历史图,前提是 系统 → 监测(System → Monitoring)是开着的(默认开启)。看高峰是不是总出现在固定的时间点,比如夜里,那往往是计划任务。

诊断 → 进程(Diagnostics → Processes)页面显示当前的负载、任务数、内存,以及按 CPU 排序的进程列表,每 5 秒刷新一次。

2. 在 shell 里看实时情况 ​

sh
# 在 OMV 的 shell 里执行(只读);top 看完按 q 退出
uptime
nproc
top
  • uptime 末尾的三个数字是 1、5、15 分钟平均负载,nproc 是 CPU 核数。
  • top 里按 P 按 CPU 排序,按 M 按内存排序。顶部 CPU 一行里:us 是用户程序,sy 是内核,wa 是等待 I/O,id 是空闲。

3. 判断是哪一类 ​

top 里看到说明下一步
us 高,某个进程的 CPU 很高这个进程在占 CPU第 4 节
sy 高内核在忙:网络、文件系统、加密第 4、5 节
wa 高,负载高而 CPU 空闲在等磁盘第 5 节
内存几乎用满,kswapd0 占 CPU内存不足第 6 节
各项都不高,但机器发热、风扇响不是负载问题,是 CPU 频率策略或散热见下面的说明

关于最后一种:先看 系统 → 电源管理 → 设置(System → Power Management → Settings)里的 CPU 频率调节(CPU frequency scaling)。选了 performance 时 CPU 会长期保持在高频,功耗和发热更大。8.1.0 起这一项就在界面里改,8.0.9 那时用的环境变量 OMV_CPUPOWER_GOVERNOR 已经不再生效。各调节器的区别见低功耗与静音。

4. 常见的 CPU 大户 ​

进程是什么怎么处理
smbd正在传输文件,或开启了加密、审计见SMB 传输慢
dockerd、容器里的进程(jellyfin、ffmpeg、postgres、各种 immich 组件等)容器在转码、做机器学习、跑数据库、扫描媒体库docker stats --no-stream,或 服务 → Compose → 统计(Stats)页;限制资源或错开时间
md0_resync 一类的 md* 进程软件 RAID 在重建、同步或检查cat /proc/mdstat 看进度,等它完成。OMV 保留了 Debian 的定期阵列检查(AUTOCHECK=true)
btrfs 相关进程Btrfs 在校验或整理见Btrfs 维护:scrub、balance 与换盘
clamd、clamscanClamAV 在扫描调整扫描计划,或关闭实时扫描
rsync、borg、restic备份任务在 系统 → 计划任务(System → Scheduled Tasks)里看执行时间,见计划任务
systemd-journald、rsyslogd日志刷屏用 journalctl -n 100 看是哪个服务在反复报错
php-fpm、omv-engined、nginxOMV 自己的界面平时很低。持续很高就看日志,并检查有没有浏览器标签页一直开着在自动刷新

5. 在等磁盘(wa 高) ​

sh
# 在 OMV 的 shell 里执行(只读)
ps -eo pid,stat,comm | awk '$2 ~ /^D/'
cat /proc/mdstat
dmesg -T | tail -n 30
  • 第一条列出处于 D 状态(不可中断睡眠,通常就是在等 I/O)的进程。一直有进程停在 D 状态,就说明磁盘或存储路径有问题。
  • 内核日志里有 I/O error、blocked for more than 120 seconds 一类的信息:磁盘、数据线或阵列出了问题,见磁盘或文件系统不见了、RAID 降级,并检查 SMART。
  • 远程挂载的 NFS、SMB 目录,对端不可达时,访问它的进程也会卡在 D 状态。
  • SMR 盘持续写入、阵列重建、Btrfs 校验,都会让磁盘长时间忙碌,见数据盘怎么选:CMR、SMR 与 NAS 盘。

6. 内存不足 ​

sh
# 在 OMV 的 shell 里执行(只读)
free -h
journalctl -k -b --no-pager | grep -iE 'out of memory|oom'
  • 官方给出的最低内存是 1 GiB,新手建议至少 4 GiB。跑容器、用 ZFS 的机器需要更多。ZFS 会把大量内存当作 ARC 缓存,这是它的正常行为,见ZFS 插件。
  • 日志里有 Out of memory 的记录,说明系统已经杀过进程,被杀的常常是容器里的应用,对应容器的状态是 Exited (137)。
  • 用 docker stats --no-stream 找出最吃内存的容器,调整它们,或者增加内存。

7. 处理原则 ​

  • 不要直接 kill -9 系统进程。容器用 Compose 的停止,计划任务调整执行时间。
  • RAID 重建、Btrfs 校验这类维护任务,让它跑完,中途打断通常要从头再来。
  • 高峰来自备份或杀毒的,把计划错开,不要都挤在同一时间。

确认恢复 ​

  1. uptime 里 5 分钟和 15 分钟平均负载回落到与核数相当的水平。
  2. 诊断 → 性能统计 的图表曲线回落,之前的高峰不再出现。
  3. 没有新的 OMV 告警邮件,界面操作不再卡顿。

仍未解决 ​

附上:uptime、nproc、top -b -n 1 | head -n 20、free -h、cat /proc/mdstat、docker stats --no-stream、dmesg -T | tail -n 50 的输出,性能统计图的截图,以及问题开始前做过的改动。读如何有效求助。

参考资料 ​

OpenMediaVault 非官方中文使用指南,与 openmediavault 项目及其开发者无隶属关系。