Справочная информация: я работаю над поисковой системой и разрабатываю новую функцию, которая будет создавать новый пул потоков (32 потока). Запросы, которые соответствуют некоторым правилам, будут выполняться новым пулом потоков. В то же время старый пул потоков (также имеющий 32 потока) все еще может работать и выполнять другие запросы.
Проблема: мы используем Jemalloc для выделения памяти. Когда мы включаем новую функцию и новый пул потоков начинает работать, объем памяти, потребляемой Jemalloc, увеличивается с 80 до 95 ГБ за 4–5 часов, а затем уменьшается через 2 часа. Я посмотрел статистический номер Jemalloc, все увеличенное количество памяти пришло от «stats.mapped» (выделено Jemalloc). «stats.active» и «stats.allocated» (используемые нашей службой) остаются без изменений, что означает, что увеличение объема памяти может происходить из-за фрагментации памяти.
Вот определения «stats.mapped», «stats.allocated» и «stats.active»:
Поскольку увеличение памяти слишком велико (с 80 ГБ до 95 ГБ), мы хотим уменьшить влияние на память при включении нашей функции. Есть ли у вас какие-либо предложения по вышеуказанной проблеме (фрагментация памяти в Jemalloc)? Спасибо!
Я пытался отключить tcache, но при включении новой функции память все равно увеличивается.
У вас могут быть некоторые арены, которые не используются интенсивно, так что фрагментация очень высока для одних арен и приемлема для других. Попробуйте уменьшить количество арен через narenas опция, такая, что ни одна арена не остается бездействующей во время работы в устойчивом состоянии.
Других решений пока нет …