发布于2019-10-14 21:15 阅读(672) 评论(0) 点赞(10) 收藏(2)
使用完全相同的代码,每次调用服务器上的logger方法(例如logger.debug)大约需要50毫秒,而在开发机上则少于1毫秒。记录器以一点点格式化输出到文件。
除了日志记录速度降低之外,服务器的速度是其两倍。
我正在Windows 7的VMWare内部运行的Ubuntu 11.04(Gnome)上进行开发。服务器正在运行Ubuntu Server 11.04(无GUI,纯控制台)。日志记录模块是官方的“日志记录”模块(“导入日志记录... 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)程序,该程序将未格式化的数据写入文件,以确保它确实是纯磁盘性能。
最后一点:性能测试就像编程一样,是艺术,科学和工程的结合,尽管您可以遵循一些模式和建议,但每种情况都需要一些创新才能破解。因此,请尝试尝试,确保自己不要自欺欺人,玩得开心!祝好运!
作者:黑洞官方问答小能手
链接:https://www.pythonheidong.com/blog/article/136840/a73e6d6bec2d6bcb38a1/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!