2026/4/6 17:08:27
网站建设
项目流程
1. 为什么需要进程级资源监控在日常运维工作中我们经常会遇到服务器负载突然升高的情况。这时候最让人头疼的就是找不到具体是哪个进程在消耗资源。传统的系统监控工具只能看到整体CPU、内存使用率就像站在高楼上看城市车流只能知道堵车但不知道具体是哪条路上出了事故。去年我们线上环境就发生过一次事故某台服务器内存突然耗尽导致服务崩溃。当时用top命令看了半天只能看到Java进程占用了大量内存但具体是哪个Java应用、哪个业务模块导致的却无从得知。这就是典型的知道病了但找不到病灶的情况。进程级监控就像给系统装上X光机能清晰看到每个进程的CPU使用率区分用户态和内核态内存占用详情包括常被忽视的共享内存线程数量变化趋势文件描述符使用情况这套PrometheusProcess-ExporterGrafana组合方案我在5个生产环境集群部署后排查效率提升了80%以上。下面我就手把手带你实现这个系统透视镜。2. 环境准备与组件部署2.1 组件角色说明先理清这三个工具的分工Prometheus监控数据存储和告警中枢相当于监控系统的大脑Process-Exporter专门采集进程级指标的侦察兵Grafana数据可视化平台把数字变成直观的图表建议使用最新稳定版本Prometheus ≥ 2.30Process-Exporter ≥ 0.7.5Grafana ≥ 8.32.2 Process-Exporter安装配置下载二进制包以Linux x86_64为例wget https://github.com/ncabatoff/process-exporter/releases/download/v0.7.5/process-exporter-0.7.5.linux-amd64.tar.gz tar zxvf process-exporter-*.tar.gz sudo mv process-exporter-*/process-exporter /usr/local/bin/创建配置文件/etc/process-exporter.yaml这是核心所在process_names: - name: {{.Comm}} cmdline: - .这个配置表示监控所有进程按进程名Comm分组。如果想更精细控制可以这样配置process_names: - name: {{.Matches}} cmdline: - /usr/bin/python.*app.py # 匹配Python应用 - /opt/jdk/bin/java.*order-service # 匹配Java订单服务启动服务建议用systemd管理sudo systemctl start process-exporter验证是否正常工作curl http://localhost:9256/metrics你应该能看到类似这样的输出# HELP namedprocess_namegroup_cpu_seconds_total CPU usage # TYPE namedprocess_namegroup_cpu_seconds_total counter namedprocess_namegroup_cpu_seconds_total{groupnamenginx} 1254.323. Prometheus集成配置3.1 基础配置修改prometheus.yml新增jobscrape_configs: - job_name: process_exporter static_configs: - targets: [server1:9256, server2:9256] relabel_configs: - source_labels: [__address__] regex: (.*):.* target_label: instance replacement: $1这里有个实用技巧用relabel_configs把IP:PORT格式的target转换成易读的实例名。3.2 高级配置技巧多实例自动发现如果服务器很多建议用文件服务发现scrape_configs: - job_name: process_exporter file_sd_configs: - files: [/etc/prometheus/targets/process_exporters.yml]然后在/etc/prometheus/targets/process_exporters.yml中维护目标列表- labels: env: production region: east targets: - web01:9256 - db01:9256指标过滤如果只需要特定指标可以配置metric_relabel_configsmetric_relabel_configs: - source_labels: [__name__] regex: namedprocess_namegroup_(cpu|memory).* action: keep重载配置curl -X POST http://localhost:9090/-/reload4. Grafana监控面板配置4.1 导入官方仪表板Process-Exporter官方提供了开箱即用的仪表板在Grafana中点击Create → Import输入仪表板ID249这是官方模板选择Prometheus数据源4.2 核心指标解析CPU监控公式sum(irate(namedprocess_namegroup_cpu_seconds_total{instanceweb01}[5m])) by (groupname) * 100 / on(instance) group_left sum(count without(cpu, mode)(node_cpu_seconds_total{modeidle,instanceweb01})) by (instance)这个公式比简单除以CPU核心数更准确irate([5m])计算5分钟内的CPU使用速率sum by (groupname)按进程分组统计on(instance) group_left关联节点CPU总数最终结果是每个进程的真实CPU利用率百分比内存监控公式sum(namedprocess_namegroup_memory_bytes{instanceweb01,memtyperesident}) by (groupname) / on(instance) group_left node_memory_MemTotal_bytes{instanceweb01} * 100关键参数说明resident实际物理内存占用RSSproportionalResident考虑共享内存的PSS值virtual虚拟内存大小VIRT4.3 告警规则配置在Grafana中设置智能告警进程CPU持续高负载avg_over_time( sum(irate(namedprocess_namegroup_cpu_seconds_total{groupname~.*service}[5m])) by (groupname)[1h:1m] ) 80进程内存泄漏检测increase( namedprocess_namegroup_memory_bytes{memtyperesident}[1h] ) 1GB僵尸进程检测namedprocess_namegroup_states{stateZ} 05. 实战问题排查案例5.1 Java应用内存泄漏定位某次线上报警显示内存使用率达95%但传统监控只看到JVM占用高。通过进程监控发现Grafana显示order-service进程的PSS内存持续增长对比发现内存增长与订单量成正相关最终定位到是Redis连接未关闭导致关键指标公式sum(namedprocess_namegroup_memory_bytes{groupnamejava,memtypeproportionalResident}) by (instance)5.2 CPU毛刺问题分析用户投诉接口偶尔超时但平均CPU使用率只有30%。通过进程监控发现每5分钟有个report-generator进程会突然占用400% CPU对应时间点的线程数从50暴涨到200最终发现是SQL查询未加索引关键监控项# 线程数变化 namedprocess_namegroup_num_threads{groupnamereport-generator} # CPU使用率尖刺检测 rate(namedprocess_namegroup_cpu_seconds_total{groupnamereport-generator}[1m]) 106. 高级技巧与优化建议6.1 指标采集优化降低采集频率对于非关键进程可以调整采集间隔scrape_configs: - job_name: process_exporter scrape_interval: 2m static_configs: - targets: [dev-server:9256]指标过滤在Process-Exporter配置中排除系统进程process_names: - name: {{.Comm}} cmdline: - . exclude: true names: - systemd - sshd6.2 存储优化Prometheus默认会保存所有历史数据建议根据需求调整# prometheus.yml storage: retention: 15d # 生产环境建议7-30天对于长期存储可以配置Remote Write到VictoriaMetrics或Thanosremote_write: - url: http://victoriametrics:8428/api/v1/write6.3 安全防护基础认证为Process-Exporter添加HTTP认证# 启动时添加参数 process-exporter -web.listen-address:9256 -web.config.file/etc/process-exporter/web.ymlweb.yml配置示例basic_auth_users: admin: $2y$10$xxxxxxxx # bcrypt加密密码网络隔离建议在防火墙限制9256端口的访问iptables -A INPUT -p tcp --dport 9256 -s 192.168.1.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 9256 -j DROP