我们有一个消息处理系统,其中低延迟至关重要。最近,我发现虽然我们通过我们的系统保持高利率,但我们看到一些“异常值”。 (消息比它们需要的时间长得多)当我们删除日志记录时,我们的系统不会显示这些异常值。
现在我们的日志记录基本上只是一个包装的ostream,其中一些日志级功能类似于log4j(调试,致命,调试等)。
我想知道,其他人如何管理日志记录性能,特别是在消息处理活动中?您如何管理这些I / O绑定活动?你把它条纹化了吗?你转而去数据库吗?
对于优化日志记录的任何建议都表示赞赏。
注意:我认识到我们的系统可能存在导致异常值的其他问题,但是为了这个问题,我只对记录优化感兴趣,谢谢。
另外:我们的系统必须进行日志记录。
答案 0 :(得分:10)
我猜这在某种程度上取决于操作系统。
在win32上,我们的日志记录子系统只是将消息排队等待处理磁盘I / O的日志记录线程。
这将磁盘I / O性能与时间关键型线程分离,并使我们能够很好地控制队列被锁定的方式和时间。
答案 1 :(得分:1)
类似于Roddy所说的,我们还将消息排队到一个线程安全的队列中,并且有一个单独的低优先级线程来执行实际的磁盘I / O.
在后台线程中,我们对可以一次写入的消息数量(出队)也有限制,因此除了这些之外,我们还将后台线程重新置于休眠状态。