Closed fausturs closed 3 months ago
试一下#2727 看看还有没有问题。
试一下#2727 看看还有没有问题。 @chenBright
首先,感谢你的回复与支持。
https://github.com/fausturs/test-brpc-jemalloc 这里我给了一个小demo用于复现这个栈。
从给出的修复来看,似乎是通过宏NO_PTHREAD_MUTEX_HOOK控制是否去覆盖pthread的符号。那么完全不覆盖pthread的mutex符号的时候,我想本issue的这个问题应该OK了。
此外我有一点点好奇,对于brpc中,为什么要去hack pthread中的mutex相关符号呢,好处是什么?是能够在真正调用pthread之前,能够进行一些额外的统计信息吗?那是不是当我设置NO_PTHREAD_MUTEX_HOOK时,对pyhread mutex的操作,可能会更快?
主要是通过__dl_sym来hook,避免_dlerror_run申请内存导致malloc库死锁。不需要NO_PTHREAD_MUTEX_HOOK宏应该也是没问题的了。NO_PTHREAD_MUTEX_HOOK跟这个issue关系不大,主要解决没法调整动态库加载顺序导致找不到pthreadmutex*符号的问题。
对于brpc中,为什么要去hack pthread中的mutex相关符号呢
hook pthread mutex是为了支持contention profiler和worker潜在死锁问题的检测。
那是不是当我设置NO_PTHREAD_MUTEX_HOOK时,对pthread mutex的操作,可能会更快?
没开contention profiler的情况下,只是多了一个判断和线程局部变量加减,性能应该没有差别的。
我通过我上述的小demo,使用__dl_sym
代替dlsym
,程序表现确实符合预期了。
再次感谢你的回复,与支持。
好的,感谢反馈!
Describe the bug (描述bug) 我们尝试使用了一下brpc的最新的代码。包含了这个commit https://github.com/apache/brpc/commit/e0c9c441922c070c887649718d8aa7d2ba459ea6
这个commit中,覆盖了pthread_mutex_trylock这个符号,同时我们使用了jemalloc(5.2.1),,疑似导致死锁了
这是我们的栈,
可以看到
第24帧是,jemalloc中进行pthread_mutex_trylock,然后进入了第23帧brpc,然后自然的进入到了第16帧开始调用__dlsym, 然后第15帧调用了_dlerror_run。 然后第14帧调用到了calloc,又重新进入到jemalloc,然后第8帧进入到和24帧同一个位置进行trylock,此时应该死锁了。
从代码中的一段注释(https://github.com/apache/brpc/blob/b4d4acb7cd9a677039f662f18df37d4be7172ed3/src/bthread/mutex.cpp#L390)来看, 看上去是类似的行为。 这个问题有什么办法可以修复一下吗?
To Reproduce (复现方法)
Expected behavior (期望行为)
Versions (各种版本) OS: Compiler: brpc: protobuf:
Additional context/screenshots (更多上下文/截图)
这是我们使用的jemalloc的源代码的161行所处的位置。