Буферизация данных трассы в ядре
В этой главе:
Диагностическая версия ядра хранит собранные события в кольцевом связанном списке буферов. При заполнении каждого буфера диагностическое ядро отправляет программе сбора данных сигнал о готовности буфера к чтению.
Каждый буфер имеет постоянный размер и состоит из фиксированного количества элементов:
События, которые хранятся в одном элементе буфера, называются простыми, а события, которые хранятся в нескольких элементах — составными. Другими словами, данные одного события могут находиться в различном количестве элементов буфера.
Подробности см. в главе Интерпретация трассировочных данных.
Несмотря на то, что буферы имеют постоянный размер, максимальное количество буферов, используемых системой, зависит от объема свободной памяти (утилита tracelogger по умолчанию работает с 32 буферами или около 500 Кбайт памяти).
Буферы используют память ядра совместно с приложениями, и ядро автоматически выделяет память по запросу утилиты сбора данных. Буферы находятся в непрерывных областях физической памяти. Если программа сбора данных запрашивает блок, который невозможно разместить в непрерывной области, диагностическая версия ядра возвращает сообщение об ошибке.
Количество событий, генерируемых диагностическим ядром, фактически не ограничено. Если регистрация событий в журнале не осуществляется с применением строгих критериев фильтрации или ее длительность превышает несколько секунд, диагностическое ядро с высокой вероятностью заполнит кольцевой связанный список любого размера. Для бесконечного ведения журнала программа сбора данных должна периодически опустошать буферы.
При заполнении каждого буфера диагностическая версия ядра отправляет программе сбора данных сигнал о необходимости сохранить буфер. Поскольку размер буфера постоянен, ядро отправляет только его адрес.
Диагностическое ядро опустошает и заменяет буфер только по прерыванию. Если прерывание обрабатывается позже, чем буфер заполняется на 100%, некоторые события могут теряться. Чтобы избежать этого, диагностическое ядро запрашивает очистку буфера при достижении высокой отметки его заполнения.
Эта отметка устанавливается на умеренном, но эффективном уровне — около 70%. Поскольку большинству обработчиков прерываний требуется менее 300 элементов буфера событий (около 30% от их общего количества — 1024), вероятность потери событий крайне мала (следует вручную запрашивать очистку буфера в тех немногочисленных процедурах, где используются очень длительные прерывания).
Таким образом, в обычной системе ядро отправляет уведомление программе сбора данных в момент, когда зарегистрированы около 715 из 1024 возможных событий.
Диагностическая версия ядра одновременно является центральным элементом системы и управляет буферами событий.
Во время активной работы диагностическое ядро собирает большое количество событий, которые быстро заполняют буферы, и ядро часто запрашивает их очистку. Запросы очистки буферов обрабатываются программой сбора данных; диагностическое ядро переходит к следующему буферу и продолжает регистрировать события. В системе, которая работает при очень высокой нагрузке, программа сбора данных может не успевать очищать буферы по мере их заполнения диагностическим ядром.
В системе с тремя буферами диагностическая версия ядра заполняет буфер 1 и отправляет программе сбора данных сигнал о том, что буфер полон. Программа сбора данных «берет под контроль» буфер 1, и диагностическое ядро отмечает его как используемый. Например, если файл долго записывается на жесткий диск, диагностическое ядро может заполнить буферы 2 и 3 раньше, чем программа сбора данных освободит буфер 1. В этом случае диагностическое ядро пропускает буфер 1 и выполняет запись в буфер 2. Прежнее содержимое буфера 2 перезаписывается, а отметки времени на его элементах указывают на нарушение непрерывности последовательности событий.
Дополнительную информацию о переполнении буферов см. в главе Практические руководства по трассировке.
Предыдущий раздел: перейти