通过TCP记录消息,比Java中的类似代码慢得多

时间:2017-07-25 12:18:35

标签: python performance sockets logging tcp

在Python 3中,我将QueueHandler附加到Logger,QueueListener将LogRecords发送到SocketHandler,后者通过TCP将日志发送到正在监听的Java应用程序。

两个程序都在localhost上运行。

import logging
import queue

log_q = queue.Queue(-1)
logger = logging.getLogger('TestLogger')
socket_handler = logging.handlers.SocketHandler('localhost', 1337)
q_handler = logging.handlers.QueueHandler(log_q)
q_listener = logging.handlers.QueueListener(log_q, socket_handler)
logger.addHandler(q_handler)
q_listener.start()

我发送带有相当大的列表的LogRecords。

logger.info("PROX_MARKER", extra={'vector': [some_list]})

其中[some_list]是~100k双值的列表。

我运行以下代码来测试吞吐量:

for i in range(1000):
    logger.info("PROX_MARKER", extra={'vector': [some_list]})

完成大约需要30-35秒。

如果我在Java中运行类似的测试,Java应用程序的速度大约是其两倍。

在Python中,QueueHandler / -Listener + SocketHandler设置为队列中每10次放置设置发送大约3条消息。当程序完成时,它已经发送了~300个消息,大约700个仍然在队列中,这将比主程序已经完成后慢慢发送。

我使用的QueueHandler / -Listener是默认的,对默认SocketHandler的唯一更改是我使用自定义序列化方法。

我的目标(如果这不明显)是尝试加速python代码。不幸的是,我仍然不能100%确定导致这种缓慢行为的原因。它可能与套接字有关(我知道的很少,我已尝试使用各种超时设置和TCP_NODELAY - 无济于事)。

我试图抛弃QueueHandler / -Listener并直接使用SocketHandler,它花费的时间与以前相同,所以我假设线程不是问题。< / p>

非常感谢任何关于问题可能是什么或如何加快速度的提示。

0 个答案:

没有答案