我有一个ISAPI过滤器上运行的IIS6或7。当有多个工作进程("网络园"),该过滤器将被装载和运行在每w3wp.exe.

我如何可以有效地允许的过滤器来记录其活动在一个单一的合并文件?

  • 登录信息,从不同的(并)进程必须不互相干扰。换句话说,一个单一登录的信息中发现的任何w3wp.exe 必须意识到作为一个单一连续行日志中的文件。

  • 那里应该是最小的争夺日志文件。该网站可能有助100的请求。

  • 严格的时间排序优先。换句话说如果w3wp.exe 处理#1发出一个信息在t1,然后处理#2发出一个信息在t2,然后处理#1发出一个信息在t3,该信息应该出现在适当的时间以便在登录文件。

目前的做法是,每个进程拥有一个独立的日志文件。这已经显而易见的缺点。

一些想法:

  • 提名的一个w3wp.exe 要"日志拥有者"和所有的日志发送信息,通过特殊处理。这个有问题的情况下工作进程的再循环。

  • 使用一个操作系统的互斥保护访问日志文件。这是高性能够不够?在这种情况下,每w3wp.exe 会有一个文件在同一文件系统的文件。我必须fflush logfile后各写?将这项工作?

任何建议?

有帮助吗?

解决方案

起初,我要说我最喜欢您当前的方法,因为每个过程什么都没共享,然后我意识到,他们可能都在下面共享相同的硬盘驱动器。因此,仍然有一个瓶颈发生。或者,也许操作系统和硬盘驱动器控制器真的很明智吗?

我认为您想做的是让日志的写作不是减慢完成实际工作的线程。

因此,在同一台计算机上运行另一个进程(较低的优先级?),实际上将日志消息写入磁盘。使用建议的不是UDP与其他过程进行通信,而是该过程共享的内存。同样令人困惑的是,作为内存映射的文件。更多关于 内存映射的文件. 。在我的公司中,我们发现内存映射的文件比在同一框上进行通信的环回TCP/IP要快得多,因此我假设它也比UDP快。

对于初学者来说,您在共享内存中实际拥有的是一个std ::队列,其中推动和弹出弹出使用互斥X保护。您的ISAPI线程会抓住静音的东西,将东西放入队列中。伐木过程将抓住互斥的东西,从队列中拔下东西,释放互斥X,然后将条目写入磁盘。 Mutex仅保护共享内存的更新,而不是文件的更新,因此从理论上讲,Mutex将在Briefer时间内持续,从而少于瓶颈。

记录过程甚至可以重新安排其编写的顺序,以使时间戳按顺序。

这是另一个变体:为每个过程具有单独的日志,但在每个过程中都有一个记录螺纹,以便主要关键时期线程不必等待日志记录才能进行工作。

我在这里写的所有内容的问题是,整个系统 - 硬件,操作系统,Multicore CPU L1/L2高速缓存的工作方式,您的软件太复杂了,无法通过认为它可以轻松预测。编码一些简单的概念验证应用程序,用一些时间来仪器,然后在真实的硬件上尝试一下。

其他提示

登录到数据库会很有意义吗?

过去,我已经使用过基于UDP的伐木系统,对这种解决方案感到满意。

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

我不知道它是否可以在您的高层环境中起作用,但是在压力不足的应用程序中,我对该解决方案感到满意。

我希望它有帮助。

您可以只使用lockfile()和unlockfile()使用Win32文件锁定机制,而不是控制对文件的访问。

我的建议是将消息异步(UDP)发送到一个可以负责记录日志的过程。
该过程将:
- 一个线程接收器将消息放在队列中;
- 一个线程负责从排序列表中删除队列中的消息;
- 列表中的一个线程监视器消息,只有时间长度大于最小值的消息应保存在文件中(以防止延迟的消息以不顺序写出)。

您可以继续记录以分开文件并找到/编写工具以稍后合并(也许是自动化的,或者您可以在要使用这些文件的点上运行它。)

Windows事件跟踪, ,包括在Windows Vista和之后,提供了一个很好的能力。

摘录:

Windows事件跟踪(ETW)是一个有效的核级别跟踪设施,您可以登录核或应用程序的定义事件日志的文件。你可以消耗的事件在实时或从日志文件,并利用它们来试一个程序,或确定性问题中发生的应用程序。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top