Linux服务器监控实战:从Prometheus+Grafana部署到告警配置

📅 2026/6/24 18:33:47
Linux服务器监控实战:从Prometheus+Grafana部署到告警配置
1. 从“黑盒”到“白盒”为什么我们需要监控Linux服务器如果你管理过一台Linux服务器无论是个人博客的VPS还是公司内部的应用服务器你大概率经历过这样的场景半夜被电话吵醒用户反馈网站打不开了。你手忙脚乱地登录服务器敲下top或df -h发现CPU已经跑满或者磁盘空间被日志文件塞爆。问题虽然最终解决了但整个过程充满了被动和不确定性——我们总是在问题发生后才去“救火”服务器在大部分时间里对我们而言就像一个“黑盒”。这正是服务器监控要解决的核心问题将“黑盒”变为“白盒”。监控不是简单的“看看数据”而是一个主动的、持续的观测体系。它的价值在于预见性和可观测性。通过监控我们能在用户感知到卡顿之前就发现CPU使用率的缓慢爬升趋势能在磁盘被完全写满导致服务崩溃前收到空间不足的预警能在内存泄漏吞噬掉所有资源前定位到可疑的进程。这不仅仅是技术活更是一种运维理念的转变——从被动响应到主动管理。对于任何一位系统管理员、开发工程师或DevOps从业者来说掌握一套行之有效的Linux服务器监控方法是保障服务稳定性的基本功。无论你是运维单台服务器的新手还是管理庞大集群的专家构建清晰的监控视野都是不可或缺的一环。接下来我将结合多年的实战经验为你拆解一套从零开始、覆盖核心指标的监控方案让你对自己的服务器状态了如指掌。2. 监控体系的核心四要素指标、采集、存储与告警在动手部署任何监控工具之前我们必须先理解一个完整监控体系的四个核心组成部分。这就像建造房屋需要地基、框架、墙壁和屋顶一样缺一不可。盲目地安装一堆工具而不理解其背后的逻辑往往会导致数据混乱、告警疲劳最终让监控系统本身成为负担。2.1 我们需要监控什么关键指标分类服务器监控的指标浩如烟海但归根结底可以归纳为四大类我习惯称之为“USE”黄金法则的扩展1. 资源利用率Utilization这是最基础的指标反映了服务器硬件资源的“忙碌”程度。CPU%user用户态、%system内核态、%iowait等待I/O。需要警惕的是%iowait高往往意味着磁盘或网络存在瓶颈而非CPU本身。内存used、free、buff/cache。这里有个关键误区Linux会利用空闲内存作磁盘缓存buff/cache所以看到free内存很少不必惊慌重点应关注available内存它才是真正可供程序使用的内存。磁盘%util磁盘繁忙度、awaitI/O平均等待时间。比起单纯的磁盘使用率%util和await更能反映磁盘的性能瓶颈。一个使用率90%但%util很低的磁盘可能比使用率50%但%util持续100%的磁盘更健康。网络bytes_in/out、packets_in/out、errs/drop。流量突增可能是业务增长也可能是被攻击而errs/drop持续增长则几乎总是网络或配置问题的信号。2. 饱和度Saturation指资源排队等待的程度是反映系统“压力”和“延迟”的先兆指标。CPUload average系统平均负载。这个值需要结合CPU核心数来看。例如4核CPU如果1分钟负载长期高于4说明系统已经过载有进程在排队等待CPU。内存swap used交换分区使用量。一旦开始使用swap意味着物理内存已不足性能会急剧下降。监控swap的增长速率比监控其绝对值更重要。磁盘I/O队列长度。这直接反映了磁盘的繁忙程度是判断存储性能瓶颈的关键。3. 错误Errors任何错误数量的增长都是需要立即关注的信号。系统日志/var/log/messagesdmesg中的硬件错误、文件系统错误。网络接口的error、drop包计数。应用服务的错误日志和异常退出。4. 业务与服务质量SLA这是监控的终极目标一切资源监控都是为了保障业务。应用层面HTTP请求成功率200 vs 5xx、接口响应时间P95 P99、关键业务事务的吞吐量。服务层面数据库查询耗时、缓存命中率、消息队列堆积长度。实操心得不要试图监控所有指标。初期应聚焦于上述核心资源指标和1-2个最关键的业务指标。一个常见的错误是收集了海量数据却无人查看。监控的“信号”必须远大于“噪音”。2.2 监控数据的生命周期采集、存储、展示与告警理解了“监控什么”接下来要看“数据怎么流转”。这是一个标准的管道Pipeline采集Collection在目标服务器上运行轻量级的代理Agent定期如每15秒抓取系统指标和应用指标。常用的工具有node_exporter用于系统指标、各种应用特有的exporter如mysqld_exporter。存储Storage采集到的时序数据需要被发送到一个专门的数据存储中。这类存储需要具备高效写入、压缩存储和快速按时间范围查询的能力。Prometheus是当前云原生生态的事实标准它内置了强大的时序数据库。展示与查询Visualization Query原始数据是冰冷的数字我们需要通过仪表盘Dashboard将其可视化。Grafana是目前最强大的可视化工具它能连接多种数据源如Prometheus通过灵活的图表和面板让你一目了然地掌握全局状态。告警Alerting当某个指标超过预设的阈值如CPU使用率80%持续5分钟监控系统需要能主动通知我们。Prometheus的Alertmanager组件负责处理告警支持去重、分组、静默并能通过邮件、钉钉、企业微信、Slack、PagerDuty等多种渠道发送通知。这套组合Prometheus node_exporter Grafana因其开源、强大、生态丰富已成为现代监控领域的事实标准。下面我们就以这套组合为例进行实战部署。3. 实战部署搭建Prometheus监控栈理论说得再多不如亲手搭建一遍。我们假设你有一台需要被监控的Linux服务器称为“目标机”和另一台用于运行监控服务端的机器称为“监控机”。为了简化我们先在目标机上部署所有组件生产环境建议分离。3.1 第一步部署数据采集器 node_exporternode_exporter是Prometheus官方提供的系统指标采集器它通过一个HTTP服务暴露大量的系统指标。1. 下载与安装首先访问 Prometheus官方下载页 找到最新版本的node_exporter。我们使用命令行操作# 创建专用用户安全最佳实践 sudo useradd --no-create-home --shell /bin/false node_exporter # 下载并解压请将链接中的版本号替换为最新版 wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz tar xvf node_exporter-1.6.1.linux-amd64.tar.gz # 将二进制文件移动到系统目录并设置权限 sudo cp node_exporter-1.6.1.linux-amd64/node_exporter /usr/local/bin/ sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter2. 创建系统服务Systemd Unit为了让node_exporter能随系统启动并受systemd管理我们需要创建一个服务文件sudo vi /etc/systemd/system/node_exporter.service将以下内容写入文件[Unit] DescriptionNode Exporter Wantsnetwork-online.target Afternetwork-online.target [Service] Usernode_exporter Groupnode_exporter Typesimple ExecStart/usr/local/bin/node_exporter [Install] WantedBymulti-user.target3. 启动并验证# 重载systemd配置 sudo systemctl daemon-reload # 启动服务 sudo systemctl start node_exporter # 设置开机自启 sudo systemctl enable node_exporter # 检查服务状态 sudo systemctl status node_exporter # 测试指标接口默认端口9100 curl http://localhost:9100/metrics如果能看到大量以node_开头的指标文本输出如node_cpu_seconds_total说明node_exporter已成功运行。踩坑提示默认情况下node_exporter监听在0.0.0.0:9100。在生产环境中如果监控机与目标机不在同一安全组或防火墙后你需要通过防火墙或安全组规则仅允许监控机的IP访问目标机的9100端口这是最基本的安全加固。3.2 第二步部署监控核心 Prometheus ServerPrometheus Server 负责定时去拉取scrapenode_exporter暴露的指标并存储到时序数据库中。1. 下载与安装同样从官网下载Prometheus Server# 创建专用用户 sudo useradd --no-create-home --shell /bin/false prometheus # 创建配置和数据目录 sudo mkdir /etc/prometheus /var/lib/prometheus sudo chown prometheus:prometheus /etc/prometheus /var/lib/prometheus # 下载并解压替换为最新版本 wget https://github.com/prometheus/prometheus/releases/download/v2.47.0/prometheus-2.47.0.linux-amd64.tar.gz tar xvf prometheus-2.47.0.linux-amd64.tar.gz # 复制二进制文件和配置文件 sudo cp prometheus-2.47.0.linux-amd64/prometheus /usr/local/bin/ sudo cp prometheus-2.47.0.linux-amd64/promtool /usr/local/bin/ sudo cp -r prometheus-2.47.0.linux-amd64/consoles /etc/prometheus/ sudo cp -r prometheus-2.47.0.linux-amd64/console_libraries /etc/prometheus/ sudo chown prometheus:prometheus /usr/local/bin/prometheus /usr/local/bin/promtool sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus2. 配置Prometheus这是最关键的一步我们需要告诉Prometheus去哪里拉取数据。编辑主配置文件sudo vi /etc/prometheus/prometheus.yml一个最基础的配置如下global: scrape_interval: 15s # 每15秒抓取一次指标 evaluation_interval: 15s # 每15秒评估一次告警规则 rule_files: # - first_rules.yml # - second_rules.yml scrape_configs: - job_name: prometheus # 监控Prometheus自身 static_configs: - targets: [localhost:9090] - job_name: node # 监控Linux节点 static_configs: - targets: [localhost:9100] # 这里填写node_exporter的地址 labels: instance: my_first_server # 给这个目标打上一个实例标签用于区分多台机器3. 创建Systemd服务并启动sudo vi /etc/systemd/system/prometheus.service写入内容[Unit] DescriptionPrometheus Wantsnetwork-online.target Afternetwork-online.target [Service] Userprometheus Groupprometheus Typesimple ExecStart/usr/local/bin/prometheus \ --config.file /etc/prometheus/prometheus.yml \ --storage.tsdb.path /var/lib/prometheus/ \ --web.console.templates/etc/prometheus/consoles \ --web.console.libraries/etc/prometheus/console_libraries \ --web.listen-address0.0.0.0:9090 [Install] WantedBymulti-user.target启动服务sudo systemctl daemon-reload sudo systemctl start prometheus sudo systemctl enable prometheus sudo systemctl status prometheus现在你可以通过浏览器访问http://你的服务器IP:9090打开Prometheus的Web UI。在“Status - Targets”页面应该能看到node和prometheus两个job的状态都是“UP”。3.3 第三步部署可视化仪表盘 GrafanaPrometheus的UI主要用于调试和查询真正的仪表盘需要Grafana来打造。1. 安装Grafana这里以Ubuntu/Debian系统为例使用官方仓库安装# 安装依赖 sudo apt-get install -y software-properties-common wget # 添加Grafana官方仓库的GPG密钥 sudo wget -q -O /usr/share/keyrings/grafana.key https://apt.grafana.com/gpg.key # 添加稳定版仓库 echo deb [signed-by/usr/share/keyrings/grafana.key] https://apt.grafana.com stable main | sudo tee -a /etc/apt/sources.list.d/grafana.list # 更新并安装 sudo apt-get update sudo apt-get install -y grafana2. 启动Grafana并添加数据源sudo systemctl start grafana-server sudo systemctl enable grafana-server访问http://你的服务器IP:3000默认用户名和密码都是admin首次登录会要求修改密码。登录后点击左侧齿轮图标“Configuration”选择“Data Sources”。点击“Add data source”选择“Prometheus”。在URL一栏填写http://localhost:9090如果Grafana和Prometheus装在同一台机器。其他保持默认点击最下方的“Save Test”。如果显示“Data source is working”说明连接成功。3. 导入现成的仪表盘从头创建仪表盘很耗时社区有大量优秀的模板。最著名的Linux节点监控仪表盘是“Node Exporter Full”ID1860。在Grafana首页点击左侧“”号选择“Import”。在“Import via grafana.com”框中输入1860点击Load。选择我们刚才添加的Prometheus数据源点击“Import”。瞬间一个功能全面、图表丰富的服务器监控仪表盘就呈现在你眼前了这里包含了CPU、内存、磁盘、网络、系统负载等几乎所有核心指标的图表。4. 从监控到洞察告警配置与高级技巧有了仪表盘我们实现了“可视化”。但监控的最终目的是“自动化响应”即当问题发生时系统能主动通知我们而不是让我们不停地刷新仪表盘。这就需要配置告警。4.1 配置Prometheus告警规则告警规则定义了在什么条件下触发告警。我们创建一个简单的内存使用率告警规则。1. 创建告警规则文件sudo vi /etc/prometheus/rules/node_alerts.yml写入以下内容groups: - name: node_alerts rules: - alert: HighMemoryUsage expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 85 for: 5m # 持续5分钟满足条件才触发避免瞬时尖峰 labels: severity: warning annotations: summary: 高内存使用率 (实例 {{ $labels.instance }}) description: 内存使用率超过85%当前值为 {{ $value | humanize }}%。这个规则的意思是计算总内存 - 可用内存/ 总内存 * 100%如果结果大于85%并且持续5分钟则触发一个严重级别为“warning”的告警。2. 修改Prometheus配置以加载规则编辑prometheus.yml取消rule_files部分的注释并指向我们的规则文件rule_files: - rules/node_alerts.yml # 相对于prometheus.yml的路径重启Prometheus服务使配置生效sudo systemctl restart prometheus在Prometheus Web UI的“Alerts”标签页你应该能看到这条告警规则当前状态为“inactive”未触发。4.2 部署与配置AlertmanagerPrometheus负责“触发”告警而Alertmanager负责“处理”告警包括去重、分组、静默并通过各种渠道发送通知。1. 下载与安装Alertmanagerwget https://github.com/prometheus/alertmanager/releases/download/v0.25.0/alertmanager-0.25.0.linux-amd64.tar.gz tar xvf alertmanager-0.25.0.linux-amd64.tar.gz sudo cp alertmanager-0.25.0.linux-amd64/alertmanager /usr/local/bin/ sudo cp alertmanager-0.25.0.linux-amd64/amtool /usr/local/bin/ # 创建用户和目录 sudo useradd --no-create-home --shell /bin/false alertmanager sudo mkdir /etc/alertmanager /var/lib/alertmanager sudo chown alertmanager:alertmanager /etc/alertmanager /var/lib/alertmanager2. 配置Alertmanager以邮件告警为例创建配置文件/etc/alertmanager/alertmanager.yml。你需要一个可用的SMTP服务器如公司邮箱、QQ邮箱、SendGrid等。global: smtp_smarthost: smtp.qq.com:587 # QQ邮箱SMTP服务器 smtp_from: your_emailqq.com smtp_auth_username: your_emailqq.com smtp_auth_password: your_authorization_code # 注意QQ邮箱需用授权码非登录密码 smtp_require_tls: true route: group_by: [alertname, instance] # 按告警名和实例分组 group_wait: 30s # 同一分组内等待30秒再发送用于合并相同告警 group_interval: 5m # 同一分组内两次告警通知的最小间隔 repeat_interval: 4h # 如果告警未解决重复发送通知的间隔 receiver: email-notifications receivers: - name: email-notifications email_configs: - to: your_target_emailexample.com send_resolved: true # 告警恢复时也发送通知3. 创建Systemd服务并启动sudo vi /etc/systemd/system/alertmanager.service[Unit] DescriptionAlertmanager Wantsnetwork-online.target Afternetwork-online.target [Service] Useralertmanager Groupalertmanager Typesimple ExecStart/usr/local/bin/alertmanager \ --config.file/etc/alertmanager/alertmanager.yml \ --storage.path/var/lib/alertmanager/ [Install] WantedBymulti-user.targetsudo systemctl daemon-reload sudo systemctl start alertmanager sudo systemctl enable alertmanager4. 修改Prometheus配置指向Alertmanager最后需要告诉Prometheus将告警发送给Alertmanager。在prometheus.yml的全局配置下添加alerting: alertmanagers: - static_configs: - targets: - localhost:9093 # Alertmanager默认端口重启Prometheus。现在当你服务器的内存使用率持续5分钟超过85%时Prometheus会触发告警并将其推送给AlertmanagerAlertmanager则会根据配置向你指定的邮箱发送一封告警邮件。4.3 高级监控技巧与避坑指南部署完基础监控栈只是第一步要让监控真正产生价值还需要一些进阶技巧。1. 监控多台服务器当你有第二台服务器需要监控时只需在那台服务器上安装node_exporter然后在Prometheus的prometheus.yml配置文件中修改nodejob的targets列表即可scrape_configs: - job_name: node static_configs: - targets: [server1_ip:9100, server2_ip:9100] labels: instance: web_server_01 - targets: [server2_ip:9100] labels: instance: db_server_01通过instance标签你可以在Grafana和告警中清晰地区分不同服务器。2. 使用Push Gateway监控短期作业node_exporter和大多数exporter采用Pull拉取模式即Prometheus主动去抓取。但对于运行时间很短如定时任务Cron Job的作业它们可能在下一次抓取前就结束了。这时需要使用Push Gateway。作业在结束时将指标推送到Push GatewayPrometheus再从Gateway拉取。3. 关键避坑点指标基数爆炸避免使用高基数的标签如用户ID、请求ID作为指标标签这会导致Prometheus存储的数据量急剧膨胀甚至崩溃。标签应具有有限的、可枚举的值如状态码、接口名、实例名。告警疲劳不要设置过于敏感或无关紧要的告警。告警应该是需要人工干预的、紧急的事件。一个好的原则是如果收到告警后你不知道该做什么或者它总是不需要处理就自动恢复那么这个告警可能没必要存在。存储与保留策略Prometheus默认将数据存储在本地保留15天。对于长期历史数据查询或大规模集群需要考虑远程存储方案如Thanos、Cortex、VictoriaMetrics或调整--storage.tsdb.retention.time参数。安全务必为Prometheus、Alertmanager、Grafana设置强密码或启用其他认证方式如OAuth。不要将管理界面9090 3000 9093端口暴露在公网。5. 超越基础应用监控与业务健康度系统资源监控是基石但真正决定服务质量的往往是应用本身。一个CPU、内存、磁盘都正常的服务器上面的应用可能因为死锁、慢查询、内存泄漏而濒临崩溃。因此必须将监控视角延伸到应用层。1. 应用指标埋点对于自行开发的应用应在代码中集成监控客户端库如Prometheus的官方客户端库支持Go、Java、Python等主流语言暴露诸如http_requests_totalHTTP请求总数。http_request_duration_seconds请求耗时分布Histogram类型用于计算P95 P99。app_errors_total应用内部错误计数。queue_size内部任务队列长度。这些指标可以通过/metrics端点暴露由Prometheus统一抓取。2. 中间件与数据库监控几乎所有主流中间件都有对应的Prometheus ExporterMySQL使用mysqld_exporter监控连接数、慢查询、锁等待、复制状态。Redis使用redis_exporter监控内存使用、命中率、阻塞客户端数。Nginx使用nginx-prometheus-exporter或修改Nginx配置使用ngx_http_stub_status_module模块暴露状态页。DockerPrometheus可以直接抓取Docker Daemon的指标需配置或使用cAdvisor监控容器资源。将这些exporter部署在对应的服务旁并在Prometheus中配置新的抓取任务你就能在Grafana中构建出从基础设施到应用服务的全栈监控视图。3. 合成监控Synthetic Monitoring除了被动的指标抓取还可以从外部主动探测服务的可用性。例如使用Blackbox Exporter从多个地理位置的探测点定期对网站的HTTP、HTTPS、TCP、ICMP等进行检测监控其可用性和响应时间。这能帮助你发现因网络问题或DNS故障导致的、从服务器内部无法察觉的服务中断。构建一个完整的监控体系是一个迭代的过程。从最核心的系统指标开始逐步添加应用指标、业务指标并不断完善告警规则和仪表盘。最重要的是要让监控数据驱动决策——当告警响起时团队有明确的应对流程当性能趋势下滑时能提前规划扩容。最终监控不再是冰冷的数字面板而是维系系统稳定运行的“神经系统”。