上一篇
如何监控linux服务
- Linux
- 2025-08-07
- 4
监控Linux服务可用
systemctl status [服务名]
查状态,
journalctl -u [服务名]
看日志,配合
top
/
htop
观性能,或用Nagios/Zabbix等工具实现
监控Linux服务是保障系统稳定性和可靠性的核心任务之一,以下从核心监控维度、常用工具链、实战操作流程、典型场景解决方案四个层面展开详细说明,并提供可落地的操作示例与配置建议。
核心监控维度拆解
监控类型 | 关键指标 | 适用场景 |
---|---|---|
进程状态 | PID存在性、运行状态(Running/Sleeping)、重启次数 | 基础存活性验证 |
资源占用 | CPU使用率、内存消耗量、磁盘I/O吞吐量、网络带宽 | 性能瓶颈定位 |
日志输出 | 错误日志频率、异常堆栈跟踪、关键业务日志缺失 | 故障根因分析 |
端口服务 | 指定端口监听状态、TCP连接数、请求响应延迟 | Web/API服务可用性验证 |
依赖关系 | 关联服务的启动顺序、共享资源竞争(如数据库锁表) | 复杂系统级联故障排查 |
自动恢复 | 崩溃后自动拉起策略、最大重试次数、故障转移机制 | 高可用架构设计 |
原生命令行工具集详解
systemctl
体系
# 实时查看服务状态及最近日志片段 systemctl status nginx --no-pager --lines=20 # 显示完整启动历史(含失败记录) journalctl -u nginx.service --since "5 minutes ago" # 设置开机启动并启用失败自动重启 systemctl enable mysqld && systemctl restart mysqld
️ 注意:systemctl
仅能反映Service Unit层面的表象状态,无法捕获子进程异常退出等深层问题。
进程级监控三板斧
命令 | 功能描述 | 典型用法示例 |
---|---|---|
pgrep -l 'nginx' |
精确匹配进程名+显示PID | 确认主/工作进程均正常运行 |
lsof -i :80 |
查看指定端口的实际绑定进程 | 排查Nginx未监听端口的特殊场景 |
strace -p <PID> |
跟踪系统调用轨迹 | 诊断文件句柄泄漏导致的OOM Killer |
资源监控组合技
# 动态刷新资源占用TOP5进程(含线程) watch -n 1 'ps -eo %cpu,%mem,cmd --sort=-%cpu | head -n 6' # 统计指定进程的历史资源峰值 awk '{print $1}' <(ps -o %cpu,comm= -C redis-server --no-headers) | sort -nr | head -1
进阶技巧:结合/proc
文件系统可直接读取内核数据:
cat /proc/$(pgrep java)/io | grep read_bytes # Java应用磁盘读取量
专业监控工具选型指南
Prometheus+Grafana方案(云原生首选)
组件 | 作用说明 | 配置要点 |
---|---|---|
Node Exporter | 采集系统级指标(CPU/内存/磁盘) | 修改/etc/node_exporter/node.yaml |
cAdvisor | 容器资源监控 | 对接Docker API |
Blackbox Exporter | ICMP/HTTP/TCP探针 | 定义自定义检测规则 |
Alertmanager | 告警路由分发 | 按严重程度分级通知 |
部署示例:
# prometheus.yml片段 static_configs: targets: ['node1:9100','node2:9100'] labels: role: node
Zabbix企业级方案
特色功能 | 技术实现 | 适用场景 |
---|---|---|
自动发现 | 基于SNMP/Agent主动注册资产 | 大规模物理机群管理 |
模板继承 | 预置Linux通用模板+自定义项覆盖 | 快速标准化监控项 |
触发器函数 | {ITEM_DATA}>{THRESHOLD} → eventid生成 | 复杂逻辑判断(如连续3次超限) |
告警配置示例:
<trigger> <expression>{memory.usage.data.avgdata[5m]}>90</expression> <description>内存使用率持续5分钟高于90%</description> <priority>disaster</priority> </trigger>
Netdata实时监控(零配置优势)
# CentOS安装命令 bash <(curl -Ss https://my-netdata.io/kickstart.sh) --non-interactive
核心优势:开箱即用的火焰图可视化、插件市场支持200+种服务集成、端到端加密传输。
关键场景应对策略
场景1:Java应用频繁GC停顿
诊断路径:
- 使用
jstat -gcutil <PID> 1000
观察Full GC频率 - 通过
jmap -heap <PID>
导出堆转储分析对象引用链 - 调整JVM参数:
-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75
监控强化:
# Prometheus JMX Exporter配置 rules: pattern: '<java_pid>' jmx_url: 'service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi'
场景2:MySQL慢查询堆积
优化步骤:
- 开启慢查询日志:
set global slow_query_log=1;
- 使用
pt-query-digest slow.log
生成TOP SQL排行 - 添加复合索引:
ALTER TABLE orders ADD INDEX idx_user_date (user_id, create_time);
监控看板必备指标:
- InnoDB缓冲池命中率(
Show Global Status Like 'Innodb_buffer_pool_reads%'
) - Lock等待时长(
SHOW PROCESSLIST;
) - Binlog写入延迟(
Seconds_Behind_Master
)
自动化运维增强实践
Ansible Playbook示例
name: Ensure Nginx is running and monitored hosts: webservers tasks: name: Start Nginx service service: name: nginx state: started enabled: yes name: Deploy Prometheus exporter copy: src: nginx-prometheus-exporter.tar.gz dest: /opt/ remote_src: no name: Add systemd unit file template: src: exporter.service.j2 dest: /etc/systemd/system/nginx-exporter.service notify: Reload daemon
shell脚本监控模板
#!/bin/bash SERVICE="redis-server" MAX_RETRIES=3 COUNTER=0 while true; do if ! systemctl is-active "$SERVICE" >/dev/null 2>&1; then ((COUNTER++)) echo "$(date) $SERVICE down! Attempting restart..." >> /var/log/service_monitor.log systemctl restart "$SERVICE" || { echo "Restart failed!"; exit 1; } sleep 5 else COUNTER=0 fi [ $COUNTER -ge $MAX_RETRIES ] && { echo "Max retries reached!"; exit 1; } sleep 60 done
相关问答FAQs
Q1: 为什么有时systemctl显示服务正在运行,但实际功能不可用?
A: 这是典型的”僵尸进程”现象,可能原因包括:①主进程已崩溃但子进程仍在运行;②服务挂起在初始化阶段未完成;③配置文件变更未生效,建议执行systemctl reset-state <service>
强制重置状态,并检查journalctl -xe
获取完整启动日志。
Q2: 如何在不安装额外软件的情况下实现简单的服务健康检查?
A: 可采用以下组合方案:①nc -zv <port>
检测端口可达性;②curl --silent --head http://localhost/health
验证HTTP端点;③pgrep -c <process>
统计进程数量,将这些命令整合到crontab定时任务中,配合邮件通知即可构建简易