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