Потерянные события с записью в память - PullRequest
0 голосов
/ 16 января 2019

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

enter image description here

Это не имеет смысла для меня. Как может получиться так, что не удаляются никакие буферы, кроме отдельных событий? Я отследил проблему до сеанса 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?

1 Ответ

0 голосов
/ 18 января 2019

Поскольку существует способ избавиться от этих ложных пропущенных событий, я решил сбросить счетчик потерянных событий в файле 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, которые я получил до сих пор.

...