2015-11-04 97 views
3

我正在研究一个应用程序,其中我可能需要记录到达服务器的所有通信。该功能可以打开或关闭,也可以在发生异常时使用。登录异步龙卷风(python)服务器

无论如何,我担心磁盘I/O操作的阻塞性质及其对服务器性能的影响。在处理请求(主要是POST http请求)时应用的业务逻辑是异步的,因此每个网络或db调用都是异步执行的。

另一方面,我担心线程在等待磁盘IO操作完成时的延迟。记录的消息可以是几个字节到几个KB,但在某些情况下是几MB。当数据写入磁盘时,并没有真正需要暂停线程,http请求肯定可以完成,并且没有理由说ioloop线程在数据写入磁盘时不能在另一个任务上工作。

所以我的问题是:

  1. 上午我过分担心这个问题?正在记录到标准输出 ,稍后将其重定向到“足够好”的文件?
  2. 什么是常用的方法,或者你认为最适合登录基于龙卷风的应用程序的方法?即使是简单的日志记录,而不是我上面概述的(极端)情况?
  3. 这基本上是排队日志消息并从专用线程消耗它们的理想情况吗?如果执行磁盘日志记录的线程正在等待磁盘io操作完成,那么linux是否会将日志记录卸载到不同的线程(如Homer Simpson的“Can not Someone Else Do it?”)内核将该点作为上下文切换的机会?

有任何意见或建议,我们非常感激,

埃雷兹

回答

3

对于“正常”的日志(几个每请求线),我总是发现,直接记录到文件不够好。如果您将所有流量记录到服务器,则可能并非如此。有一次,我需要做这样的事情,我只是用tcpdump从外部捕获流量,而不是修改我的服务器。

如果您想在流程中捕获它,只需从主线程写入文件即可。与往常一样,在采取严厉措施之前在自己的环境中测量事物(IOLoop.set_blocking_log_threshold对于确定您的日志记录是否有问题很有用)。

如果从主线程块写入太长时间,可以写入由另一个线程处理的队列,或者异步写入到另一个进程的管道或套接字(syslog?)。

+0

谢谢,本。这是我正在寻求的那种答案。 – ErezK