我有一个使用OpenSSL的应用程序。我只分配一个SSL_CTX对象(不是每个内核),并且我的应用程序是多线程的。当我的连接数达到20000以上时,出现分段错误。这是来自gdb的跟踪:
#0 0x00007ffff61e342f in SSL_SESSION_list_remove (ctx=0x555555e1ac80, s=0x0) at ssl/ssl_sess.c:1138
#1 0x00007ffff61e2738 in remove_session_lock (ctx=0x555555e1ac80, c=0x7fffd4257220, lck=0) at ssl/ssl_sess.c:758
#2 0x00007ffff61e25f5 in SSL_CTX_add_session (ctx=0x555555e1ac80, c=0x7fffe00a1cf0) at ssl/ssl_sess.c:731
#3 0x00007ffff61d9c5b in ssl_update_cache (s=0x7fffe0255000, mode=2) at ssl/ssl_lib.c:3411
#4 0x00007ffff62031b8 in tls_finish_handshake (s=0x7fffe0255000, wst=WORK_MORE_A, clearbufs=1, stop=1)
at ssl/statem/statem_lib.c:1072
您可以看到s的值为NULL。因此,在检查了Openssl的代码后,我发现它的默认缓存大小为20480个会话,之后,Openssl尝试使用remove_session_lock函数从会话队列中删除会话然后调用SSL_SESSION_list_remove。因此,当我在4核心系统上运行应用程序时,删除会话的过程不会给我带来分段错误。所以我的问题是:会话存储在哪里,它们在内核中本地还是在SSL_CTX对象本地? 为什么四核系统没有出现分段错误?