如评论中所述,一个可能的原因是开发 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)程序,将未格式化的数据写入文件,以确保它确实是纯磁盘性能,这就是区别。
最后一点:性能测试就像编程一样,是艺术、科学和工程的混合体,虽然你可以遵循一些模式和建议,但每个案例都需要一点创造性来破解。所以尝试一些事情,确保你不会欺骗自己,并且玩得开心!祝你好运!