在Debian 6 64位上,psycopg2和libgcrypt.so出现“无法分配内存”错误
我遇到了一个奇怪的错误,跟Python的psycopg2和libgcrypt模块有关,这个错误只在生产环境中出现。
我之前在Debian 6的32位系统上运行我的应用,使用uWSGI和Nginx。后来我决定换成64位的新系统,结果一切看起来都正常,但在uwsgi.log里每次请求都会出现下面的Python错误信息:
File ".../python2.7/site-packages/django/core/handlers/wsgi.py", line 272, in __call__
response = self.get_response(request)
File ".../python2.7/site-packages/django/core/handlers/base.py", line 169, in get_response
response = self.handle_uncaught_exception(request, resolver, sys.exc_info())
File ".../python2.7/site-packages/django/core/handlers/base.py", line 203, in handle_uncaught_exception
return debug.technical_500_response(request, *exc_info)
File ".../python2.7/site-packages/django/views/debug.py", line 59, in technical_500_response
html = reporter.get_traceback_html()
and so on...
于是,我去查看了django/core/handlers/base.py文件(Django版本是1.3.1)第166行,这里是最后一个处理异常的地方。我把它替换成了:
except Exception, why:
并把“为什么”写进了一个文本文件。这个异常就是:
Error loading psycopg2 module: libgcrypt.so.11: failed to map segment from shared object: Cannot allocate memory
我几乎看了所有类似的错误、问题和博客文章,只找到一个可能不完全相同但相似的情况:
http://www.johngirvin.com/archives/dovecot-error-127-after-upgrading-to-debian-squeeze.html我尝试了以下版本:
- Django==1.3.1
- Django==1.3
- psycopg2==2.4.2
- psycopg2==2.4.1
还重启了一下,但没有任何效果。我系统上安装了postgresql-8.4、libgcrypt11和libgcrypt11-dev。PostgreSQL里没有其他模型,只有用Django默认的模型做的一个全新的./manage.py syncdb。系统内存还有一半是空的。
而且……我还尝试在生产环境中运行./manage.py runserver,结果一切正常。我的VPS在Linode上,所以我觉得硬件应该没问题。
任何帮助都非常感谢。
1 个回答
0
这可能和Python、Django、PostgreSQL、psycopg2或者libsomething.so都没有关系。
检查一下你的uWSGI配置中是否有类似于 --limit-as 的选项。在64位系统中,地址空间可能会大两倍。512或者1024应该就够用了,所以根据需要把这个值调高。