【问题标题】:Parsing .py files performances with mod_wsgi / django / rest_framework使用 mod_wsgi/django/rest_framework 解析 .py 文件的性能
【发布时间】:2015-12-31 00:49:27
【问题描述】:

我在 debian jessie、python3.4、django 和 django REST 框架上使用 apache 和 mod_wsgi 来支持 REST Web 服务。

我目前正在进行性能测试。我的服务器是 KS-2 (http://www.kimsufi.com/fr/serveurs.xml),具有 4Gb 的 RAM 和 Atom N2800 处理器(1.8GHz,2c/4t)。我的服务器已经运行了大量的小服务,但我的平均负载不超过 0.5,而且我通常有 2Gb 的可用 RAM。我提供这些上下文信息是因为我在下面描述的性能在此硬件支持的上下文中可能是正常的。

我对 python 驱动的 Web 服务还很陌生,除了性能方面,我真的不知道该做什么。我使用了 firefox 的网络监视器来测试请求的持续时间。

我已经使用 django rest 框架的第一个示例 (http://www.django-rest-framework.org/) 建立了一个测试环境。当我转到 url http://myapi/users/?format=json 时,我必须等待大约 1600 毫秒。如果我在短时间内多次检查响应,它会下降 60 毫秒。但是,只要我等待超过 ~5 秒,平均时间就是 1600 毫秒。

我的应用程序有大约 6k 行 python,并在 INSTALLED_APPS 中包含一些 django 库(django-cors-headers、django-filter、django-guardian、django-rest-swagger)。当我在其上执行相同类型的测试(在可比较的视图上返回我的用户列表)时,我得到 6500/90 毫秒。

我的数据不需要很多资源来检索(django-debug-toolbar 显示我的 SQL 查询需要不到 10 毫秒的时间来执行)。所以我不确定幕后发生了什么,但我猜所有 .py 文件都需要定期解析或 .pyc 才能读取。如果是这种情况,是否有可能摆脱这种行为?我的意思是,在我知道我不会经常编辑文件的生产环境中。或者如果不是这样,降低第一次调用的权重。

注意:我已经阅读了 django 关于缓存的文档 (https://docs.djangoproject.com/en/1.9/topics/cache/),但在我的应用程序中,我的数据(似乎不需要很多资源)容易经常更改。我猜缓存对应用程序的源代码没有帮助,我错了吗?

谢谢

【问题讨论】:

  • 服务器不会“定期”解析文件;每个进程只需要加载一次。

标签: python django performance django-rest-framework django-wsgi


【解决方案1】:

我猜所有的 .py 文件都需要定期解析或读取 .pyc

.py 文件仅在没有匹配的 .pyc 文件或 .py 文件比 .pyc 新时才被解析(并编译为字节码 .pyc 文件)。此外,每个进程仅加载 .pyc 文件一次。

鉴于您的症状,您的问题很可能主要出在您的服务器设置上。首先确保您处于守护程序模式 (https://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Delegation_To_Daemon_Process),然后根据您的服务器硬件和应用程序的需求调整您的设置 (https://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIDaemonProcess)

【讨论】:

  • 我再次阅读docs.djangoproject.com/en/1.9/howto/deployment/wsgi/modwsgi 确实建议使用守护程序模式。但它没有提到性能,并且有这样的差异,我真的认为问题出在其他地方。
  • 守护程序模式不会提高原始性能,但它可以让您更好地控制进程的生命周期。请注意,如果您每天只访问您的应用程序一次,那么进程(无论是在嵌入式模式还是守护程序模式下)可能会在那时处于休眠状态或刚刚死机,因此您在第一次请求时仍然会有一些延迟。
【解决方案2】:

这看起来您的 Apache 确实会在一段时间后从内存中删除 Python 进程。 mod_wsgi 将 Python 解释器和文件加载到 Apache 中,这很慢。但是,您应该能够对其进行调整,以便将它们保存在内存中。

【讨论】:

    猜你喜欢
    • 2014-11-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 2014-01-15
    相关资源
    最近更新 更多