Выбор ответа Senior Память и производительность обновлено
gc.freeze в форкающихся воркерах
Вопрос
Зачем веб-серверы с pre-fork моделью иногда вызывают gc.freeze() в мастер-процессе перед форком воркеров?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Чтобы GC не трогал объекты до форка и не ломал copy-on-write. После fork дочерние процессы делят страницы памяти с родителем, пока не пишут в них.
Варианты ответа
- Чтобы запретить воркерам создавать новые объекты в куче
- Чтобы ускорить импорт модулей в воркерах после форка
- Чтобы отключить подсчёт ссылок для объектов мастера
- Чтобы GC не трогал объекты до форка и не ломал copy-on-writeправильный ответ
Разбор
После fork дочерние процессы делят страницы памяти с родителем, пока не пишут в них. Проход сборщика пишет в заголовки объектов и заставляет копировать страницы, и общая память воркеров быстро превращается в личную. gc.freeze() переносит существующие объекты в постоянное поколение, которое сборщик не сканирует. Подсчёт ссылок от этого не отключается, поэтому полностью копирование не исчезает, но заметно уменьшается.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Память и производительность»
- Встроенные функции против ручного цикла
- Пересечение больших списков id
- Числа Фибоначчи без экспоненты
- Скользящая медиана потока на двух кучах
- Найти пару с суммой быстрее O(n²)
- Циклические ссылки и gc
- Управление памятью в CPython
- Инструменты профилирования Python