我在debian jessie,python3.4,django和django REST框架上使用带有mod_wsgi的apache来为REST Web服务提供支持。
我目前正在进行性能测试。我的服务器是KS-2(http://www.kimsufi.com/fr/serveurs.xml),内存4Gb和Atom N2800处理器(1.8GHz,2c / 4t)。我的服务器已经运行了很多小服务,但我的平均负载不超过0.5,我通常有2Gb的可用内存。我正在提供这些上下文信息,因为我在下面描述的性能可能在这种硬件支持的背景下是正常的。
我对python驱动的Web服务很陌生,并且在表演方面并不知道除了什么。我使用firefox的网络监视器来测试请求的持续时间。
我已经用django rest framework的第一个例子(http://www.django-rest-framework.org/)建立了一个测试环境。当我去网址http://myapi/users/?format=json时,我必须等待~1600毫秒。如果我在很短的时间内多次检查响应,它会下降60ms。但是,一旦我等待超过约5秒,平均时间就是1600毫秒。
我的应用程序有大约6k行的python,包括INSTALLED_APPS中的一些django库(django-cors-headers,django-filter,django-guardian,django-rest-swagger)。当我执行相同类型的测试(在返回我的用户列表的类似视图上)时,我得到6500 / 90ms。
我的数据不需要大量的资源来检索(django-debug-toolbar显示我的SQL查询需要< 10ms才能执行)。所以我不确定引擎盖下发生了什么,但我想所有.py文件需要定期解析或.pyc才能被读取。如果是这样的话,是否有可能摆脱这种行为?我的意思是,在生产环境中,我知道我不会经常编辑我的文件。或者如果不是这样,则降低第一次通话的重量。
注意:我已经阅读了关于缓存(https://docs.djangoproject.com/en/1.9/topics/cache/)的django文档,但在我的应用程序中,我的数据(似乎不需要大量的资源)经常容易发生变化。我想缓存对应用程序的源代码没有帮助,我错了吗?
由于
答案 0 :(得分: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)
答案 1 :(得分:0)
看起来你的Apache确实会在一段时间后从内存中删除Python进程。 mod_wsgi将Python解释器和文件加载到Apache中,这很慢。但是你应该能够对它进行调整,以便将它们保存在内存中。