解决VPS间歇性CPU占用过高
解决
通过创建定时任务,触发docker stats
命令,可以解决长期占用CPU 100% 的问题,虽然没有从根源上去杜绝问题的再次发生,但是目前也只得如此。全部来自 ChatGPT 。目前运行了几天,效果非常好。而且不用担心定时任务给VPS带来的运行负担,资源负载可以忽略不计。微乎其微。
创建脚本
首先创建脚本 /usr/local/bin/docker-stats-ping.sh
,给脚本执行权限,放在 /usr/local/bin
是因为这是本地执行脚本的标准路径,不会被系统升级覆盖。
1 2 3 4 5 6 |
tee /usr/local/bin/docker-stats-ping.sh > /dev/null <<'EOF' #!/bin/bash /usr/bin/docker stats --no-stream > /dev/null 2>&1 EOF chmod +x /usr/local/bin/docker-stats-ping.sh |
创建 systemd 服务
创建 systemd 服务docker-stats-ping.service
,一次性任务,不需要持续运行,这个服务被设计为可以被定时器定时触发执行。
1 2 3 4 5 6 7 8 |
tee /etc/systemd/system/docker-stats-ping.service > /dev/null <<'EOF' [Unit] Description=Run docker stats ping to wake containerd [Service] Type=oneshot ExecStart=/usr/local/bin/docker-stats-ping.sh EOF |
创建 Timer 定时器
创建 Timer 定时器docker-stats-ping.timer
, systemd 的定时器机制 systemd timer ,比 cron
更现代、支持秒级精度、日志记录和依赖管理。下面定时任务的效果是,系统启动 30 秒后第一次运行,每隔 10 秒运行一次,每次定时触发服务对象。
1 2 3 4 5 6 7 8 9 10 11 12 |
tee /etc/systemd/system/docker-stats-ping.timer > /dev/null <<'EOF' [Unit] Description=Timer to run docker-stats-ping every 10 seconds [Timer] OnBootSec=30 OnUnitActiveSec=10s Unit=docker-stats-ping.service [Install] WantedBy=timers.target EOF |
启用并启动定时器
强制 systemd 自身重新执行,重载 systemd 配置,确保新加的 .service
和 .timer
被识别,立即启用并启动定时器。
1 2 3 |
systemctl daemon-reexec systemctl daemon-reload systemctl enable --now docker-stats-ping.timer |
检查是否成功
查看是否每 10 秒都在触发一次 docker stats 脚本。确认 docker stats 是否真的每次都在执行。
1 2 |
systemctl list-timers --all | grep docker-stats-ping journalctl -u docker-stats-ping.service --since "5 minutes ago" |
THE END