gpt4 book ai didi

windows - 在 ISAPI 过滤器中,多进程的公共(public)日志文件的好方法是什么?

转载 作者:可可西里 更新时间:2023-11-01 10:02:02 26 4
gpt4 key购买 nike

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

我怎样才能有效地允许过滤器将其事件记录在一个统一的日志文件中?

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

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

  • 优先考虑严格的时间顺序。换句话说,如果 w3wp.exe 进程 #1 在 t1 发出一条消息,然后进程 #2 在 t2 发出一条消息,然后进程 #1 在 t3 发出一条消息,则消息应以正确的时间顺序出现在日志文件中。

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

一些想法:

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

  • 使用操作系统互斥体来保护对日志文件的访问。这够高性能吗?在这种情况下,每个 w3wp.exe 都会在同一个文件系统文件上有一个 FILE。我必须在每次写入后刷新日志文件吗?这行得通吗?

有什么建议吗?

最佳答案

起初我想说我最喜欢你目前的方法,因为每个进程都不共享任何东西,然后我意识到,嗯,它们可能都在共享同一个硬盘驱动器。因此,在发生争用的地方仍然存在瓶颈。或者也许操作系统和硬盘驱动器 Controller 真的很聪明地处理这个问题?

我认为您想要做的是让日志的写入不会减慢执行实际工作的线程。

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

对于初学者来说,您在共享内存中实际拥有的可能是一个 std::queue,其中使用互斥锁保护推送和弹出。您的 ISAPI 线程将获取互斥体以将事物放入队列中。日志记录进程将获取互斥锁以将事物从队列中拉出,释放互斥锁,然后将条目写入磁盘。互斥锁只保护共享内存的更新,而不保护文件的更新,所以理论上互斥锁会保持更短的时间,从而减少瓶颈。

日志记录过程甚至可以重新安排其写入内容的顺序,以便按顺序获取时间戳。

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

我在这里写的所有内容的问题在于,整个系统——硬件、操作系统、多核 CPU L1/L2 缓存的工作方式、您的软件——太复杂了,无法通过简单的思考来轻松预测。编写一些简单的概念验证应用程序,用一些时序对其进行检测,然后在真实硬件上进行试验。

关于windows - 在 ISAPI 过滤器中,多进程的公共(public)日志文件的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1511290/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com