麒麟系统需配置内核级资源监控与阈值告警:用systemd-cgtop实时捕获cgroup资源超限,通过systemd-run定时执行告警脚本,结合journalctl+logrotate归档日志,并启用kmsg转发使oom事件进入syslog。

麒麟系统中进程内存或CPU持续飙升却无人值守时,需配置内核级资源监控与阈值触发告警,避免因OOM killer误杀关键服务或业务长时间中断;该机制不依赖图形界面,纯命令行驱动,适用于服务器与桌面环境。
用systemd-cgtop实时捕获超限进程
systemd-cgtop可按cgroup维度统计资源消耗,比ps/top更稳定——它直接读取内核cgroup接口,不受进程名伪装、多线程混淆干扰。
执行systemd-cgtop -P -d 5,每5秒刷新一次,聚焦查看%CPU和MEM列;当某cgroup(如user-1000.slice)的MEM%连续3次≥85%,即视为内存风险窗口开启。
注意:若输出中无MEM%列,说明当前内核未启用memory controller,需先执行sudo modprobe memory && echo "memory" | sudo tee /etc/modules。
配置systemd-run触发阈值告警脚本
这一步将资源监控与告警动作绑定为一次性服务,无需常驻进程,降低自身开销。
第一步:创建告警脚本
执行sudo nano /usr/local/bin/check-high-cpu.sh,填入以下内容:
#!/bin/bash
THRESHOLD=75
CURRENT=$(ps -eo pcpu,pid --sort=-pcpu | head -n 2 | tail -n 1 | awk '{print $1}')
if (( $(echo "$CURRENT > $THRESHOLD" | bc -l) )); then
logger -t "HIGH_CPU_ALERT" "PID $(ps -eo pcpu,pid --sort=-pcpu | head -n 2 | tail -n 1 | awk '{print $2}') using ${CURRENT}% CPU"
echo -e "\a" > /dev/console
fi
第二步:赋予执行权限
sudo chmod +x /usr/local/bin/check-high-cpu.sh
第三步:注册为定时触发服务
sudo systemd-run --on-calendar="*:*:00" --scope /usr/local/bin/check-high-cpu.sh
【该命令注册的是每分钟整点执行一次的瞬时任务,不会产生残留service单元,且--scope确保其在独立cgroup中运行,不影响其他进程】
通过journalctl+logrotate实现告警日志归档
仅弹出终端响铃不够,必须留存可审计的告警记录,供后续排查趋势或对接Zabbix等平台。
方法一:启用systemd-journald持久化日志
执行sudo mkdir -p /var/log/journal→sudo systemd-tmpfiles --create --prefix /var/log/journal→sudo systemctl restart systemd-journald
方法二:配置logrotate自动压缩告警条目
执行sudo nano /etc/logrotate.d/kylin-alerts,填入:
/var/log/syslog {
daily
missingok
rotate 7
compress
notifempty
sharedscripts
postrotate
grep -q "HIGH_CPU_ALERT\|OOM_KILL" /var/log/syslog && logger -t "ALERT_ARCHIVE" "High-resource event archived"
endscript
}
方法三:提取最近2小时所有告警
执行journalctl --since "2 hours ago" | grep -E "(HIGH_CPU_ALERT|OOM_KILL|memory.*exceeded)"
设置内核OOM事件主动推送至syslog
当进程真被OOM killer终结时,内核会写入dmesg,但默认不进syslog;必须显式开启,否则告警脚本无法捕获该终极事件。
第一步:确认当前kmsg转发状态
执行cat /proc/sys/kernel/printk,若第4位数字(console_loglevel)小于4,表示低优先级消息(含OOM)不打印到控制台。
第二步:强制提升OOM日志等级
执行sudo sysctl -w kernel.printk="7 4 1 7"
第三步:持久化该设置
echo 'kernel.printk = 7 4 1 7' | sudo tee -a /etc/sysctl.conf→sudo sysctl -p
【完成此步后,执行dmesg | grep -i "killed process"即可看到完整OOM上下文,且journalctl -k也能检索到】











