我有一个在IIS6或7上运行的ISAPI过滤器。当有多个工作进程时(“网络花园”),过滤器将被加载并在每个w3wp.exe中运行。
如何有效地允许过滤器将其活动记录在单个统一日志文件中?
我目前的方法是,每个进程都拥有一个单独的日志文件。这有明显的缺点。
一些想法:
有什么建议吗?
发布于 2009-10-17 00:31:46
一开始我想说我最喜欢你目前的方法,因为每个进程都没有共享,然后我意识到,它们可能都在共享下面的硬盘驱动器。因此,在发生争用时仍然存在瓶颈。或者操作系统和硬盘控制器在处理这个问题上真的很聪明?
我认为您想要做的是让日志编写,而不是减缓正在执行实际工作的线程。
因此,在同一台机器上运行另一个进程(优先级较低?)它实际上将日志消息写入磁盘。不是按照建议使用UDP,而是使用进程共享的内存与其他进程通信。也众所周知,令人困惑的是,作为一个内存映射文件。更多关于内存映射文件的信息。在我的公司,我们发现内存映射文件比在同一个机器上进行通信的回环TCP/IP快得多,所以我认为它也比UDP更快。
首先,共享内存中的实际内容可能是std::queue,其中使用互斥锁保护推和pops。您的ISAPI线程将抓取互斥锁,将内容放入队列中。日志记录过程将抓取互斥锁,从队列中取出内容,释放互斥锁,然后将条目写入磁盘。互斥锁只保护共享内存的更新,而不是文件的更新,因此从理论上看,互斥锁将保持更短的时间,从而减少瓶颈。
日志记录过程甚至可以重新安排它所写的内容的顺序,以便按顺序排列时间戳。
另一个变化是: Contine为每个进程创建一个单独的日志,但在每个进程中有一个记录器线程,这样主时间关键线程就不必等待日志记录发生才能继续其工作。
我在这里写的所有东西的问题是,整个系统--硬件、操作系统、多核CPU L1/L2缓存的工作方式,以及您的软件--太复杂了,很难通过一个简单的想法来预测。编写一些简单的概念证明应用程序,用一些时间来测试它们,并在真正的硬件上试用它们。
发布于 2009-10-02 19:10:27
登录到数据库在这里有意义吗?
发布于 2009-10-14 19:42:32
我以前使用过基于UDP的日志系统,我对这种解决方案很满意。
日志通过UDP发送到日志收集器进程,由他负责定期将其保存到文件中。
我不知道它是否能在你的高性价比环境下工作,但在压力较小的应用程序中,我对该解决方案感到满意。
希望能帮上忙。
https://stackoverflow.com/questions/1511290
复制相似问题