最近在XUbuntu 22.04系统上工作时,发现电脑变得异常卡顿,打开任务管理器一看,systemd-journald进程居然占用了近80%的CPU和大量内存。这种情况在服务器上可能直接导致服务不可用,在开发机上也会严重影响工作效率。systemd-journald作为系统日志服务,正常情况下资源占用应该很低,出现这种情况肯定有问题。
首先用top命令确认问题:
bash复制top -o %CPU
在输出中可以看到systemd-journald进程持续占据CPU使用率榜首。再用htop查看更详细的资源占用情况:
bash复制sudo htop
htop的彩色显示能更直观地看到CPU和内存的使用情况。为了进一步确认,可以用journalctl查看日志服务状态:
bash复制journalctl --disk-usage
如果发现日志体积异常庞大(比如超过几个GB),那很可能就是问题的根源。
经过多次实战排查,我发现systemd-journald资源飙升通常有以下几个原因:
先用这个命令查看日志服务的详细状态:
bash复制sudo systemctl status systemd-journald -l
重点关注是否有错误信息或警告。
然后检查当前日志的存储情况:
bash复制sudo journalctl --verify
这个命令会检查日志文件的完整性,如果发现损坏的日志文件,可能就是问题的原因。
要找出哪个服务在大量写日志,可以用:
bash复制sudo journalctl -f
实时查看日志输出,观察是否有某个服务在持续刷屏。
当系统已经因为这个问题变得很卡时,可以先采取以下临时措施:
bash复制sudo journalctl --vacuum-size=100M
这个命令会将日志总量限制在100MB以内。
bash复制sudo systemctl restart systemd-journald
编辑journald的配置文件:
bash复制sudo nano /etc/systemd/journald.conf
推荐进行以下配置调整:
code复制[Journal]
SystemMaxUse=500M
RuntimeMaxUse=100M
MaxRetentionSec=1week
MaxFileSec=1day
Compress=yes
这些设置将:
保存后重启服务使配置生效:
bash复制sudo systemctl restart systemd-journald
如果问题依然存在,可以考虑:
bash复制sudo mkdir -p /etc/systemd/journald.conf.d
sudo nano /etc/systemd/journald.conf.d/filter.conf
添加内容:
code复制[Journal]
MaxLevelStore=warning
这样只存储警告及以上级别的日志。
bash复制sudo systemctl edit some-noisy-service
添加:
code复制[Service]
LogLevel=notice
建议设置一个简单的监控脚本,定期检查日志服务状态:
bash复制#!/bin/bash
JOURNALD_STATUS=$(systemctl status systemd-journald | grep "active (running)")
JOURNALD_MEM=$(ps -eo %mem,cmd | grep journald | grep -v grep | awk '{print $1}')
JOURNALD_CPU=$(ps -eo %cpu,cmd | grep journald | grep -v grep | awk '{print $1}')
if [ -z "$JOURNALD_STATUS" ] || [ $(echo "$JOURNALD_MEM > 5.0" | bc) -eq 1 ] || [ $(echo "$JOURNALD_CPU > 30.0" | bc) -eq 1 ]; then
echo "WARNING: journald may have issues" | mail -s "Journald Alert" admin@example.com
fi
建议将以下命令加入cron定期执行:
bash复制# 每周清理一次日志
0 3 * * 0 /usr/bin/journalctl --vacuum-size=500M
调整配置后,可以用这个命令测试日志写入性能:
bash复制sudo systemd-analyze journal-rate
记录正常情况下的基准值,以后可以用来对比判断是否又出现了性能问题。