У меня есть приложение, которое использует 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?
И почему 4-ядерная система не дает ошибки сегментации?