使用 mod_wsgi / django / rest_framework 解析 .py 文件性能
Parsing .py files performances with mod_wsgi / django / rest_framework
我在 debian jessie、python3.4、django 和 django REST 框架上使用带有 mod_wsgi 的 apache 来支持 REST 网络服务。
我目前正在 运行 性能测试。我的服务器是 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 framework 的第一个例子设置了一个测试环境(http://www.django-rest-framework.org/). When I go to 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/),但在我的应用程序中,我的数据(似乎不需要大量资源)很容易经常更改。我想缓存对应用程序的源代码没有帮助,我错了吗?
谢谢
这看起来您的 Apache 确实在一段时间后从内存中删除了 Python 进程。 mod_wsgi 将 Python 解释器和文件加载到 Apache 中,这很慢。但是,您应该能够对其进行调整,以便将它们保存在内存中。
I guess all .py files need to be periodically parsed or .pyc to be read
.py 文件仅在没有匹配的 .pyc 文件或 .py 文件比 .pyc 更新时才被解析(并编译为字节码 .pyc 文件)。此外,.pyc 文件每个进程只加载一次。
根据您的症状,您的问题很可能主要出在您的服务器设置上。首先确保您处于守护进程模式 (https://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Delegation_To_Daemon_Process), then tweak your settings accroding to your server hardware and application's needs ( https://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIDaemonProcess)
我在 debian jessie、python3.4、django 和 django REST 框架上使用带有 mod_wsgi 的 apache 来支持 REST 网络服务。
我目前正在 运行 性能测试。我的服务器是 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 framework 的第一个例子设置了一个测试环境(http://www.django-rest-framework.org/). When I go to 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/),但在我的应用程序中,我的数据(似乎不需要大量资源)很容易经常更改。我想缓存对应用程序的源代码没有帮助,我错了吗?
谢谢
这看起来您的 Apache 确实在一段时间后从内存中删除了 Python 进程。 mod_wsgi 将 Python 解释器和文件加载到 Apache 中,这很慢。但是,您应该能够对其进行调整,以便将它们保存在内存中。
I guess all .py files need to be periodically parsed or .pyc to be read
.py 文件仅在没有匹配的 .pyc 文件或 .py 文件比 .pyc 更新时才被解析(并编译为字节码 .pyc 文件)。此外,.pyc 文件每个进程只加载一次。
根据您的症状,您的问题很可能主要出在您的服务器设置上。首先确保您处于守护进程模式 (https://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Delegation_To_Daemon_Process), then tweak your settings accroding to your server hardware and application's needs ( https://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIDaemonProcess)