-
Notifications
You must be signed in to change notification settings - Fork 197
存在内存泄露的问题 #67
Comments
请问这个问题解决了么?我们想动态更新upstream,如果有这个问题的话,就要像其他办法了。 |
最近一直没有时间来详细测试,请给出一下你这边的编译参数以及配置文件。谢谢 |
我们在测试环境测试一下,观察一下内存情况。 |
@yfgu 你们后来的观察是怎样的?谢谢。 |
@vurt 我也遇到类似问题,你后来怎么解决的? |
@yfgu @iandyh 该问题你们的解决方案是什么呢?由于压测疏忽,基于该组件的项目已经上线,更换成本太高了,苦命 |
@powderdesigner 我们没遇到这个情况,在 prod 跑了大半年了。不过我们是没有 https 的。 |
能否提供一下内存泄露的一些debug数据。邮件里agentzh已经提供了1个方法来帮助分析nginx中内存占用了。 另外我们这边,有个探测ngx中pool内存占用的工具ngx_debug_pool
如果是dyups的pool中内存占用过高,使用该工具会出现:ngx_dyups_init_upstream这个项目会一直增大。 提供如上一些信息来帮助开发者来定位会加速问题解决。 另外如果能够提供完整的reproduce方法,让开发者在自己环境中复现会更容易定位。 |
referer to: alibaba/tengine#1016 |
@chobits 以下是debug_pool信息 |
@chobits 稍微一压测内存就急遽下降,这是2分钟内debug_pool和内存情况。该服务器只跑了tengine,没有其他大型应用。 |
你的压测方法提供下。 (BTW: 我压了下,当我停止后会恢复) |
从你的压测过程中debug_pool的信息看,是这个信息上涨
这3个内存池都是浮动,理论上你把压测关闭后,这3个选项都应应该较低到很低才对。 而dyups使用的内存池内存占用一直没有变化:
另外还有1个信息关注下,保持一定压测平度一直不停,看看内存是否会不停消耗,还是只会消耗到一定程度(如果使用libc默认的内存分配器ptmalloc,有可能会缓存一部分内存不释放给os,这样即使你停止压测系统可用内存也不会下降) |
@chobits 这么晚了还协助分析,非常感谢。我们曾保持压力不停,CentOS14G内存最后耗尽到只剩170M到150M之间,然后只在这两者范围内波动,没再继续下降。而生产环境中请求是一直存在的,无法寄希望于没请求后系统自动恢复。以下是我抓取的最新内存信息,压测在上午11点44左右就停止了。 top - 14:41:11 up 23 days, 13:26, 1 user, load average: 0.22, 0.06, 0.11 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND pid:7761 pid:7756 pid:7760 |
@chobits 还有一点不明,同样代码和dyups,在http场景下并未内存泄漏 |
@powerdesigner 从你最新的信息里top里看 软件内存占用并不高,ngx大致单worker160MB 整体top显示还有9G多 free : |
你的压测方式得提供下,详细到第三方可以模拟出来
dyups本身并不感知https/http |
整体还剩9G多是因为压测发现内存与生产环境一样骤降,就停止了。请求压力是通过JMeter模拟的,压测过程中并未变动Upstream。 |
刚做了一次新的验证,将所有dyups相关代码都屏蔽掉,动态Upstream改为固定的Upstream,压测未发现明显内存泄漏。 |
@powerdesigner 请问这个问题您解决了吗?我们在用这个模块时看到了这个issue,目前用的http没有出现内存泄漏,但后续可能会改为https。 |
目前改问题比较好复现,复现条件: |
目前把dyups自身实现的session给下掉了,不再save session,目前看来内存泄露问题不再存在了,希望官方给一个理想的修复方案,毕竟session reuse还是有好处的 |
我这几天也在解决这个问题,确实是有内存泄漏,解决完之后发现这个存在很久的issue了,我的排查结论跟 @zhaiyan1234 一样。
@chobits 虽然你说dyups本身不感知https,但是泄漏点就出在本模块的set_session和save_session这两个函数指针上,这两个正是与https相关的。复现很简单,如 @zhaiyan1234 在上面说的一样。 nginx默认是开启了proxy_ssl_session_reuse开关的,这个会导致set_session和save_session发生作用,而dyups这种在request上的peer我认为是没必要reuse_session的,会导致请求结束后没有free_ssl。 最简单的在线上环境避免该问题的方法是将proxy_ssl_session_reuse配置成off,但最根本的解决办法还是要修改一下本模块的set_session和save_session。 我个人目前的解决办法是将这两个函数的body都置为空。参考:RocFang@4a1731b 下面附上确定是这个地方导致内存泄漏的排查过程相关材料:
事实上,在nginx的历史代码中,也曾经存在过类似问题,参看: 我也查了一下本模块这两个函数的提交:5b6bac5#diff-542d0606cf0e5efad29466029ed91845 综上,我认为要么应该直接像我一样简单的将这两个函数置为空,要么重新设计一下这两个函数。 |
@yzprofile @chobits ping.. |
I redesigned |
@timebug wow, good job! |
感谢几位高手的努力,我后来自己用lua脚本实现了简单的动态Upstream,虽然不再使用该组件,但还是感受到了众人拾柴火焰高的力量 |
使用ngx_http_dyups动态创建的upstream后内存会一直增长直到服务器失去响应,最后定位到应该是ngx_http_dyups模块存在内存泄露,google之发现以前也有人遇到过类型的问题,参考这里
The text was updated successfully, but these errors were encountered: