HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: journald, awk, linux, tmpfs, свободная память в системе, memfree + cached + buffers, oom killer, apache, btrfs, lvm thin provision, cache size, atop, systemd, /tmp, persistent</p>
1 <p>Теги: journald, awk, linux, tmpfs, свободная память в системе, memfree + cached + buffers, oom killer, apache, btrfs, lvm thin provision, cache size, atop, systemd, /tmp, persistent</p>
2 <p>Один из простейших вопросов, которые вы получаете на собеседовании на ряду с "что такое<strong>LA</strong>?" - это "как понять, сколько свободной памяти в системе". Вы смело отвечаете что-то вроде "<strong>MemFree + Cached + Buffers</strong>", и будете правы. Но потом, в "бою", вы, возможно, будете удивлены приходящему<strong>OOM Killer</strong>при наличии большого количества свободной памяти.</p>
2 <p>Один из простейших вопросов, которые вы получаете на собеседовании на ряду с "что такое<strong>LA</strong>?" - это "как понять, сколько свободной памяти в системе". Вы смело отвечаете что-то вроде "<strong>MemFree + Cached + Buffers</strong>", и будете правы. Но потом, в "бою", вы, возможно, будете удивлены приходящему<strong>OOM Killer</strong>при наличии большого количества свободной памяти.</p>
3 <p>Операционные системы стараются агрессивно кешировать дисковые операции, и это иногда приводит к разнообразным проблемам. Кроме обеспечения скорости чтения при повторениях это ещё и простой механизм доступа к любому байту при чтении с блочных устройств: жёсткий диск и даже SSD до сих пор даёт читать только блоками.</p>
3 <p>Операционные системы стараются агрессивно кешировать дисковые операции, и это иногда приводит к разнообразным проблемам. Кроме обеспечения скорости чтения при повторениях это ещё и простой механизм доступа к любому байту при чтении с блочных устройств: жёсткий диск и даже SSD до сих пор даёт читать только блоками.</p>
4 <p>Кстати, начали задумываться о прямом чтении с SSD, но это<strong>long term revolution</strong>: очень много механизмов придётся переделать, и в мейнстриме мы это увидим, хорошо, если года через два. Слишком много ПО за 40 лет было спроектировано с оглядкой на поблочное чтение. Например, абсолютно все базы данных хранят данные в страницах, кратных размеру блока.</p>
4 <p>Кстати, начали задумываться о прямом чтении с SSD, но это<strong>long term revolution</strong>: очень много механизмов придётся переделать, и в мейнстриме мы это увидим, хорошо, если года через два. Слишком много ПО за 40 лет было спроектировано с оглядкой на поблочное чтение. Например, абсолютно все базы данных хранят данные в страницах, кратных размеру блока.</p>
5 <h2>Но мы отвлеклись!</h2>
5 <h2>Но мы отвлеклись!</h2>
6 <p>Все ведь в курсе, что при недостатке памяти ОС будет освобождать память из-под кеша под нужды приложения. И теперь, собственно, анекдот!</p>
6 <p>Все ведь в курсе, что при недостатке памяти ОС будет освобождать память из-под кеша под нужды приложения. И теперь, собственно, анекдот!</p>
7 <p>В одной весьма известной компании решили уместить на одном хосте примерно несколько сотен контейнеров с простой службой - апачом. Контейнер представлял собой образ операционки, почти не урезанный, благо использовался<strong>BTRFS</strong>со снапшотами. И все сотни контейнеров много места не занимали (если ещё не знаете, погуглите<strong>LVM Thin Provision</strong>- интересная технология, пригодится).</p>
7 <p>В одной весьма известной компании решили уместить на одном хосте примерно несколько сотен контейнеров с простой службой - апачом. Контейнер представлял собой образ операционки, почти не урезанный, благо использовался<strong>BTRFS</strong>со снапшотами. И все сотни контейнеров много места не занимали (если ещё не знаете, погуглите<strong>LVM Thin Provision</strong>- интересная технология, пригодится).</p>
8 <p>Но при запуске всех контейнеров к процессам в контейнерах приходит пушной зверёк по имени<strong>OOM Killer</strong>.<strong>Cache size</strong>показывался в районе половины памяти. Сначала не поверили, посчитали<strong>awk</strong>'ом сумму резидентной памяти всех процессов. Совпадает.</p>
8 <p>Но при запуске всех контейнеров к процессам в контейнерах приходит пушной зверёк по имени<strong>OOM Killer</strong>.<strong>Cache size</strong>показывался в районе половины памяти. Сначала не поверили, посчитали<strong>awk</strong>'ом сумму резидентной памяти всех процессов. Совпадает.</p>
9 <p>Пособирали<strong>atop</strong>'ом потребление ресурсов системы, нашли много интересного (например, действительно вылезающий в своп апач) и даже немного расслабились. Но проблема не ушла. Попробовали сбросить кеши:</p>
9 <p>Пособирали<strong>atop</strong>'ом потребление ресурсов системы, нашли много интересного (например, действительно вылезающий в своп апач) и даже немного расслабились. Но проблема не ушла. Попробовали сбросить кеши:</p>
10 echo 3 &gt; /proc/sys/vm/drop_caches<p>И увидели что память из-под кеша не освобождается, хотя должна.</p>
10 echo 3 &gt; /proc/sys/vm/drop_caches<p>И увидели что память из-под кеша не освобождается, хотя должна.</p>
11 <h2>И тут стали думать</h2>
11 <h2>И тут стали думать</h2>
12 <p>Проблема была ещё в том, что проявлялось это не сразу, а через час/два/три после рестарта фермы. Долго ли, коротко ли, но проблему мы нащупали. Посмотрели на различия с предыдущей реализации контейнеров.</p>
12 <p>Проблема была ещё в том, что проявлялось это не сразу, а через час/два/три после рестарта фермы. Долго ли, коротко ли, но проблему мы нащупали. Посмотрели на различия с предыдущей реализации контейнеров.</p>
13 <p>Новые контейнеры стали стильные-модные-молодёжные - с<strong>systemd</strong>. С приходом<strong>systemd</strong>поменялась раскладка файлов по диску (исторический анекдот:<strong>"/usr"</strong>появился просто потому что диски были маленькие). Кроме объединения "/" и "/usr" стал активно использоваться<strong>tmpfs</strong>. А в<strong>"/tmp"</strong>(<strong>tmpfs</strong>) стал жить ротируемый журнал<strong>journald</strong>. Ну подумаешь, несколько мегабайт всего, кто заметит. Но эти несколько мегабайт, помноженные на сотни контейнеров - уже значительный кусок памяти. И главное:<strong>tmpfs</strong>аллоцирует память в кеше.</p>
13 <p>Новые контейнеры стали стильные-модные-молодёжные - с<strong>systemd</strong>. С приходом<strong>systemd</strong>поменялась раскладка файлов по диску (исторический анекдот:<strong>"/usr"</strong>появился просто потому что диски были маленькие). Кроме объединения "/" и "/usr" стал активно использоваться<strong>tmpfs</strong>. А в<strong>"/tmp"</strong>(<strong>tmpfs</strong>) стал жить ротируемый журнал<strong>journald</strong>. Ну подумаешь, несколько мегабайт всего, кто заметит. Но эти несколько мегабайт, помноженные на сотни контейнеров - уже значительный кусок памяти. И главное:<strong>tmpfs</strong>аллоцирует память в кеше.</p>
14 <p><strong>Решение было тривиальное</strong>Поменяли режим сохранения журнала в контейнерах на<strong>persistent</strong>. И проблемы больше не было, а вы узнали чуть больше о том, что такое "<strong>свободная память</strong>".</p>
14 <p><strong>Решение было тривиальное</strong>Поменяли режим сохранения журнала в контейнерах на<strong>persistent</strong>. И проблемы больше не было, а вы узнали чуть больше о том, что такое "<strong>свободная память</strong>".</p>
15 <p><em>Есть вопрос? Напишите в комментариях!</em></p>
15 <p><em>Есть вопрос? Напишите в комментариях!</em></p>
16  
16