【问题标题】:Quick writing to log file after http requesthttp请求后快速写入日志文件
【发布时间】:2013-02-23 20:06:47
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 一种糟糕的设计,如果您编写每个请求,甚至是由于某种原因被认为无效的请求,例如缺少数据/字段/变量或其他任何东西......您应该使用某种过滤器或验证接收到的数据,因此您可以大大降低请求,然后使用队列您可以处理文件锁定并以异步方式写入,例如每当文件可用于写入时,将写入第一个请求,然后列表继续。跨度>
  • 你如何运行 gunicorn(哪个工人阶级)?如果您只有一个服务器进程,logging.FileHandler 可能会很有用。否则,请查看logging.SyslogHandler 作为一个可能的选项。
  • 听说mongodb的写性能非常好。

标签: php python performance logging


【解决方案1】:

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

  1. 记录不会成为高容量呼叫流的巨大瓶颈。
  2. 单独的模块可以确保/提供开关关闭/打开功能。
  3. 因此不会有任何巨大/显着的进程内存使用。

但是,您应该牢记以下几点 -

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

HTH!

【讨论】:

  • 管道非常适合,因为数据只在一个方向流动。
  • 另外补充一点,如果您是从零开始设计产品,建议目标系统能力至少达到预期基准的 1.5-2 倍。随着产品在生命周期中的移动,性能会降低(在添加功能时)。
猜你喜欢
  • 2020-06-30
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多