On 24/11/2022 15:19, Maksim Dmitrichenko wrote:
Всем хай!
Граждане, никак не могу найти ответ на вопрос. Вот есть у меня
допустим 100 контейнеров из одного имиджа, или 100 имиджей с общим
слоем (слоями). Будет ли скажем libc загружен в память единожды, так
как это один и тот же бинарь из базового слоя, или же в каждом
контейнере своя анонимная память?
Меня этот вопрос интересовал даже в более простом разрезе: из одного и
того же image'а запускается N контейнеров, будет ли там какая-либо
экономия памяти из-за shared code. Достоверного ответа я не нашёл, но
запуск 500 копий из разных ven'ов на хосте или запуск 500 контейнеров с
одного image дал одинаковый результат по используемой памяти. Более
того, 500 копий из одного venv'а дало тот же результат.
Поскольку магической дедупликации в ядре нет, то, получается, что если
экономия и есть (на rodata), то не существенная.
Моё размышление: если у нас всё проходит через динамический линкер, то
relocation table кто-то должен заполнять (а у нас же ещё и рандомизация
адресного пространства!), так что код в памяти не может соответствовать
секции в файле. Единственная возможная секция для прямого маппинга - это
.rodata, но во-первых я не уверен, что она есть, а во-вторых её явно
меньше, чем .text (в которой код находится).
Если кто-то знает какую-то актуальную информацию по тому, как бинари
грузятся в современном линуксе, буду благодарен.