Linux服务器上的Python日志记录速度极慢...但在Linux开发VM上运行速度很快?

时间:2012-07-11 19:50:15

标签: python performance logging ubuntu console

使用完全相同的代码,每次调用服务器上的logger方法(例如logger.debug)大约需要50ms,而在dev机器上则不到1ms。记录器输出到文件,只需要一点格式化。

除了记录速度减慢之外,服务器的速度是原来的两倍。

我正在开发在Windows 7上的VMWare内运行的Ubuntu 11.04(Gnome)。服务器正在运行Ubuntu Server 11.04(没有GUI,纯控制台)。日志记录模块是官方的“日志记录”模块(“import logging ... logger = logging.getLogger('mylogger')”)。

知道可能导致这种情况的原因是什么?这非常令人沮丧!

感谢您的帮助!

编辑:两台机器的版本都返回“Python 2.7.1+”。两台机器都运行64位Ubuntu。

硬盘配置服务器是软件RAID-1,而在开发计算机中只有一个驱动器。

EDIT2:接受Fabian的答案,虽然它没有完全解决问题。

解决方案:写入控制台,期间非常慢。我测试了将X写入文件,并将X写入控制台,它比控制台慢了大约100倍。我不知道为什么会这样,但我只是从另一台计算机上运行了我用ssh运行的东西,一切都解决了。

1 个答案:

答案 0 :(得分:6)

如评论中所述,可能的原因是开发VM和生产机器之间的磁盘速度差异。您是否在两个系统中都使用相同类型的驱动器,例如。 SSD,SATA与SCSI,主轴速度和缓存等等?您的环境在IO方面有很大不同。桌面Windows和VMWare将使用积极的磁盘缓存,而生产Linux计算机可能在安全方面出错,并等待数据更频繁地提交到磁盘。也许Windows机器的驱动程序更适合它所拥有的那种磁盘,而服务器运行时没有优化?文件系统差异也很大,硬件可能不同,足以导致IO速度的显着差异。您也可能在CPU和RAM速度上有很大差异。如今的台式机通常更注重原始速度,而服务器硬件则更注重可靠性。您最了解您的设置,因此您可以在硬件性能方面比较这两个系统。

除此之外,您可以通过以下方式了解实际情况:

首先,编写一个MWE来测试日志记录。您应该以实际代码为基础,并以类似的方式使用日志记录,但这是一个小例子:

import logging

logging.basicConfig(filename="test.log", level=logging.DEBUG)
logger = logging.getLogger("testlogger")

for i in range(0, 1000000):
    logger.info("iteration: %d", i)

然后在开发和生产机器中的cProfile下运行脚本。请务必记录与问题案例相同的文件系统,否则结果将不适用。

python -m cProfile testlogging.py

您将获得如下所示的输出:

57000501 function calls in 137.072 seconds

Ordered by: standard name

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000    0.000    0.000 UserDict.py:4(__init__)
    1    0.000    0.000    0.000    0.000 __init__.py:1044(_fixupParents)
    1    0.000    0.000    0.000    0.000 __init__.py:1085(Logger)
    2    0.000    0.000    0.000    0.000 __init__.py:1100(__init__)
    1    0.000    0.000    0.000    0.000 __init__.py:1112(setLevel)
.....    .....    .....    .....    ..... ...............................

这可以让您了解导致生产机器运行缓慢的原因。特别需要注意的事项:

  • 查找阅读{method 'write' of 'file' objects}{method 'flush' of 'file' objects}的行。这将告诉您Python花费多少时间写入文件并将数据刷新到磁盘 - 在本例中为日志文件。两台机器之间是否存在显着差异?如果是这样,那肯定是IO(磁盘)速度的差异。然后,您应该查看服务器的磁盘设置,看看您是否可以采取任何措施来获得更好的磁盘性能。
  • 查找第一个percall列特别大的行。此列是在函数中花费的总时间除以对该函数的调用次数。比较两台机器,你可能会发现造成差异的原因。
  • 查找tottime列特别大的行。此列是在函数中花费的总时间。再次,比较两台机器,你可能会发现速度差异的原因。

如果您发现磁盘IO似乎是个问题,那么只需对文件进行原始写入即可进行额外的测试。您可以找到一个允许您测试磁盘吞吐量的基准测试程序,但您也可以编写一个简单的C(或Python)程序,将未格式化的数据写入文件,以确保它真正是纯磁盘性能,这是不同的。

最后一点是:性能测试就像编程一样,是艺术,科学和工程的混合体,虽然您可以遵循模式和建议,但每个案例都需要一些创造力才能破解。所以尝试一下,确保你不要欺骗自己,玩得开心!祝你好运!