在Linux服务器上,Python日志记录非常缓慢...但在Linux开发虚拟机上很快?

6
使用完全相同的代码,在服务器上调用记录器方法(例如logger.debug)大约需要50毫秒,而在开发机上则少于1毫秒。记录器输出到文件,并进行了一些格式化。
除记录日志外,服务器的速度是两倍快的。
我正在Ubuntu 11.04(Gnome)上开发,运行在Windows 7上的VMWare中。服务器运行Ubuntu Server 11.04(无GUI,纯控制台)。记录模块是官方“logging”模块(“import logging…logger = logging.getLogger('mylogger')”)。
有什么想法会导致这种情况吗?这真的非常令人沮丧!
感谢任何帮助!
编辑:两台计算机的版本都返回“Python 2.7.1 +”。两台计算机都运行64位Ubuntu。
硬盘配置服务器是软件RAID-1,而在开发计算机中只有一个单独的驱动器。
编辑2:接受Fabian的答案,因为它很彻底,尽管它没有完全解决问题。
解决方案:向控制台写入,就是非常慢。我测试将X写入文件和将X写入控制台,后者大约慢100倍。我不知道为什么会这样,但我只是从另一台计算机上通过ssh运行了我正在运行的内容,然后一切都解决了。

你能发布一下Python的两个版本吗? - Jakob Bowyer
您还可以检查两台机器上是否使用了完全相同的记录器。logging_tree 包在这方面非常有用。 - David Wolever
1
你能否尝试将日志记录到标准输出而不是文件,并检查速度是否有变化。可能是硬盘的问题。 - Loïc Faure-Lacroix
1
可能是磁盘速度的差异吗? - Daenyth
最好是位数较大的,64位或32位。 - Jakob Bowyer
1
你可能想要实际分析你的代码(http://docs.python.org/library/profile.html#module-cProfile),以便查看哪些函数运行明显较慢。 - mgilson
1个回答

6

正如评论中所指出的,一个可能的原因是开发虚拟机和生产机器之间磁盘速度的差异。您的两个系统是否使用相同类型的驱动器,例如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)程序,将未格式化的数据写入文件中,以确保确实是纯磁盘性能造成的差异。

最后一点:性能测试像编程一样,是艺术、科学和工程的混合体。虽然有一些模式和建议可以遵循,但每种情况都需要一些创新才能解决。因此,请尝试各种方法,确保不要欺骗自己,并享受乐趣!祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接