prometheus pushgateway 性能差的解决办法

这篇具有很好参考价值的文章主要介绍了prometheus pushgateway 性能差的解决办法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基本现状

我们是分区分服的游戏,生产环境会有几百上千个游戏服进程,这些进程都想接入 prometheus 做一些指标监控。优化前的状况是:

  • 全局只部署一个 pushgateway。
  • 每个物理服会部署 50 个左右的游戏服进程,每个进程定时打印指标到各自的指标 log 文件。
  • 每个物理服部署一个定时脚本,每 10 秒串行的采集各个指标 log,并通过 curl post 给 pushgateway。
  • prometheus 从 pushgateway pull 指标。

没有直接在游戏服进程中内置 exporter 的原因大致有:

  • 上线之后才考虑加上 prometheus 监控,不想做太多改动,毕竟还涉及端口暴露之类的问题,需要运维配合修改开服脚本。
  • 进程量太多了,而且频繁开新服、合服,需要频繁修改 prometheus 配置。

其实以上都是借口,不过多年的经验告诉我,让 prometheus 从上千个进程 pull 指标,估计也会出现一些性能问题:)

存在的问题

pushgateway 性能太差,不足以支撑这样的并发量,每个 post 的延迟为 5 秒左右,而定时脚本是串行工作的,所以每一轮总耗时为 250 秒左右,完全是不可用状态。

优化措施

我对 prometheus、pushgateway 做了一些研究,经过几次优化,单轮延迟从 250 秒下降到 0.1 秒,达到可用状态。下面逐一介绍我使用过的优化手段,其中优化一跟优化三带来的效果是最明显的。

优化一:多个游戏服的指标合并发送。
  • 优化效果
    单轮延迟从 250 秒下降到 6 秒。

  • 具体做法
    定时脚本每轮采集完本机上所有的指标 log,把内容合并后再一次性 post 给 pushgateway。
    prometheus 的指标是这样定义的:

指标名{标签,...} 指标值

比如:

memory{"server_id":1,"zone":1001,"service":"clusterd"} 10000

prometheus 会从多个 target pull 指标,但它并不是很关心一个指标是从哪个 target 来的(虽然可以配置不同 target 给指标附加一些特定的标签值),只要保证 “指标名+标签” 是唯一的就够了。我们的 server_id 是唯一的,能够保证唯一性。

优化二:pushgateway 开启 gzip 支持
  • 优化效果
    单轮延迟从 6 秒降到 4 秒。文档的压缩率挺高,1.7MB 的 log 文件经过压缩后是 94KB。

  • 具体做法
    关于 gzip 使用的说明 https://github.com/prometheus/pushgateway#request-compression:

Request compression
The body of a POST or PUT request may be gzip- or snappy-compressed. Add a header Content-Encoding: gzip or Content-Encoding: snappy to do so.

echo "some_metric 3.14" | gzip | curl -H 'Content-Encoding: gzip' --data-binary @- http://pushgateway.example.org:9091/metrics/job/some_job
优化三:每个物理服部署 pushgateway
  • 优化效果
    单轮延迟从 4 秒下降到 0.1 秒。

  • 具体做法
    直接在每个物理服上部署一个 pushgateway,服务于本服上的所有游戏服进程;prometheus 修改配置,从多个 pushgateway pull 数据。虽然 pushgateway 数量增加了,但其实没增加多少,以 1000 个游戏服,每个物理服部署 50 个游戏服计算,也才 20 个 pushgateway,对 prometheus 来说压力不大。


以上优化完,整个拓扑大概是这样子:
pushgateway 性能,backend,prometheus

优化过程回顾

在 pushgateway 的 github 主页 (https://github.com/prometheus/pushgateway),README.md 最开始就写了设计初衷:

The Prometheus Pushgateway exists to allow ephemeral and batch jobs to expose their metrics to Prometheus. Since these kinds of jobs may not exist long enough to be scraped, they can instead push their metrics to a Pushgateway. The Pushgateway then exposes these metrics to Prometheus.

而我并没有注意到这个,很多人也都没注意到这个。我花了不少时间在 github issues 搜索 performance 相关的 issue;在 google 搜索 “pushgateway 性能差”、“pushgateway bad performance”,但都没啥收获。

唯一的收获是发现新版本的 pushgateway 支持 gzip 了,但这个带来的效果并不怎么明显。

关于 performance,这个 issue “Feature request: Multi-thread support #402” (https://github.com/prometheus/pushgateway/issues/402) 说的内容跟我的场景有点类似。他提到他们有 1000 个 client 需要发指标给 pushgateway,当只有一个 pushgateway 时请求延迟是 4 分钟,当数量增加到三个之后,请求延迟下降到 12 秒,所以他问 pushgateway 是否能提供多线程支持。而项目维护者的回复是:

https://github.com/prometheus-community/PushProx may be helpful for your use case, but as said, details need to be discussed elsewhere.

Also note that using the PGW to allow push with Prometheus is not just a performance problem. There are loads of semantic problems, too (like inability to deal with metric inconsistencies, up-monitoring, staleness handling, …). That’s why I like to keep the PGW simple and focused on what it is meant for.

pushgateway 的维护者说得也有道理,要 “keep the PGW simple and focusd on what it is meant for”, blah blah …。哎,反正他懒得优化的时候,这些都是说得过去的说辞。

不过也没关系,通过这些优化手段:1.批量合并指标数据 2.多进程方式部署 pushgateway,我们也达到了优化目标,并且能扛住未来数据量的增长。

总结

  • pushgateway 没有多线程支持,并发性能很差,并且未来也不考虑支持多线程,因为它的设计目标不在于此。
  • pushgateway 在生产环境应该以多进程的方式进行部署,可以每个物理服部署一个进程。
  • 往 pushgateway 发送指标数据的时候,尽量把数据合并起来发送,减少发送的次数,合并的时候想办法保证 “指标名+标签” 唯一就行了。
  • 使用一个工具前,需要深入了解此工具的设计初衷、适用场景、性能局限等。
  • 一个项目的文档,最关键的内容往往放在最开头,不妨花点时间好好读一读。

本文首发于我的博客:https://blog.antsmallant.top/2023/09/14/prometheus-pushgateway文章来源地址https://www.toymoban.com/news/detail-789870.html

到了这里,关于prometheus pushgateway 性能差的解决办法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • grafana+prometheus+pushgateway+flink可视化实时监控

    采集层 flink APP和linux system两部分,是我们要收集指标数据的组件 传输层 Pushgateway:是一个推送收集和推送数据的组件 Node_exporter:数据导出组件 存储计算层 Prometheus:系统监控和预警框架 应用层 Grafana:可视化展示平台 浏览器打开: http://ip服务器:9090 修改配置文件 promethe

    2024年02月13日
    浏览(35)
  • AttributeError: module ‘backend_interagg‘ has no attribute ‘FigureCanvas‘的解决办法

    是在使用python的matplotlib库的时候发现无法绘制和老师一样的图 一开始我还以为是我的matoltlib和我的python版本不匹配后面发现真正原因其实是matplotlib 的 backend的默认渲染器是agg,agg是一个没有图形显示界面的终端,如果要图像正常显示,则需要切换为图形界面显示的终端TkA

    2024年02月06日
    浏览(37)
  • Python 报错 “ AttributeError: module ‘backend_interagg‘ has no attribute ‘FigureCanvas‘ “ 的解决办法 ?

    一、原因 matplotlib 的 backend的默认渲染器是agg,agg是一个没有图形显示界面的终端,如果要图像正常显示,则需要切换为图形界面显示的终端TkAgg。 二、解决办法 修改为:

    2024年02月03日
    浏览(38)
  • NotImplementedError: Could not run ‘torchvision::nms‘ with arguments from the ‘CUDA‘ backend解决办法

    NotImplementedError: Could not run \\\'torchvision::nms\\\' with arguments from the \\\'CUDA\\\' backend. This could be because the operator doesn\\\'t exist for this backend, or was omitted during the selective/custom build process (if using custom build). If you are a Facebook employee using PyTorch on mobile, please visit https://fburl.com/ptmfixes for possible resoluti

    2024年02月17日
    浏览(46)
  • uni-app 使用 Uview2.x 搭建自定义tabbar组件,自定义navbar,还会解决自定义导航栏引起闪烁性能差的问题!!!

    pages.json  上面可以看到tabbar我使用的原生的,但是值配置了pagepath,并且page里三个首页都可以自定义顶部导航栏,当然如果删掉custom那一行代码,就切换成原生顶部导航栏了。 下面拿一个首页作为代码演示:(顶部自定义导航栏组件和底部导航栏组件会放在最后) 下图组件

    2023年04月09日
    浏览(85)
  • 无线路由信号很差的解决妙招 用易拉罐

    因为墙壁的阻隔,很多朋友家里的WiFi并非都是满格,甚至还存在WiFi死角。那这该怎么办呢?下面教大家DIY一个“WiFi放大器”,管不管用试试就知道。 原理: 为什么易拉罐信号放大器有增强信号的作用呢?网络工程师介绍,原理是易拉罐的内表面反射了无线电波,加强了天

    2024年02月08日
    浏览(41)
  • Qt 性能优化:CPU占有率高的现象和解决办法

    在最近的项目中,发现执行 Qt 程序时,有些情况下的 CPU 占用率奇高,最高高达 100%。项目跑在嵌入式板子上,最开始使用 EGLFS 插件,但是由于板子没有单独的鼠标层,导致鼠标移动起来卡顿,很不流畅,所以换成了 LinuxFB 插件。但是如果 CPU 占有率高了的话,也会导致鼠标

    2023年04月08日
    浏览(36)
  • Prometheus监控指标查询性能调优

    一、背景 在《SRE: Google运维解密》一书中作者指出,监控系统需要能够有效的支持白盒监控和黑盒监控。黑盒监控只在某个问题目前正在发生,并且造成了某个现象时才会发出紧急警报。“白盒监控则大量依赖对系统内部信息的检测,如系统日志、抓取提供指标信息的 HTTP 节

    2024年02月13日
    浏览(42)
  • 性能监控平台 | Prometheus+InfluxDB + Grafana!

    在本文中,我将把几个常用的监控部分给梳理一下。前面我们提到过,在性能监控图谱中,有操作系统、应用服务器、中间件、队列、缓存、数据库、网络、前端、负载均衡、Web 服务器、存储、代码等很多需要监控的点。显然这些监控点不能在一个专栏中全部覆盖并一一细化

    2024年02月13日
    浏览(71)
  • 性能监控平台:基于 Prometheus+InfluxDB + Grafana|果断收藏

    在本文中,我将把几个常用的监控部分给梳理一下。前面我们提到过,在性能监控图谱中,有操作系统、应用服务器、中间件、队列、缓存、数据库、网络、前端、负载均衡、Web 服务器、存储、代码等很多需要监控的点。显然这些监控点不能在一个专栏中全部覆盖并一一细化

    2024年02月07日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包