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 > /proc/sys/vm/drop_caches<p>И увидели что память из-под кеша не освобождается, хотя должна.</p>
10
echo 3 > /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