温馨提示×

C++应用在CentOS如何监控

小樊
40
2025-11-21 22:35:16
栏目: 编程语言

C++应用在 CentOS 的监控实践

一 系统层监控

  • 实时与多维资源查看
    • 使用 top/htop 观察进程的 CPU、内存、线程 使用;vmstat 查看 进程、内存、CPU、I/O 综合指标;iostat 聚焦 磁盘 I/Osar(需安装 sysstat)做历史与系统活动报告;dstat 整合多类资源统计;nmon 提供交互式界面并支持导出 CSVGlances 提供跨平台的综合监控视图。
  • 安装与快速上手
    • 安装常用工具: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 + PrometheusZabbix 配置图表与阈值告警
  • 日志与追踪
    • 结构化日志(JSON)输出 请求ID、耗时、错误码;关键路径打点;定期 日志轮转归档

0