【发布时间】: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