首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ISAPI过滤器中,用于多个进程的公共日志文件的好方法是什么?

在ISAPI过滤器中,用于多个进程的公共日志文件的好方法是什么?
EN

Stack Overflow用户
提问于 2009-10-02 19:08:07
回答 7查看 380关注 0票数 2

我有一个在IIS6或7上运行的ISAPI过滤器。当有多个工作进程时(“网络花园”),过滤器将被加载并在每个w3wp.exe中运行。

如何有效地允许过滤器将其活动记录在单个统一日志文件中?

  • 来自不同(并发)进程的日志消息不能相互干扰。换句话说,从任何一个w3wp.exe发出的单个日志消息必须实现为日志文件中的一个连续行。
  • 日志文件的争用应该是最小的。这些网站可以每秒提供100个请求。
  • 严格的时间顺序优先考虑。换句话说,如果w3wp.exe process #1在t1发出消息,那么process #2在t2发出消息,然后process #1在t3发出消息,则消息应该以正确的时间顺序出现在日志文件中。

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

一些想法:

  • 将其中一个w3wp.exe指定为“日志文件所有者”,并通过该特殊过程发送所有日志消息。这在工人过程回收的情况下存在问题。
  • 使用OS互斥锁来保护对日志文件的访问。这够高吗?在这种情况下,每个w3wp.exe将在同一个文件系统文件上有一个文件。每次写完日志后,我必须把日志文件弄清楚吗?这个能行吗?

有什么建议吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-10-17 00:31:46

一开始我想说我最喜欢你目前的方法,因为每个进程都没有共享,然后我意识到,它们可能都在共享下面的硬盘驱动器。因此,在发生争用时仍然存在瓶颈。或者操作系统和硬盘控制器在处理这个问题上真的很聪明?

我认为您想要做的是让日志编写,而不是减缓正在执行实际工作的线程。

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

首先,共享内存中的实际内容可能是std::queue,其中使用互斥锁保护推和pops。您的ISAPI线程将抓取互斥锁,将内容放入队列中。日志记录过程将抓取互斥锁,从队列中取出内容,释放互斥锁,然后将条目写入磁盘。互斥锁只保护共享内存的更新,而不是文件的更新,因此从理论上看,互斥锁将保持更短的时间,从而减少瓶颈。

日志记录过程甚至可以重新安排它所写的内容的顺序,以便按顺序排列时间戳。

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

我在这里写的所有东西的问题是,整个系统--硬件、操作系统、多核CPU L1/L2缓存的工作方式,以及您的软件--太复杂了,很难通过一个简单的想法来预测。编写一些简单的概念证明应用程序,用一些时间来测试它们,并在真正的硬件上试用它们。

票数 2
EN

Stack Overflow用户

发布于 2009-10-02 19:10:27

登录到数据库在这里有意义吗?

票数 1
EN

Stack Overflow用户

发布于 2009-10-14 19:42:32

我以前使用过基于UDP的日志系统,我对这种解决方案很满意。

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

我不知道它是否能在你的高性价比环境下工作,但在压力较小的应用程序中,我对该解决方案感到满意。

希望能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1511290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档