C++应用在CentOS如何监控
小樊
40
2025-11-21 22:35:16
C++应用在 CentOS 的监控实践
一 系统层监控
- 实时与多维资源查看
- 使用 top/htop 观察进程的 CPU、内存、线程 使用;vmstat 查看 进程、内存、CPU、I/O 综合指标;iostat 聚焦 磁盘 I/O;sar(需安装 sysstat)做历史与系统活动报告;dstat 整合多类资源统计;nmon 提供交互式界面并支持导出 CSV;Glances 提供跨平台的综合监控视图。
- 安装与快速上手
- 安装常用工具:sudo yum install -y sysstat htop nmon dstat glances
- 常用命令示例:
- top/htop -p $(pidof your_app)
- vmstat 1 10
- iostat -x 1 10
- sar -u -r -b 1 60
- dstat -c -m -d -n
- nmon -f -s 5 -c 12
- glances
- 使用要点
- 关注 CPU 使用率、内存 RSS/VSZ、文件描述符数、磁盘 await/rrqm/s、网络吞吐 等关键指标,结合业务阈值设置告警。
二 应用性能剖析
- perf 采样分析
- 用途:基于硬件性能计数器定位 热点函数、缓存命中/未命中、分支预测 等瓶颈。
- 示例:
- 记录:sudo perf record -g -p $(pidof your_app) -o perf.data sleep 30
- 报告:perf report -n --stdio
- 火焰图:perf script | stackcollapse-perf.pl | flamegraph.pl > flame.svg
- gprof 插桩分析
- 用途:获取函数调用次数与耗时,适合单线程或初步分析。
- 示例:g++ -pg -O2 app.cpp -o app && ./app && gprof app gmon.out > report.txt
- Valgrind 内存与缓存分析
- 用途:检测 内存泄漏、越界访问、未初始化内存;Cachegrind/Callgrind 做缓存与调用分析。
- 示例:valgrind --tool=memcheck --leak-check=full ./your_app
- 注意:Valgrind 会显著降低运行速度,适合测试/问题定位,不建议在性能压测中使用。
- 编译器与构建优化
- 发布构建建议:g++ -O2/-O3 -march=native -flto 提升性能;调试/剖析构建配合 -g 保留调试符号。
三 内存与资源泄漏定位
- Valgrind Memcheck
- 示例:valgrind --leak-check=full --log-file=valgrind.log ./your_app
- 输出会给出 definitely lost、indirectly lost、possibly lost 与调用栈,便于精准修复。
- gperftools(tcmalloc + heap profiler)
- 用途:替代默认分配器,提供 堆内存分配剖析、泄漏检测、线程缓存 等能力,适合长时间运行服务。
- 示例:
- 编译链接:g++ app.cpp -ltcmalloc -o app
- 开启堆剖析:HEAPPROFILE=/tmp/heapprof ./app
- 分析:pprof --text ./app /tmp/heapprof.0001.heap
- 代码层埋点与资源统计
- 使用 RAII 管理文件/锁/内存;在关键路径用 C++ 计时;结合日志库(如 spdlog/log4cpp)输出 指标与错误,并设置 日志轮转 防止磁盘占满。
四 运行稳定性与自愈
- 进程守护与自动拉起
- 使用 systemd 管理进程(推荐):创建 /etc/systemd/system/your_app.service
- 示例:
- [Unit]
- Description=Your C++ App
- After=network.target
- [Service]
- ExecStart=/usr/local/bin/your_app
- Restart=always
- User=appuser
- [Install]
- WantedBy=multi-user.target
- 启用:sudo systemctl daemon-reload && sudo systemctl enable --now your_app
- 无 systemd 时可用 Shell 守护脚本 + cron 周期检测进程是否存在并拉起,注意过滤 grep 自身与脚本名干扰,且脚本路径使用 绝对路径。
五 监控落地与告警建议
- 指标与阈值示例
- 进程存活:进程不存在即 严重告警
- CPU:持续 >80% 为警告,>90% 为严重
- 内存:RSS 持续接近 容器/系统上限 或 >80% 为警告
- 文件描述符:接近 ulimit -n 为警告
- 磁盘:await 明显升高或 磁盘使用率 >85% 为警告
- 网络:异常 丢包/重传 或带宽突增
- 采集与可视化
- 短期排查:优先用 perf/Valgrind/gperftools 获取函数级细节
- 长期观测:用 sar/nmon 做历史趋势,结合 Grafana + Prometheus 或 Zabbix 配置图表与阈值告警
- 日志与追踪
- 结构化日志(JSON)输出 请求ID、耗时、错误码;关键路径打点;定期 日志轮转 与 归档