http请求后快速写入日志文件

时间:2013-03-08 10:01:09

标签: php python performance logging

我目前已经完成了构建一个Web服务器,其主要职责是简单地在每个http post请求中获取正文数据的内容并将其写入日志文件。收到后,后期数据的内容将被混淆。所以我没有混淆后期数据并将其写入服务器上的日志文件。混淆后的内容是一系列随机密钥值对,它们在每个请求之间不同。它不是固定数据。

服务器运行的Linux内核为2.6+。服务器配置为处理繁重的流量(打开文件限制32k等)。该应用程序使用web.py框架以Python编写。 http服务器是Nginx背后的Gunicorn。

使用Apache Benchmark进行一些负载测试后,我注意到它每秒最多可以处理大约600-700个请求而没有任何日志写入问题。 Linux本身在缓冲方面做得很好。当每秒超过这么多请求尝试同时写入同一文件时,问题就开始发生。数据不会被写入,信息也会丢失。我知道“直接写入文件”设计可能不是一个正确的解决方案。

所以我想知道是否有人可以提出一个我可以快速实施的解决方案,而无需更改太多可以解决此问题的基础架构和代码?

我已经阅读了像Redis这样的内存存储,但我已经意识到如果数据在服务器故障期间驻留在内存中,那么该数据就会丢失。我在文档中读到redis可以配置为持久存储,只需要在服务器上有足够的内存供Redis使用。这个解决方案意味着我必须编写一个脚本,以一定的间隔将数据从Redis(内存)转储到日志文件。

我想知道是否有更快的解决方案?任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

我能想到的一个可能的选择是单独的日志记录过程。这样可以屏蔽web.py以解决性能问题。这是处理日志记录模块的经典方式。您可以使用IPC或任何其他总线通信基础设施。有了这个,您将能够解决两个问题 -

  1. 对于大容量呼叫流,记录不会是一个巨大的瓶颈。
  2. 单独的模块可以确保/提供关闭/开启设施。
  3. 因此不会有任何巨大/重要的进程内存使用。
  4. 但是,你应该记住以下几点 -

    1. 您需要确保日志记录仅限于记录日志。它不能是用于业务处理的数据存储。否则,您的业务逻辑中可能存在许多同步问题。
    2. 日志记录过程(这里我指的是实际的Unix过程)将变得至关重要并且稍微复杂一些(即您可能必须处理一种形式的IPC)。
    3. HTH!