Linux服务器上的Python日志记录速度极慢..但在Linux开发虚拟机上速度很快



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

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

我在Windows7上运行VMWare的Ubuntu 11.04(Gnome)上进行开发。服务器运行的是Ubuntu server 11.04(没有GUI,纯控制台)。日志记录模块是官方的"日志记录"模块("import-logging…logger=logging.getLogger('mylogger')")

知道是什么原因造成的吗?这太令人沮丧了!

谢谢你的帮助!

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

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

第二版:接受了费边的回答,因为它很彻底,尽管它并没有完全解决问题。

解决方案:写入控制台的速度非常慢。我测试了将X写入文件和将X写入控制台,结果发现它比控制台慢了大约100倍。我不知道为什么会这样,但我只是从另一台计算机上运行了我用ssh运行的程序,一切都解决了。

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

最后一点:性能测试和编程一样,是艺术、科学和工程的混合体,虽然有一些模式和建议可以遵循,但每个案例都需要一些创造性才能破解。所以,尝试一下,确保你不会愚弄自己,并享受乐趣!祝你好运

最新更新