当流量非常高时,我们经常遇到segfault转储。现在不确定这里的问题是什么?
任何人都有与我们分享的经验吗?
(gdb) bt
#0 ... in tcmalloc::ThreadCache::ReleaseToCentralCache(tcmalloc::ThreadCache::FreeList*, unsigned long, int) () from /usr/lib64/libtcmalloc.so
#1 ... in tcmalloc::ThreadCache::ListTooLong(tcmalloc::ThreadCache::FreeList*, unsigned long) () from /usr/lib64/libtcmalloc.so
#2 ... in tc_delete () from /usr/lib64/libtcmalloc.so
#3 ... in boost::detail::sp_counted_impl_p<OutputObject>::dispose() () at /opt/rh/devtoolset-2/root/usr/include/c++/4.8.2/bits/unique_ptr.h:67
谢谢,
答案 0 :(得分:2)
您的程序中很可能存在内存损坏。例如,双倍免费。你说当负载很高时会出现段错误,所以最有可能是竞争条件。
当我们同时使用线程不安全对象(通过Singleton模式)并因此存在内存威胁的各种问题时,我们遇到了这个问题。 您可能会通过在堆栈跟踪中查找并检查每个帧是否存在此类错误来找出问题所在。它对我有用 - segfault是由std :: string析构函数引起的,其中std :: string是线程不安全对象结构的一部分。