Потерянные события с записью в память

Почему я продолжаю терять события, хотя записываю их в буферы памяти?

введите здесь описание изображения

Это не имеет смысла для меня. Как может случиться, что отбрасываются не буферы, а отдельные события? Я отследил проблему до сеанса CLR Rundown, который всегда теряет некоторые события. Проблема, похоже, в том, что у меня есть большое количество управляемых процессов (около 60), которые одновременно пытаются отправить свои события в ETW.

Я могу воспроизвести это с помощью

C>xperf -start ClrRundown -on "Microsoft-Windows-DotNETRuntime":0x118:5+"Microsoft-Windows-DotNETRuntimeRundown":0x118:5 -buffersize 512 -minbuffers 512 -maxbuffers 1024 -Buffering

C>xperf -Loggers ClrRundown
Logger Name           : ClrRundown
Logger Id             : 1e
Logger Thread Id      : 0000000000000000
Buffer Size           : 512
Maximum Buffers       : 512
Minimum Buffers       : 512
Number of Buffers     : 512
Free Buffers          : 504
Buffers Written       : 0
Events Lost           : **29**
Log Buffers Lost      : 0
Real Time Buffers Lost: 0
Flush Timer           : 0
Age Limit             : 0
Log File Mode         : Buffered StopOnHybridShutdown IndependentSession
Maximum File Size     : 0
Log Filename          :
Trace Flags           : ".NET Common Language Runtime":0x118:0x5+"Microsoft-Windows-DotNETRuntimeRundown":0x118:0x5

Меня не волнуют несколько потерянных событий, но я всегда получаю предупреждение от WPA при открытии такой трассировки. Это сбивает с толку нерегулярных пользователей WPA, которые боятся, что сделали что-то не так, и блокирует загрузку файла трассировки. Есть ли способ предотвратить потерю событий? Единственный другой флаг, который я нашел, был -NoPerProcessorBuffering из xperf, который также не помог. Увеличение размера буфера до 8Мб тоже ничего не изменило.

Если нет возможности записать данные без потерянных событий, есть ли дешевый и быстрый способ сбросить счетчик потерянных событий в результирующем не объединенном файле ETL?


etw
person Alois Kraus    schedule 16.01.2019    source источник


Ответы (1)


Поскольку есть способ избавиться от этих ложных отброшенных событий, я решил напрямую сбросить счетчик потерянных событий файла ETL:

Если вы вызываете этот метод, вы можете сбросить счетчик LostEvents, который является целым числом:

// Lost event offset is taken from _TRACE_LOGFILE_HEADER32/64 which is the same for x64 and x86
const int LostEventOffset = 0x98;

private static void ResetLostEvents(string etlFile)
{
    using (var file = File.OpenWrite(etlFile))
    {
        file.Seek(LostEventOffset, SeekOrigin.Begin);
        using (BinaryWriter overwriter = new BinaryWriter(file))
        {
            overwriter.Write((int)0);
        }
    }
}

Это было протестировано на Win7 и 10 x86, x64, которые работают для всех файлов ETL, которые у меня есть.

person Alois Kraus    schedule 18.01.2019