如何优化多个进程尝试写入同一个日志文件的过程

Posted

技术标签:

【中文标题】如何优化多个进程尝试写入同一个日志文件的过程【英文标题】:How to optimize the process of multiple process trying to write to the same log file 【发布时间】:2016-12-07 00:21:53 【问题描述】:

使用 php 的网站具有非常巨大的流量,例如每秒 5000 次请求。这些请求中的每一个都尝试将数据记录到单个文件中。由于在任何时间点,只有一个请求可以写入文件,因此另一个请求排队,这会影响整体响应时间。需要记录数据,这很重要。我该如何优化这种情况。

【问题讨论】:

能否改为登录数据库,然后有一个函数将数据表处理成日志文件? 您可以为每个用户(或日志条目)创建一个临时文本文件,并以特定的时间间隔合并文件。或者编写一个文件管理器/包装器来创建一个文件,添加日志条目并在后台将其排队等待主文件条目。 @Cricket 为每个请求将日志写入数据库并不是一个好主意。不能谈论没有基准测试的性能。 @Nitin 听起来不错。增加了一些额外的工作,但会起作用。 使用fluentd并将其记录在那里,然后您可以让fluentd将其写入文件,mysql,Mongo,任何地方。它正是为此目的而开发的工具。将排队和多路复用留给专为其设计的软件。 【参考方案1】:

我看到了两个选项。

    因为您的要求是写入一个大的日志文件而不是其他地方。您可以让您的 PHP 脚本首先将这些条目记录到队列中。您可以使用许多消息队列平台,例如 RabbitMQ 或 ActiveMQ。假设这些日志条目不是大的有效负载,您的导致日志条目的用户请求可以被定向到将消息插入队列。您将拥有另一个后端进程(可能是一个 php 脚本?),它将简单地监听队列并不断地写入日志文件。以下是关于客户端如何使用队列消息的详细说明 (https://www.rabbitmq.com/tutorials/tutorial-one-php.html)

    您还可以使用像 Apache Log4php 这样的东西,它是一个使用文件附加机制的日志框架。只需调用一个方法,您就可以轻松推送对您重要的信息。

    $logger->info("这是要记录的消息。");

他们应该处理登录到同一个文件的多个请求的复杂性。您甚至可以让他们按天分解文件等。

希望这会有所帮助!

【讨论】:

以上是关于如何优化多个进程尝试写入同一个日志文件的过程的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Linux 上使用标准 I/O 函数在多个进程中写入文件?

一文详解-MySQL 事务和锁

如何在 unix 上找到没有日志文件的死进程的原因?

Winston:多进程日志记录

当子进程和父进程在 Perl 中写入同一个日志文件时进程卡住(在 Windows 中)

多个子进程中的 Pyhtion 2.7 记录器不会将信息记录到日志文件中