Устройство Linux: процессы, память, namespaces и cgroups
20 разборов интерфейсов ядра для диагностики: выберите процесс, прочитайте счётчики, проверьте изоляцию и ограничения ресурсов, разберите результат наблюдения.
Выберите вопрос к системе
Если сведения относятся к неожиданному процессу, начните с /proc/self. Если цифры памяти или нагрузки кажутся противоречивыми, переходите к счётчикам. Если одинаковый путь даёт разные результаты, сравните пространства имён и монтирования. Ограничения конкретного приложения исследуйте после определения его cgroup.
Каждый разбор содержит самостоятельный пример чтения, интерпретацию и вопрос для проверки рассуждения. Каталог помогает перейти от названия интерфейса к конкретному наблюдению, не приписывая одному числу больше смысла, чем оно содержит.
Сначала объект и единицы, затем вывод
Примеры выполняются в собственной Linux-системе; интерактивный терминал сайта не моделирует procfs, sysfs и cgroups. Перед чтением выберите PID или проверенный каталог группы. Не подставляйте в команды случайные пути и не меняйте системные настройки ради повторения учебных чисел.
Записывайте область наблюдения, единицы и интервал вместе с результатом. Два снимка разных процессов не образуют динамику одного приложения. Показатели всей машины и бюджет контейнера также требуют раздельного объяснения. Если поле отсутствует, это ограничение данных, которое нужно выяснить до расчёта.
Наблюдение за выбранным процессом
/proc/self: какой процесс вы наблюдаете при чтении
Разберите различие /proc/self и /proc/$$, выберите PID оболочки и получите повторяемое наблюдение без случайной подмены процесса утилитой чтения.
Устройство Linux ↗/proc/PID/status: состояние, идентификаторы и память
Прочитайте status выбранного процесса: отличите PID от PPid, сон от зависания и виртуальный размер от резидентной памяти; проверьте вывод по именам полей.
Устройство Linux ↗/proc/PID/cmdline: границы аргументов и нулевые байты
Исследуйте аргументы процесса без потери границ: прочитайте NUL-разделённый cmdline в Bash и объясните, почему эта строка не является журналом запуска.
Устройство Linux ↗/proc/PID/environ: начальное окружение без утечки секретов
Проверьте одну учебную переменную в начальном окружении процесса. Разберите NUL-разделители и отличие environ от текущих переменных работающей программы.
Устройство Linux ↗/proc/PID/fd: куда направлены открытые дескрипторы
Исследуйте stdin, stdout и stderr через ссылки procfs. Отличите номер дескриптора от пути, распознайте pipe и socket и не прочитайте чужой поток случайно.
Устройство Linux ↗/proc/PID/maps: как читать области виртуальной памяти
Разберите адреса, права и файловые отображения в maps. Научитесь отличать размер области от резидентной памяти и выбирать следующий шаг измерения.
Ограничения и системные счётчики
/proc/PID/io: логические байты и обращения к хранилищу
Сравните rchar и read_bytes, снимите два показания счётчиков I/O и оцените разницу без смешения кеша, системных вызовов и реального хранилища.
Устройство Linux ↗/proc/PID/limits: ограничения конкретного процесса
Проверьте soft и hard limits работающего процесса. Отличите предел от текущего расхода и настройки своей оболочки от ограничений запущенного сервиса.
Устройство Linux ↗/proc/meminfo: доступная память, кеш и swap
Прочитайте MemFree и MemAvailable без ложного вывода о нехватке RAM. Сопоставьте кеш и swap, сохранив единицы и область действия наблюдения.
Устройство Linux ↗/proc/uptime: время работы и суммарный простой CPU
Разберите два числа uptime, объясните большой суммарный idle на многоядерной системе и не перепутайте время ядра со временем работы службы.
Устройство Linux ↗/proc/loadavg: очередь задач без подмены процентом CPU
Прочитайте интервалы load average и дробь текущих задач. Разберите высокую нагрузку при ожидании I/O и выберите подходящую следующую проверку.
Устройство Linux ↗/proc/stat: расчёт долей CPU по двум снимкам
Разберите накопленное время CPU в proc/stat. Рассчитайте долю за интервал, исключите повторный учёт guest и явно укажите трактовку idle и iowait.
Представление системы и время ожидания
/proc/PID/mountinfo: монтирования глазами процесса
Разберите структуру mountinfo, найдите разделитель полей и отличите источник файловой системы от точки монтирования в пространстве выбранного процесса.
Устройство Linux ↗/sys: объекты ядра, классы устройств и ссылки sysfs
Исследуйте связь /sys/class и /sys/devices на примере loopback. Отличите атрибуты ядра от обычных файлов и осматривайте sysfs без изменения настроек.
Устройство Linux ↗Namespaces Linux: сравнение пространств двух процессов
Сравните net, mnt и user namespaces через procfs. Установите границы вывода: общий net namespace не означает общие файлы, права или отдельное ядро.
Устройство Linux ↗PSI Linux: ожидание CPU, памяти и I/O по времени
Прочитайте /proc/pressure, отличите some от full и проценты от микросекунд total. Свяжите давление ресурсов с задержкой нагрузки без ложной диагностики.
Бюджеты групп процессов
Cgroup процесса: принадлежность, версия и видимый путь
Найдите cgroup выбранного PID, отличите v2 от legacy-записей и сопоставьте путь с монтированием, не предполагая одинаковую структуру внутри контейнера.
Устройство Linux ↗Память cgroup v2: current, high, max и события OOM
Сопоставьте расход памяти группы с high и max, проверьте прирост memory.events и отличите ограничение контейнера от запаса RAM всей машины.
Устройство Linux ↗CPU cgroup v2: квота cpu.max и признаки throttling
Прочитайте квоту и период cpu.max, рассчитайте эквивалент CPU и проверьте изменение cpu.stat, не выдавая ограничение за гарантию процессорного времени.
Устройство Linux ↗Лимит задач cgroup v2: pids.current, max и events
Проверьте предел задач группы при отказе fork или создания потока. Отличите количество задач от номера PID и исследуйте рост событий без нагрузочного теста.
От материала к практике
Выберите следующую тему в каталоге Linux или проверьте знакомые команды в учебном терминале.