微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在ISAPI筛选器中,对于多个进程的常见日志文件,有什么好方法?

我有一个运行在IIS6或7上的ISAPI筛选器。当有多个工作进程(“Web Garden”)时,筛选器将被加载并运行在每个w3wp.exe中。

我如何有效地允许filter将其活动logging在单个合并日志文件中?

来自不同(并发)进程的日志消息不得相互干扰。 换句话说,从任何w3wp.exe发出的单个日志消息必须作为日志文件中的单个连续行来实现。

日志文件应该有最小的争用。 这些网站可以每秒处理100个请求。

devise线程类

Windows中每个进程/线程的最大互斥量

严格的时间sorting是首选。 换句话说,如果w3wp.exe进程#1在t1发出消息,则进程#2在t2发出消息,然后进程#1在t3发出消息,消息应该以适当的时间顺序出现在日志文件中。

我目前的做法是每个进程拥有一个单独的日志文件。 这有明显的缺点。

一些想法:

提名其中一个w3wp.exe为“日志文件所有者”,并通过该特殊进程发送所有日志消息。 这在工作stream程回收的情况下有问题。

使用OS互斥体来保护对日志文件的访问。 这足够高吗? 在这种情况下,每个w3wp.exe将在同一个文件系统文件上具有一个FILE。 我必须在每次写入后清空日志文件? 这会工作吗?

有什么build议么?

起初我会说我最喜欢你现在的做法,因为每个过程都没有共享,然后我意识到,那么,他们可能都在共享下面的硬盘。 所以,争用发生仍然存在瓶颈。 或者,也许操作系统和硬盘控制器真的很聪明,处理呢?

我认为你所要做的就是写日志不会减慢正在进行实际工作的线程。

那么,在同一台机器上运行另一个进程(优先级较低?),它将日志消息写入磁盘。 建议使用非UDP的通信到其他进程,而是进程共享的内存。 也被称为内存映射文件,令人困惑。 更多关于内存映射文件 。 在我的公司,我们发现内存映射文件要比在同一个盒子上进行通信的环回TCP / IP要快得多,所以我假设它会比UDP更快。

对于初学者来说,你在共享内存中的实际内容可能是一个std ::队列,在这个队列中,使用互斥体保护push和pops。 你的ISAPI线程会抓住互斥体把东西放入队列中。 日志记录过程将抢占互斥体,从队列中取出东西,释放互斥锁,然后将条目写入磁盘。 互斥锁只是保护共享内存的更新,而不是文件的更新,所以从理论上来说,互斥锁将在短暂的时间内保持不变,从而减少了瓶颈。

日志记录过程甚至可以重新排列它正在写入的顺序以获得时间戳。

这里有另一个变化:Contine为每个进程都有一个单独的日志,但是在每个进程中都有一个记录器线程,这样主时间关键的线程不必等待日志记录的发生才能继续工作。

在这里写的所有东西的问题是,整个系统 – 硬件,操作系统,多核cpu L1 / L2缓存的工作方式,你的软件 – 太复杂,不能通过简单的思考来预测。 编写一些简单的概念验证应用程序,用一些时间测试它们,然后在真实的硬件上试用它们。

记录到数据库是否有意义?

过去我使用过基于UDP的日志记录系统,对于这种解决方案我感到满意。

日志通过UDP发送到一个日志收集器进程,他负责定期将其保存到一个文件中。

我不知道它是否可以在你的高性能环境下工作,但是我对这个解决方案在一个不那么紧张的应用中感到满意。

我希望它有帮助。

而不是OS互斥体来控制对文件的访问,您可以使用LockFile()和UnlockFile()来使用Win32文件锁定机制。

我的建议是异步发送消息(UDP)到一个负责记录日志的进程。

这个过程将会:

一个线程接收器将消息放入队列中;

一个线程负责从队列中删除消息,放入时间顺序列表;

一个线程监视列表中的消息,只有时间长度大于最小值的消息应该保存在文件中(以防止延迟的消息被乱序写入)。

您可以继续记录以分离文件并查找/写入工具,以便以后合并它们(也许是自动化的,或者您可以在要使用这些文件的位置运行它)。

包含在Windows Vista和更高版本中的Windows 事件跟踪为此提供了很好的功能

摘抄:

Windows事件跟踪(ETW)是一种高效的内核级跟踪工具,可让您将内核或应用程序定义的事件记录到日志文件中。 您可以实时或从日志文件中使用这些事件,并使用它们来调试应用程序或确定应用程序中发生的性能问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐