tgoop.com/blog_toxa/391
Last Update:
Профилируем память
В одном из прошлых постов писал, что в питончике можно профилировать память через memray. Действительно, хорошая тулза, умеет разбивать приложеньку на потоки, следить за форками, и даже работать с аллокациями на уровне С/С++
. С последним не так классно справляется, сложно отследить аллокации глубоко в библиотеках.
Это является проблемой, если у вас течёт крыша ОС
, что нужно больше памяти. Одна из причин — это то, что ваш питонячий код может использовать пакет, который является биндингом для плюсовой либы. И тут проблемки, потому что эта либа уже не живёт в модели памяти Python
Что делать? Существуют множество техник. Одна из них — использовать jemalloc и подставить его через LD_PRELOAD.
И тут нужно знать две важные штуки о том, как запускаются приложения:
— На самом старте оно подгружает различные системные и собственные библиотеки;
— В вашем приложении сотни функций. Определение (читайте код) этих функций берётся по первому найденному символу (названию) среди подгружаемых библиотек;
Так вот, LD_PRELOAD
— это способ загрузить кастомные либы до стандартных
Почему именно jemalloc
? Потому что он имеет встроенные инструменты профилировки. Т.е. вам нужно запустить вашу приложеньку, просто переопределив переменную окружения (при условии, что у вас установлен jemalloc
). Потом можно построить различные визуализации и техрепорты с теми статистиками, которые вам нужны. Можно регулировать частоту семплинга и всё такое. Вот тут можно почитать подробнее.
А мораль? Её нет. Профилировать резидентную память — это искать иголку в стоге сена: реально, но очень сложно.
А как бы вы профилировали? Поставьте 🤯, если было полезно!