调试 Postgres 错误:“无法将数据发送到客户端:管道损坏”

Ric*_*ard 4 postgresql

我正在运行一个 Django 1.8 站点,由 nginx 和 Gunicorn 提供服务,后端为 Postgres 9.4。

当我连续对站点的 API 进行大量数据密集型调用时,我注意到大约百分之一的查询失败,并提供 nginx 404 页面。

我的第一个假设是 Postgres 数据库在负载下嘎吱作响,但 Postgres 日志实际上向我显示了这一点:

2015-08-06 14:33:43 UTC:127.0.0.1(42287):dbuser@dbname:[3737]: LOG:  could not send data to client: Broken pipe
2015-08-06 14:33:43 UTC:127.0.0.1(42287):dbuser@dbname:[3737]: STATEMENT:  SELECT ... (psql statement)
2015-08-06 14:33:43 UTC:127.0.0.1(42287):dbuser@dbname:[3737]: FATAL:  connection to client lost
2015-08-06 14:33:43 UTC:127.0.0.1(42287):dbuser@dbname:[3737]: STATEMENT:  SELECT ... (psql statement)
Run Code Online (Sandbox Code Playgroud)

我认为这意味着 Postgres 实际上运行查询正常,但它无法将数据发送到客户端。

所以我认为要调试这个问题,我实际上应该看看 Django/Gunicorn/nginx。

我的理解正确吗?

Kas*_*dry 6

是的,看来您已经正确理解了这一点。客户端将数据发送到 postgresql 后端,然后突然断开连接(或被终止)。该消息基本上是“我有一个答案给你,但我无处可发送!”

我肯定会查看其他服务的日志并比较时间戳,以尝试更深入地了解正在发生的情况。

希望有帮助。=)