我正在几个不同的 python web 框架中创建一个应用程序,以查看哪个在我的编程舒适度和性能方面具有更好的平衡。有没有办法报告在 virtualenv 中运行的特定应用程序的内存使用情况?
如果没有,我如何才能找到我的 Web 框架应用程序的平均、最大和最小内存使用量?
我正在几个不同的 python web 框架中创建一个应用程序,以查看哪个在我的编程舒适度和性能方面具有更好的平衡。有没有办法报告在 virtualenv 中运行的特定应用程序的内存使用情况?
如果没有,我如何才能找到我的 Web 框架应用程序的平均、最大和最小内存使用量?
这取决于您将如何在您的环境中运行应用程序。有许多不同的方式来运行 Python Web 应用程序。最近流行的方法似乎是 Gunicorn 和 uWSGI。因此,您最好像在您的环境中一样运行应用程序,您可以简单地使用进程监视器来查看运行您的应用程序的进程正在使用多少内存和 CPU。
我将第二次 Matt W 关于应用程序环境是主要因素的说明(Gunicorn、uWSGI、nginx->paster/pserve、eventlet、apache+mod_wsgi 等)
我还要补充一点——这一年是 2012 年。在 1999 年,这类东西的内存和 CPU 是个大问题。但现在是 2012 年。计算机的功能要强大得多,扩展它们更容易、更便宜,而且框架的编码也更好。
你本质上是在看没有实际问题的基准测试,只会在理论上“整洁”和信息丰富。
Python webapps 的性能瓶颈通常是:
对于数据库通信瓶颈,一般的解决方法有:
在数据库模式方面,便利是有代价的。在 Django 中完成某些事情会更快——但您将在很大程度上被它创建的模式所困扰。Pyramid+SqlAlchemy 更加灵活,您可以使用它构建一个经过微调的数据库......但是您不会获得 Django 提供的任何自动工具。
对于每秒并发连接/请求,这主要是由于环境。在 paste、uwsgi 等部署策略下运行同一个 app 会产生不同的结果。
这是一个好的但旧的基准的链接 - http://nichol.as/benchmark-of-python-web-servers
你会注意到那里有一个峰值内存使用的幻灯片,虽然有一些异常值和相当数量的集群正在进行,但表现最差的有 122MB。没什么。
与 uwsgi 的 15 或 cogen 的 122 相比,您可以将 gevent 解释为拥有 3MB 的内存……但这些都只是现代系统内存的一小部分。
这些框架的开销如此之小,几乎不会成为影响操作性能的因素。甚至数据库部分也不算什么。参考这篇关于 SqlAlchemy 的帖子(为什么使用 sqlite 插入 SQLAlchemy 比直接使用 sqlite3 慢 25 倍?),维护者在其中记录了一些令人印象深刻的性能说明:对于 100k 行,直接生成 sql 大约为 0.5 秒。当涉及具有完整性检查/等的完整 ORM 时,相同数量的行将变为 16 秒。那没什么。
所以,我的观点很简单——你应该考虑的两个因素是:
使用框架来决定您最喜欢哪个框架,但不要将时间浪费在性能测试上,因为您要做的就是浪费时间。
托管机制的选择不是内存使用的原因,而是您配置它们的方式,以及您决定运行的胖 Python Web 应用程序。
引用的基准是:
http://nichol.as/benchmark-of-python-web-servers
是一个很好的例子,说明基准测试可能会出错。
该基准测试中不同托管机制的配置无法比较,因此您无法使用结果来正确评估每种托管机制的内存使用情况。如果您关心内存,我不会过多关注该基准。
忽略记忆,其他一些关于真正瓶颈所在位置的评论是有效的。有关整个问题的更多详细信息,请参阅我的 PyCon 演讲。