Выбор ответа Senior Память и производительность обновлено

gc.freeze в форкающихся воркерах

Вопрос

Зачем веб-серверы с pre-fork моделью иногда вызывают gc.freeze() в мастер-процессе перед форком воркеров?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Чтобы GC не трогал объекты до форка и не ломал copy-on-write. После fork дочерние процессы делят страницы памяти с родителем, пока не пишут в них.

Варианты ответа

  1. Чтобы запретить воркерам создавать новые объекты в куче
  2. Чтобы ускорить импорт модулей в воркерах после форка
  3. Чтобы отключить подсчёт ссылок для объектов мастера
  4. Чтобы GC не трогал объекты до форка и не ломал copy-on-writeправильный ответ

Разбор

После fork дочерние процессы делят страницы памяти с родителем, пока не пишут в них. Проход сборщика пишет в заголовки объектов и заставляет копировать страницы, и общая память воркеров быстро превращается в личную. gc.freeze() переносит существующие объекты в постоянное поколение, которое сборщик не сканирует. Подсчёт ссылок от этого не отключается, поэтому полностью копирование не исчезает, но заметно уменьшается.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.