Прошу помощи в продвижении баги Glibc: free не освобождает часть памяти
Есть в Glibc особенность, описанная [1] во времена царя гороха.
Если я правильно понимаю, это является причиной многих ситуаций, когда у приложений «течет память». И почему-то я никогда не встречал пояснения, что это by design благодаря... Glibc! Пока сам не столкнулся: я аналитик (но был программистом), и у меня в Pandas тупо сжирается вся память даже после сборки мусора.
Так вот, по сути. Есть такой mallopt-параметр, M_MXFAST
[2]. Он задает порог размера блока (я сейчас пересказываю, возможно несоответствие действительности), меньше которого не происходит реальное освобождение блока памяти при вызове free. Заметим, кстати, что по умолчанию этот параметр никак не 0 (а 64*sizeof(size_t)/4)
.
Так вот, при повторных вызовах free аккумуляции значения, которое сравнивается с порогом, не происходит. То есть, аллоцировав [3] миллион раз 64 байта, а затем миллион раз ее освободив, мы получим 64 мебибайта текущего использования памяти.
Память освобождается только в случае вызова malloc_trim()
. Ну, или, отключения всей этой оптимизации: mallopt(M_MXFAST, 0)
.
Понятно, что каждый разработчик может выбрать один из двух вариантов, но, де-факто, я предполагаю, что мало кто об этом задумывается. Там же [1] отмечают, что «в KDE это порождает утечки 600Mb». И, собственно, предлагают, аккумулировать количество и/или общий размер неосвобожденных таким образом блоков. Или, хотя бы, ввести переменную окружения по аналогии с MALLOC_TRIM_THRESHOLD_
[2].
Но за 6 лет даже не разрослась дискуссия. А, кажется, место многих проблем-то! Может, хоть знать бы об этом хорошо? Вот разработчики Pandas, кажется, не знают: [4], [5]. (Мне кто-то подсказал в том треде, разработчики не заметили. И привлекать внимание не хочется закроют по WONTFIX и все.) Я понимаю - закрой рот и напиши патч, всё такое. Но думаю, стоит достучаться до тех, кто разбирается в коде Glibc. И в его подходах.
Подскажите, как быть? И прав ли я в утверждении о том, что надо что-то делать? :)
P.S. Хотя, с другой стороны, [6].
---
- [1] https://sourceware.org/bugzilla/show_bug.cgi?id=14827
- [2] http://man7.org/linux/man-pages/man3/mallopt.3.html
- [3] https://sourceware.org/bugzilla/attachment.cgi?id=6725
- [4] https://github.com/pandas-dev/pandas/issues/2659
- [5] https://github.com/pandas-dev/pandas/issues/21353
- [6] https://stackoverflow.com/questions/2215259/will-malloc-implementations-retur...