点赞
评论
收藏
分享
举报
Ngnix性能数据采集造成服务耗时波动
发表于2020-05-31 16:29

浏览 5.4k

1、现象:

    某些服务请求响应时间有规律性波动,每分钟存在波动,在响应图上体现为明显的柱状。

image.png

2、分析过程:

    部署架构为两层nignxnginx(接入层)->nginx(路由层)然后是服务层各应用集群:

·       1)如下图所示,curl在服务器上调用也存在同样的问题,如下图所示,正常情况下3ms,但波动时>5s,因此调用存在nginx及后端。

image.png

·       2)Curl单独调用服务层接口没有问题,因此确定问题出现在nginx

·       3)绕过接入层nginx,直接调用路由层nginx地址仍然出现,因此定位故障在路由层。

·       4)路由层nginx,会在服务注册时候,定期进行relaod,从而影响性能,但通过检查linux的状态,没有发生过定期规律性的restart/reload

image.png

·       5)发现路由层nginx有每分钟的定时任务。

·       6)关闭监控采集程序后问题解决。

image.png

3、根源分析:

    PaaS监控组件Prometheus,会定时调用nginx监控模块,采集性能指标,用于性能分析、展现、告警。nginx指标提供模块,采用的是 prometheus-lua,在采集程序访问时候,该字典会被加锁,造成nginx的线程等待。因此在指标量越大,访问量越多,越受影响PaaS监控组件Prometheus每分钟调用linux的这个监控模块,会阻塞linux的服务,导致响应规律性的波动,并且由于该省访问量大,集群规模大,因此受到的影响更高。通过将prometheus-lua切换为nginxvts模块问题解决。

 

Please keep in mind that all metrics stored by this library are kept in a single shared dictionary (lua_shared_dict). While exposing metrics the module has to list all dictionary keys, which has serious performance implications for dictionaries with large number of keys (in this case this means large number of metrics OR metrics with high label cardinality). Listing the keys has to lock the dictionary, which blocks all threads that try to access it (i.e. potentially all nginx worker threads).

There is no elegant solution to this issue (besides keeping metrics in a separate storage system external to nginx), so for latency-critical servers you might want to keep the number of metrics (and distinct metric label values) to a minimum.

已修改于2023-03-09 02:05
本作品系原创
创作不易,留下一份鼓励
陈友行

暂无个人介绍

关注



写下您的评论
发表评论
全部评论(1)

按点赞数排序

按时间排序

全是实战干货呀,👍🏻👍🏻👍🏻
赞同

0

回复举报

发表于2020-05-31 21:51



回复0学0
回复
关于作者
陈友行
这家伙很懒还未留下介绍~
5
文章
0
问答
24
粉丝
相关文章
nginx在运行过程中是否稳定,是否有异常退出过?这里总结几项平时会用到的小技巧。1.在error.log中查看是否有signal项,如果有,看看signal是多少。比如,这是一个异常退出的情况:$grepsignalerror.log2012/12/2416:39:56[alert]13661#0:workerprocess13666exitedonsignal11如果在进程退出后,有coredump文件产生,则会打出如下日志:$grepsignalerror.log2012/12/2416:39:56[alert]13661#0:workerprocess13666exitedonsignal11(coredumped)2.简单方式,看进程号是否连续一般来说,在worker进程启动时,其进程号都是连续的(至少相差不是很远),如果有进程退出,其进程号就不一定连续。$psaux|grepnginxlizi72230.00.0748442024?Ss13:320:0
点赞 3
浏览 5.1k
2019年11月(似乎已是半个世纪前),我们宣布将命名空间隔离现在,让我们简单了解下依赖项module.php。假设我们有两个版本(并无花哨之处,只是表明两者之间的不同而已):现在,我们将应用的两个相同副本放置在/www/data/a/和/www/data/b/中,并应用以下配置:{"listeners":{"*:80":{"pass":"applications/ab_app"}},"applications":{"ab_app":{"type":"php","user":"www-data","script":"index.php","root":"/","isolation":{"rootfs":"/www/data/a/"}}}}请注意,应用的r
点赞 0
浏览 4k
用户任务3: 点击任务参与任意话题讨论累计5次,并在文章评论区留下您的话题讨论链接; l LV4用户等级权益: 社区官网个人主页展示精美V4等级勋章1个; 有机会在社区官网首页“社区达人”模块展示
点赞 1
浏览 3.3k