Python 日志记录在 Linux 服务器上非常慢......但在 Linux 开发 VM 上很快?

标签 python performance logging ubuntu console

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

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

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

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

感谢您的帮助!

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

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

EDIT2:接受了 Fabian 的回答,因为它很彻底,尽管它并没有完全解决问题。

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

最佳答案

如评论中所述,一个可能的原因是开发 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)程序,将未格式化的数据写入文件,以确保它确实是纯粹的磁盘性能差异。

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

关于Python 日志记录在 Linux 服务器上非常慢......但在 Linux 开发 VM 上很快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11440339/

相关文章:

performance - 我应该使用 SmartGWT 还是 Vaadin?

javascript - 设置 Pino 级别给我 'log_1.default.level is not a function'

logging - Log4j JDK 日志记录适配器 : Apply LogManager system property late in the startup process

python - pyqtSignal 和 QObject.receivers(..)

python - 无法在 Windows 10 中构建 V8

Python Turtle 比较颜色

python - 在 Python 中读取缓冲区中 block 的最有效的内存方法

python - 澄清 pstats 模块的输出

mysql - 在 MySQL 中记录触发器生成的查询

python - setup.icloud.com 两步验证