Hello!
2013/11/4 ywsample:
> 最近openresty出现死循环,死在get upstream peer上,也发现一个奇怪的问题,在设置了proxy_next_upstream
> off 之后,upstream还是会尝试将请求转发到其它服务器,下面是死循环打印的调用栈
> #0 0x00000000004bb91c in ngx_http_upstream_get_consistent_hash_peer
> (pc=0x5943bc8,
> data=<value optimized out>)
> at
> /data0/workshop/tools/ngx_http_consistent_hash-0b75d6d/ngx_http_upstream_consistent_hash_module.c:170
从你提供的调用栈轨迹看,是死循环在你使用的 ngx_http_consistent_hash 模块中了。这个模块中有一个 for (;;)
{ ... } 循环,当 !(chp->tried[n] & m) 这个条件为假时,这个循环就无限执行了。
由于这个第三方模块并不是标准 openresty
软件包的一部分,所以原则上我并不会对这个模块提供技术支持。建议直接联系你用的这个模块分支的维护者,sduwangning.
> 有几个问题:
> 1、我的理解是红色部分应该就是失败之后重新尝试连其它服务器的过程,是这样的吗?
是的。
> 2、很奇怪的是蓝色部分的 pc 参数居然不一样,这是为什么呢
>
如果你使用的是 x86_64 体系结构,则调用栈上各个函数帧的参数值出现垃圾值是很正常的事情。毕竟根据 x86_64 的
ABI,函数调用的前几个参数都是直接通过寄存器传递的,并不压栈,所以在更深的函数帧里可能会临时改写掉上面的函帧的参数所对应的寄存器。
>
> ps:openresty版本为1.2.3.8 ,
值得一提的是,最新的 ngx_openresty 稳定版是 1.4.2.8,最新的主线版是 1.4.3.1. 建议升级之。
你可以直接在他的 fork 里新建 github issue 向他报告 :) 我现在并没有时间仔细分析他的这个分支的代码。
Regards,
-agentzh