无延迟的Etw监听Etw+-+NT+Kernel+Logger+-+Process易语言源码众所周知,ETW因为FlushTimer强制被设置为1秒的原因,导致ETW消息反馈会有1秒左右的延迟。
如何降低延迟,实现实时监控呢?
其实很简单,ETW模型给我们提供了手动Flush缓冲区的命令,我们只需要不停的手动Flush缓冲区就可以实现几乎实时的ETW监控。
其实只要创建一个时钟,时钟周期中需要加2行简单的代码其实就搞定了:
时钟周期我设置的是100毫秒,代表程序每100毫秒刷新一次ETW的缓冲区,即表明ETW消息回调的时间误差至少不大于100毫秒。
在实际的程序中可以将刷新频率提得更加高,这样ETW消息的延迟就会更加低。在测试中,即使是将刷新缓冲区的时钟周期设置为1毫秒,程序的CPU占用也几乎为0,这表明ETW监听效率确实很高。(但是并不建议这样做,100毫秒刷新一次缓冲区的监听效率也基本满足实时要求)
提示:程序既然已经利用时钟来刷新ETW缓冲了,那么ETW初始时的FlushTimer可以稍微设置大一点(即保证缓冲区的刷新几乎交给程序管理),例如此程序的FlushTimer被扩大到了10秒。
帖子最后给出的例子程序一个是监听进程创建的,一个是监听文件变动的,效率相比原来的程序可以说是极高了。(监听其他的ETW模型可以自己修改)
PS:
程序启用事件监视必须拥有管理员权限!
若监视程序异常退出,请务必手动停止监视事件
注意!!如果使用其他ETW系列的代码进行修改,使用前请务必取消这里的ControlTraceA第一个参数的传址属性:

发表回复

后才能评论