18. Кодировки Eventlog
В этом разделе описываются кодировки событий, испускаемых в журнал событий GHC. Эти события могут включать информацию о событиях планирования потоков, статистике сборки мусора, информации о профилировании, событиях отслеживания, определённых пользователем.
Этот раздел предназначен для разработчиков инструментов, которые используют эти события. GHC поставляется с файлом заголовков на C (EventlogFormat.h) содержащим символические имена идентификаторов типов событий, описанных в этом файле.
18.1. Формат журнала событий
Формат журнала спроектирован для расширяемости: старые инструменты должны иметь возможность парсить (но не обязательно понимать все) новые версии формата, а новые инструменты смогут понимать старые файлы журнала.
- Формат независим от порядка байтов: все значения представлены в порядке big-endian.
-
Формат расширяемый:
- Заголовок описывает каждый тип события и его длину. Инструменты, которые не распознают определённый тип события, могут пропустить эти события.
- В спецификации типа события есть место для дополнительной информации, которую могут игнорировать старые инструменты.
- К событиям можно добавить дополнительную информацию, но существующие поля изменять нельзя. Инструменты должны игнорировать дополнительные поля в конце записи события.
Поток журнала событий начинается с заголовка, описывающего типы событий, присутствующие в файле. Заголовок следует за самими записями событий, каждая из которых состоит из 64-битного временного отметки
log : EVENT_HEADER_BEGIN
EventType*
EVENT_HEADER_END
EVENT_DATA_BEGIN
Event*
EVENT_DATA_END
EventType :
EVENT_ET_BEGIN
Word16 -- unique identifier for this event
Int16 -- >=0 size of the event in bytes (minus the header)
-- -1 variable size
Word32 -- length of the next field in bytes
Word8* -- string describing the event
Word32 -- length of the next field in bytes
Word8* -- extra info (for future extensions)
EVENT_ET_END
Event :
Word16 -- event_type
Word64 -- time (nanosecs)
[Word16] -- length of the rest (for variable-sized events only)
... extra event-specific info ...
Существует два класса типов событий:
- Фиксированной длины: Все записи событий фиксированного размера имеют одинаковую длину, указанную в заголовке журнала событий.
- Переменной длины: Каждая запись события включает поле длины.
18.2. Диагностика системы выполнения
ThreadId ~ Word32CapNo ~ Word16CapSetId ~ Word32
18.2.1. Наборы возможностей
TODO
18.2.2. Информация об окружении
Эти события обычно генерируются во время запуска программы и описывают среду, в которой запускается программа.
-
RTS_IDENTIFIER -
- Тег
-
29
- Длина
-
переменная
- Поле CapSetId
-
Набор возможностей
- Поле String
-
Имя и версия системы выполнения.
Описывает имя и версию системы выполнения, ответственной за указанный набор возможностей.
-
PROGRAM_ARGS -
- Тег
-
30
- Длина
-
переменная
- Поле CapSetId
-
Набор возможностей
- Поле [String]
-
Аргументы командной строки, переданные программе
Описывает командную строку, используемую для запуска программы.
-
PROGRAM_ENV -
- Тег
-
31
- Длина
-
переменная
- Поле CapSetId
-
Набор возможностей
- Поле [String]
-
Наборы пар имя/значение переменных окружения. (TODO: кодировка?)
Описывает переменные окружения, присутствующие в среде программы.
18.2.3. События потоков и планирования
-
CREATE_THREAD -
- Тег
-
0
- Длина
-
фиксированная
- Поле ThreadId
-
идентификатор потока
Помечает создание потока Haskell.
-
RUN_THREAD -
- Тег
-
1
- Длина
-
фиксированная
- Поле ThreadId
-
идентификатор потока
Указанный поток начал выполняться.
-
STOP_THREAD -
- Тег
-
2
- Длина
-
фиксированная
- Поле ThreadId
-
идентификатор потока
- Поле Word16
-
состояние
- 1: HeapOverflow
- 2: StackOverflow
- 3: ThreadYielding
- 4: ThreadBlocked
- 5: ThreadFinished
- 6: ForeignCall
- 7: BlockedOnMVar
- 8: BlockedOnBlackHole
- 9: BlockedOnRead
- 10: BlockedOnWrite
- 11: BlockedOnDelay
- 12: BlockedOnSTM
- 13: BlockedOnDoProc
- 16: BlockedOnMsgThrowTo
- Поле ThreadId
-
идентификатор потока, на котором происходит блокировка (только для некоторых значений статуса)
Указанный поток остановился по причине, указанной в
status.
-
THREAD_RUNNABLE -
- Тег
-
3
- Длина
-
фиксированная
- Поле ThreadId
-
идентификатор потока
Указанный поток помечен как готовый к выполнению.
-
MIGRATE_THREAD -
- Тег
-
4
- Длина
-
фиксированная
- Поле ThreadId
-
идентификатор потока
- Поле CapNo
-
возможность
Указанный поток был перемещён в новую возможность.
-
THREAD_WAKEUP -
- Тег
-
8
- Длина
-
фиксированная
- Поле ThreadId
-
идентификатор потока
- Поле CapNo
-
другая возможность
Указанный поток был разбужен в другой возможности.
-
THREAD_LABEL -
- Тег
-
44
- Длина
-
фиксированная
- Поле ThreadId
-
идентификатор потока
- Поле String
-
метка
Указанному потоку была присвоена метка (например, с помощью Control.Concurrent.setThreadLabel).
18.2.4. События сборщика мусора
-
GC_START -
- Тег
-
9
- Длина
-
фиксированная
Запущен цикл сборки мусора.
-
GC_END -
- Тег
-
10
- Длина
-
фиксированная
Цикл сборки мусора завершён.
-
REQUEST_SEQ_GC -
- Тег
-
11
- Длина
-
фиксированная
Запрошена последовательная сборка мусора с помощью возможности.
-
REQUEST_PAR_GC -
- Тег
-
12
- Длина
-
фиксированная
Запрошена параллельная сборка мусора с помощью возможности.
-
GC_IDLE -
- Тег
-
20
- Длина
-
фиксированная
Запущена сборка мусора в режиме ожидания.
-
GC_WORK -
- Тег
-
21
- Длина
-
фиксированная
Помечает начало конкуретного сканирования.
-
GC_DONE -
- Тег
-
22
- Длина
-
фиксированная
Помечает окончание конкуретного сканирования.
-
GC_STATS_GHC -
- Тэг
-
53
- Длина
-
фиксированная
- Поле CapSetId
-
набор возможностей кучи
- Поле Word16
-
поколение сборки мусора
- Поле Word64
-
скопированные байты
- Поле Word64
-
найденные байты излишка
- Поле Word64
-
TODO
- Поле Word64
-
количество параллельных потоков сборки мусора
- Поле Word64
-
максимальное количество байтов, скопированных одним потоком сборщика мусора
- Поле Word64
-
общее количество байтов, скопированных всеми потоками сборщиков мусора
Сообщает различную информацию о конфигурации кучи. Обычно генерируется во время инициализации RTS.
-
GC_GLOBAL_SYNC -
- Тэг
-
54
- Длина
-
фиксированная
TODO
18.2.5. События и статистика кучи
-
HEAP_ALLOCATED -
- Тэг
-
49
- Длина
-
фиксированная
- Поле CapSetId
-
набор возможностей кучи
- Поле Word64
-
выделенные байты
Новый фрагмент кучи был выделен указанным набором возможностей.
-
HEAP_SIZE -
- Тэг
-
50
- Длина
-
фиксированная
- Поле CapSetId
-
набор возможностей кучи
- Поле Word64
-
размер кучи в байтах
Сообщает о размере кучи.
-
HEAP_LIVE -
- Тэг
-
51
- Длина
-
фиксированная
- Поле CapSetId
-
набор возможностей кучи
- Поле Word64
-
размер живой кучи в байтах
Сообщает о размере живой кучи.
-
HEAP_INFO_GHC -
- Тэг
-
52
- Длина
-
фиксированная
- Поле CapSetId
-
набор возможностей кучи
- Поле Word16
-
количество поколений сборки мусора
- Поле Word64
-
максимальный размер кучи
- Поле Word64
-
размер области выделения
- Поле Word64
-
размер MBlock
- Поле Word64
-
размер блока
Сообщает различную информацию о конфигурации кучи. Обычно генерируется во время инициализации RTS.
18.2.6. События искры
-
CREATE_SPARK_THREAD -
- Тэг
-
15
- Длина
-
фиксированная
Создан поток для выполнения оценки искры.
-
SPARK_COUNTERS -
- Тэг
-
34
- Длина
-
фиксированная
Периодическое сообщение о различных статистиках оценки искры.
-
SPARK_CREATE -
- Тэг
-
35
- Длина
-
фиксированная
Искра добавлена в пул искр.
-
SPARK_DUD -
- Тэг
-
36
- Длина
-
фиксированная
TODO
-
SPARK_OVERFLOW -
- Тэг
-
37
- Длина
-
фиксированная
TODO
-
SPARK_RUN -
- Тэг
-
38
- Длина
-
фиксированная
Начато выполнение оценки искры.
-
SPARK_STEAL -
- Тэг
-
39
- Длина
-
фиксированная
- Поле Word16
-
возможность, из которой была украдена искра
Искра украдена из другой возможности для оценки.
-
SPARK_FIZZLE -
- Тэг
-
40
- Длина
-
фиксированная
Искра была удалена сборкой мусора до оценки.
-
SPARK_GC -
- Тэг
-
41
- Длина
-
фиксированная
Неоценённая искра была удалена сборкой мусора.
18.2.7. События возможностей
-
CAP_CREATE -
- Тэг
-
45
- Длина
-
фиксированная
- Поле CapNo
-
номер возможности
Возможность запущена.
-
CAP_DELETE -
- Тэг
-
46
- Длина
-
фиксированная
Возможность удалена.
-
CAP_DISABLE -
- Тэг
-
47
- Длина
-
фиксированная
Возможность отключена.
-
CAP_ENABLE -
- Тэг
-
48
- Длина
-
фиксированная
Возможность включена.
18.2.8. События задач
-
TASK_CREATE -
- Тэг
-
55
- Длина
-
фиксированная
- Поле TaskId
-
идентификатор задачи
- Поле CapNo
-
номер возможности
- Поле ThreadId
-
TODO
Помечает создание задачи.
-
TASK_MIGRATE -
- Тэг
-
56
- Длина
-
фиксированная
- Поле TaskId
-
идентификатор задачи
- Поле CapNo
-
старая возможность
- Поле CapNo
-
новая возможность
Помечает перемещение задачи в новую возможность.
18.2.9. События отслеживания
-
LOG_MSG -
- Тэг
-
16
- Длина
-
переменная
- Поле String
-
сообщение
Сообщение журнала из системы выполнения.
-
BLOCK_MARKER -
- Тэг
-
18
- Длина
-
переменная
- Поле Word32
-
размер
- Поле Word64
-
время окончания в наносекундах
- Поле String
-
имя метки
TODO
-
USER_MSG -
- Тэг
-
19
- Длина
-
переменная
- Поле String
-
сообщение
Пользовательское сообщение журнала (например, из Control.Concurrent.traceEvent).
-
USER_MARKER -
- Тэг
-
58
- Длина
-
переменная
- Строка поля
-
имя маркера
Маркер пользователя (из Debug.Trace.traceMarker).
18.3. Вывод журнала событий профилировщика кучи
Профилировщик кучи может генерировать вывод в журнал событий GHC, позволяющий коррелировать образцы с другими событиями журнала событий на протяжении жизненного цикла программы.
В этом разделе описывается структура этих событий. Тип String ниже определяется как строка UTF-8 с завершением нулем.
18.3.1. Типы событий метаданных
18.3.1.1. Начало потока образцов
Единственное событие фиксированной ширины, выпущенное во время запуска программы, описывающее следующие образцы.
-
HEAP_PROF_BEGIN -
- Тэг
-
160
- Длина
-
переменная
- Поле Word8
-
идентификатор профиля
- Поле Word64
-
период выборки в наносекундах
- Поле Word32
-
тип разбиения образца. Один из,
-
HEAP_PROF_BREAKDOWN_COST_CENTER(вывод из-hc) -
HEAP_PROF_BREAKDOWN_CLOSURE_DESCR(вывод из-hd) -
HEAP_PROF_BREAKDOWN_RETAINER(вывод из-hr) -
HEAP_PROF_BREAKDOWN_MODULE(вывод из-hm) -
HEAP_PROF_BREAKDOWN_TYPE_DESCR(вывод из-hy) -
HEAP_PROF_BREAKDOWN_BIOGRAPHY(вывод из-hb) -
HEAP_PROF_BREAKDOWN_CLOSURE_TYPE(вывод из-hT)
-
- Поле String
-
фильтр модулей
- Поле String
-
фильтр описания замыканий
- Поле String
-
фильтр описания типов
- Поле String
-
фильтр центра затрат
- Поле String
-
фильтр стека центра затрат
- Поле String
-
фильтр ретента
- Поле String
-
фильтр биографии
18.3.1.2. Определения центров затрат
Пакет переменной длины, создаваемый один раз для каждого центра затрат,
-
HEAP_PROF_COST_CENTRE -
- Тэг
-
161
- Длина
-
фиксированная
- Поле Word32
-
номер центра затрат
- Поле String
-
метка
- Поле String
-
модуль
- Поле String
-
местоположение источника
- Поле Word8
-
флаги:
- бит 0: является ли центр затрат CAF?
18.3.1.3. Типы событий образцов
Образец (состоящий из списка классов разбиения, например, центров затрат и размеров резидентности в куче) должен быть закодирован в теле одного или нескольких событий.
Обычно мы помечаем начало нового образца событием EVENT_HEAP_PROF_SAMPLE_BEGIN,
-
HEAP_PROF_SAMPLE_BEGIN -
- Длина
-
фиксированная
- Поле Word64
-
номер образца
Помечает начало образца профилирования кучи.
Образцы биографического профилирования начинаются с события EVENT_HEAP_BIO_PROF_SAMPLE_BEGIN. Эти события также включают отметку времени, указывающую, когда был получен образец. Это связано с тем, как работает режим биографического профилирования, в котором все эти образцы будут появляться в конце журнала событий. Вы можете использовать отметку времени для переупорядочения образцов относительно других событий.
-
HEAP_BIO_PROF_SAMPLE_BEGIN -
- Тэг
-
166
- Длина
-
фиксированная
- Поле Word64
-
номер образца
- Поле Word64
-
отметка времени журнала событий в нс
Следует перепись резидентности в куче. Поскольку события могут иметь длину не более 2^16^ байтов, для одного образца может потребоваться разбиение на несколько событий EVENT_HEAP_PROF_SAMPLE. Точный формат записей переписи определяется типом разбиения.
В конце периода выборки генерируется событие EVENT_HEAP_PROF_SAMPLE_END. Это полезно для правильной демаркации периода выборки и для записи общего времени, затраченного на профилирование.
-
HEAP_PROF_SAMPLE_END -
- Тэг
-
165
- Длина
-
фиксированная
- Поле Word64
-
номер образца
Помечает конец образца профилирования кучи.
18.3.1.4. Разбиение по центрам затрат
- Пакет переменной длины, кодирующий образец профилирования кучи, разбитый по
-
- центру затрат (
-hc)
- центру затрат (
-
HEAP_PROF_SAMPLE_COST_CENTRE -
- Тэг
-
163
- Длина
-
переменная
- Поле Word8
-
идентификатор профиля
- Поле Word64
-
резидентность в куче в байтах
- Поле Word8
-
глубина стека
- Поле Word32[]
-
стек центра затрат, начиная с внутреннего (номера центров затрат)
18.3.1.5. Разбиение по строкам
Событие переменной длины, кодирующее образец кучи, разбитый по
-
HEAP_PROF_SAMPLE_STRING -
- Тэг
-
164
- Длина
-
переменная
- Поле Word8
-
идентификатор профиля
- Поле Word64
-
резидентность в куче в байтах
- Поле String
-
описание типа или замыкания или имя модуля
18.4. Вывод журнала событий тайм-профилировщика
Режим временного профилирования, включенный с помощью -p, также выводит события образцов в журнал событий. В начале профилирования интервал такта выводится в журнал событий, а затем при каждом такте выводится текущий стек центра затрат. В совокупности это позволяет пользователю построить приблизительный ход выполнения своей программы.
18.4.1. Событие начала профилирования
-
PROF_BEGIN -
- Тэг
-
168
- Длина
-
фиксированная
- Поле Word64
-
интервал такта в наносекундах
Помечает начало временного профиля.
18.4.2. Событие образца профилирования
Пакет переменной длины, кодирующий образец профилирования.
-
PROF_SAMPLE_COST_CENTRE -
- Тэг
-
167
- Длина
-
переменная
- Поле Word32
-
возможность
- Поле Word64
-
текущий такт профилирования
- Поле Word8
-
глубина стека
- Поле Word32[]
-
стек центра затрат, начиная с внутреннего (номера центров затрат)
18.5. Событие образца биографического профилирования
Пакет переменной длины, кодирующий образец профилирования.
-
BIO_PROF_SAMPLE_BEGIN -
- Тэг
-
166
TODO
18.6. Вывод событий неперемещаемого сборщика мусора
Эти события отмечают различные стадии жизненного цикла non-moving collection. Они включаются набором событий +RTS -lg.
-
CONC_MARK_BEGIN -
- Тег
-
200
- Длина
-
фиксированная
Отмечает начало маркировки конкурирующим сборщиком мусора.
-
CONC_MARK_END -
- Тег
-
201
- Длина
-
фиксированная
Отмечает конец маркировки конкурирующим сборщиком мусора.
-
CONC_SYNC_BEGIN -
- Тег
-
202
- Длина
-
фиксированная
Отмечает начало фазы синхронизации после маркировки конкурирующего сборщика мусора.
-
CONC_SYNC_END -
- Тег
-
203
- Длина
-
фиксированная
Отмечает конец фазы синхронизации после маркировки конкурирующего сборщика мусора.
-
CONC_SWEEP_BEGIN -
- Тег
-
204
- Длина
-
фиксированная
Отмечает начало фазы очистки конкурирующего сборщика мусора.
-
CONC_SWEEP_END -
- Тег
-
205
- Длина
-
фиксированная
Отмечает конец фазы очистки конкурирующего сборщика мусора.
-
CONC_UPD_REM_SET_FLUSH -
- Тег
-
206
- Длина
-
фиксированная
Отмечает сброс накопителя локального набора замеченных обновлений.
18.6.1. Перепись неподвижного куска памяти
События переписи неподвижного куска памяти (включаются набором событий +RTS -ln) предназначены для анализа фрагментации неподвижного куска памяти.
-
NONMOVING_HEAP_CENSUS -
- Тег
-
207
- Длина
-
фиксированная
- Поле Word8
-
логарифм по основанию 2 от blk_sz.
- Поле Word32
-
количество активных сегментов.
- Поле Word32
-
количество заполненных сегментов.
- Поле Word32
-
количество активных блоков.
Описывает заполненность подкуска памяти blk_sz.
© 2002–2007 The University Court of the University of Glasgow. All rights reserved.
Licensed under the Glasgow Haskell Compiler License.
https://downloads.haskell.org/~ghc/8.10.2/docs/html/users_guide/eventlog-formats.html