FreeBSD съедал мою оперативную память: как разные инструменты считают ОЗУ по-разному

Автор исследовал расхождение в показаниях памяти между инструментами fastfetch, btop и htop на FreeBSD. Проблема оказалась глубже, чем казалось: разные утилиты используют разные эвристики для расчёта используемой и свободной памяти, потому что современные ОС кэшируют данные с диска в ОЗУ для ускорения работы, а этот кэш считается reclaimable (может быть освобождён, если нужна память).
Все UNIX-подобные системы управляют памятью через систему Virtual Memory (VM) с разделением физической памяти на страницы (обычно 4 КБ) и очередями: ACTIVE (активно используется), INACTIVE (не использовалась долгое время), LAUNDRY (готовится к записи в своп), WIRED (заблокирована ядром), FREE (полностью свободна).
Исследование выявило два критических бага в btop:
-
Переполнение целого числа: btop хранит количество страниц в 32-битовом беззнаковом целом (u_int), максимум которого 4,294,967,295 байт (~4 ГБ). На системах с памятью более 4 ГБ значение переворачивается, и btop показывает используемую память как 422 МБ вместо реального 4.42 ГБ.
-
Запрос к устаревшему параметру: btop запрашивает vm.stats.vm.v_cache_count для кэша памяти, но этот параметр является пустой совместимостью с FreeBSD 12.0 (вышедшей более 10 лет назад), он всегда возвращает 0. Очередь кэша была удалена ещё в FreeBSD 6.3.0.
Другие инструменты используют разные подходы: fastfetch считает свободной память + неактивные страницы + кэш, htop использует wired + active + laundry для занятой, a btop пытается вычислить «available» как total - active - wired. Из-за багов btop даёт неправильный результат на всех современных системах FreeBSD.
Ключевые факты
- btop на FreeBSD показывает неправильно используемую память из-за переполнения 32-битового целого числа для систем с ОЗУ > 4 ГБ
- btop запрашивает vm.stats.vm.v_cache_count, который является пустым параметром совместимости с FreeBSD 12.0 и всегда возвращает 0
- Разные инструменты (fastfetch, btop, htop) используют разные эвристики для подсчёта памяти: нет единого стандарта
- FreeBSD, как и другие ОС, кэширует данные диска в оперативную память; этот кэш автоматически освобождается при нехватке памяти
- Автор выпустил исправления для btop, используя 64-битовые переменные и правильные параметры sysctl
Почему это важно
Неправильное отображение использования памяти ведёт к ложным выводам о здоровье системы и её нагрузке. Системные администраторы могут решить, что система перегружена, когда на самом деле память работает оптимально. Для FreeBSD, где сообщество активно мониторит системы через btop, эти баги влияют на диагностику работоспособности серверов.
Кому это важно
Системные администраторы и разработчики, работающие с FreeBSD; пользователи мониторинговых инструментов (btop, fastfetch, htop); любой, кто полагается на метрики памяти для автоскейлинга или алертов; контрибьюторы opensource-проектов, поскольку баги находились в btop несколько лет.
Как это применить
Системные администраторы могут обновить btop на версию с исправлением 32-битового переполнения. Разработчики инструментов мониторинга должны внимательнее проверять, какие устаревшие sysctl-параметры они используют. Можно использовать fastfetch вместо btop для точного подсчёта памяти на FreeBSD, или воспользоваться native командами (sysctl vm.stats.vm.* и kstat.zfs.misc.arcstats.*).
Можно ли доверять
Статья полностью основана на анализе исходного кода btop, конкретных примерах с выводом sysctl и документации FreeBSD. Автор честно указывает, что не эксперт в ядре ОС и приглашает комментарии. Баги подтверждены воспроизведением на нескольких версиях FreeBSD (13.5, 15.0, 15.1).
Риски и подводные камни
Подобные баги могут скрываться в других инструментах мониторинга (htop, collectd, Prometheus exporters), поскольку у всех разные способы запроса информации о памяти. Переход с одного инструмента на другой может дать сильно отличающиеся показания. Старые параметры sysctl могут оставаться в коде «для совместимости» и привести к молчаливым сбоям. ZFS ARC кэш требует отдельного отслеживания через kstat, что не все инструменты учитывают.
«Я не эксперт в устройстве операционных систем, особенно FreeBSD. Это отчёт о нескольких неделях исследований в этой области в моё свободное время. Если вы найдёте что-то особенно неправильное, пожалуйста, напишите комментарий: делиться знанием, это забота!»
— Автор статьи (theanonymousone)