Django 1.7,uwsgi和PostgreSQL的随机数据库错误

Vas*_*eev 5 django postgresql psycopg2 uwsgi django-1.7

将我的Django 1.6应用程序升级到Django 1.7后,我从PostgreSQL获取数据时开始出现随机错误:

DatabaseError: server sent data ("D" message) without prior row description ("T" message)
lost synchronization with server: got message type "?", length -1244613424

DatabaseError: lost synchronization with server: got message type "0", length 842674226

ProgrammingError: no results to fetch

ValueError: invalid literal for int() with base 10: 'feuj3f47jvsdv7tgnj43g63j'
Run Code Online (Sandbox Code Playgroud)

当我在浏览器中快速打开10个选项卡时,一半选项卡正常加载,其中一半会出现数据库错误.当我刷新发生错误的选项卡时,它们会正常加载.

我通过uwsgi和nginx运行Django,psycopg2的版本是2.5.4.

总的来说,看起来与Postgres的沟通完全被打破,不同查询的结果混合在一起.


编辑:

经过几个小时的故障排除后,我发现了以下内容:

Django 1.6 + uwsgi - 作品
Django 1.7 + gunicorn - 作品Django 1.7 + uwsgi -
不起作用,抛出数据库错误.所以问题似乎与特定的uwsgi和Django 1.7组合.这很奇怪,我有另一个Django 1.7项目在相同的服务器上运行相同的uwsgi,它没有问题.

有任何想法吗?

(我真的不介意切换到gunicorn,可能必须采用这种方式,但它仍然很有趣,为什么会发生这种情况)


更新2:仔细检查显示Django内部发生了完全疯狂的事情,就像模型的主键被当前用户的session_id替换(这是"带有基数10的int()的无效文字"错误)和Django向DB发出查询"忘记" "指定WHERE子句.我可能会说某种内存损坏.


更新3:我们从uwsgi切换到gunicorn,问题现在已经消失.一切都很好.我可能仍在寻找合适的解决方案.

小智 6

我认为lazy-apps=true应该做的伎俩.来自uwsgi文档:

uWSGI尽可能尝试(ab)使用fork()调用的Copy On Write语义.默认情况下,它会在加载应用程序之后进行分叉,以尽可能多地共享内存.如果出于某种原因不希望出现此行为,请使用lazy-apps选项.这将指示uWSGI在每个worker的fork()之后加载应用程序.请注意,有一个名为lazy的旧选项更具侵入性和高度劝阻(它仍然只是为了向后兼容)

如果你没有打开lazy-apps,工人将共享内存,并且很可能会破坏它:

模型的主键被当前用户的session_id替换.

当涉及连接和东西时,不设置lazy-apps是危险的.

缺点是每个工作人员都有一个完整的连接池(如果正在进行连接池),并且最终可能会使用大量连接.

我不是python专家,但我认为使用像gevent这样的东西来集中处理连接池.你甚至可能不需要lazy-apps.