让django/mod_python内存使用降低的一些建议

本文介绍了一位开发者在使用Django与Apache部署网站时遇到的内存占用问题及解决办法,包括调整DEBUG设置、限制Apache进程数、避免加载大型对象等。
最近用django+apache+mod_python搭建的一在线元器件交易平台网站([url]http://www.ecgoo.net/[/url]),由于网络爬虫的频繁光顾,导致经常有httpd进程狂吃内存,网站无法访问。

google了一下,发现有篇英文文档很有帮助,因此翻译了下,希望对他人有帮助

原文:[url]http://blog.webfaction.com/tips-to-keep-your-django-mod-python-memory-usage-down#[/url]

当你的djano项目部署在Apache + mod_python之上时,你可以使用下面的建议来让服务器内存使用降低

1.确保settings.py中DEBUG设置为False
如果没有,将他设置为False。因为,在DEBUG模式下,所有的SQL查询都会被保存在内存中,这样会使你的内存迅速增加
补:apache同样也有个Debug的设置,而且他优先于django的DEBUG=False,因此,仅管django中DEBUG=False,apache中的Python Debug On也会消耗大量内存。

2.在apache配置中使用ServerLimit
默认情况下,Apache将产生大量进程,导致内存的大量使用。您可以使用“ServerLimit”命令来限制这些进程。

3.确保没有大的对象加载入内存
例如:检查你的代码,确保没有一次加载数千条记录到内存的情况。同时,如果你的网站能够让用户下载或上传大文件,也确保这些大文件没有加载入内存

4.让你的主服务器直接服务静态数据
对于django网站来说,这是一条普遍建议,让你的静态数据(images,css...)直接由apache主服务器服务,这将让你的django应用程序节省一点额外的请求。

5.在apache配置中使用MaxRequestsPerChild
有的时候会出现一些内存泄漏的问题,如果是这样的话,我们可以通过使用MaxRequestsPerChild来告诉apache在服务一定数量的请求之后,将杀死改进程,并重新启动一个新进程。一般设置在100到1000之间.
当然还有一种更极端丑陋的做法,就是用crontab来定时重启apache

6.找出你的内存使用量
你能够使用“ps -u <username> -o pid,rss,command“命令来查看运行的进程以及内存使用情况,如
[code]
[testweb14@web14 bin]$ ps -u testweb14 -o pid,rss,command
PID RSS COMMAND
23111 1404 -bash
27988 3848 httpd.c
27989 10312 httpd.c
27990 9804 httpd.c
28078 760 ps -u testweb14 -o pid,rss,command
[testweb14@web14 bin]$
[/code]
正如你可以看到的,我们有三个“的httpd”进程在运行,内存使用分别3848KB,10312KB和9804KB。第一个是apache监督进程,另外两个工作进程(在这个例子,“ServerLimit”设置为2)。监督进程的内存使用一般不会有很大改变,但如果你的应用程序有内存泄漏,工作进程内存的使用可以大大增加。因此,在这个实例中,apache/Django总共使用的内存为3848KB + 9804KB + 10312KB = 23MB
(fuadmin) a1@1deMacBook-Air-2 backend % python manage.py migrate django_celery_beat Traceback (most recent call last): File "/Users/a1/fu-admin/backend/manage.py", line 22, in <module> main() File "/Users/a1/fu-admin/backend/manage.py", line 18, in main execute_from_command_line(sys.argv) File "/Users/a1/Library/Python/3.9/lib/python/site-packages/django/core/management/__init__.py", line 442, in execute_from_command_line utility.execute() File "/Users/a1/Library/Python/3.9/lib/python/site-packages/django/core/management/__init__.py", line 416, in execute django.setup() File "/Users/a1/Library/Python/3.9/lib/python/site-packages/django/__init__.py", line 24, in setup apps.populate(settings.INSTALLED_APPS) File "/Users/a1/Library/Python/3.9/lib/python/site-packages/django/apps/registry.py", line 91, in populate app_config = AppConfig.create(entry) File "/Users/a1/Library/Python/3.9/lib/python/site-packages/django/apps/config.py", line 178, in create mod = import_module(mod_path) File "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1030, in _gcd_import File "<frozen importlib._bootstrap>", line 1007, in _find_and_load File "<frozen importlib._bootstrap>", line 972, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed File "<frozen importlib._bootstrap>", line 1030, in _gcd_import File "<frozen importlib._bootstrap>", line 1007, in _find_and_load File "<frozen importlib._bootstrap>", line 984, in _find_and_load_unlocked ModuleNotFoundError: No module named 'django_celery_beat'
最新发布
06-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值