8

查看 postgres 服务器日志,我发现从 Linux 客户端或 Windows 客户端调用时,在同一个 postgres 服务器上执行完全相同的查询需要更长的时间(大约长 10 倍)。

查询来自运行在具有 4GB RAM 的 Linux 机器和具有 8GB RAM 的 Windows 机器上的 Django 应用程序。两个 pyhon 环境都有 psycopg2 库版本 2.4.4 来向同一个 postgres 服务器发送请求。

以下是 postgres 服务器日志

windows查询(有时间):

2013-06-11 12:12:19 EEST [unknown] 10.1.3.152(56895) mferreiraLOG:  duration: 3207.195 ms  statement: SELECT "autotests_tracerperformance"."id", "autotests_tracerperformance"."date", "autotests_tracerperformance"."video_id", "autotests_tracerperformance"."revision_id", "autotests_tracerperformance"."computer_id", "autotests_tracerperformance"."probe", "autotests_tracerperformance"."time_tostart", "autotests_tracerperformance"."hang_atstart", "autotests_tracerperformance"."time_tohang", "autotests_tracerperformance"."hang", "autotests_tracerperformance"."crash", "autotests_tracerperformance"."stacktrace", "autotests_tracerperformance"."framemax", "autotests_tracerperformance"."maxtime", "autotests_tracerperformance"."avgtime" FROM "autotests_tracerperformance" INNER JOIN "revisions" ON ("autotests_tracerperformance"."revision_id" = "revisions"."id") WHERE ("autotests_tracerperformance"."computer_id" = 61  AND "revisions"."repo" = 'Trunk' )

linux查询(更长):

2013-06-11 12:12:56 EEST [unknown] 10.1.3.154(35325) mferreiraLOG:  duration: 22191.773 ms  statement: SELECT "autotests_tracerperformance"."id", "autotests_tracerperformance"."date", "autotests_tracerperformance"."video_id", "autotests_tracerperformance"."revision_id", "autotests_tracerperformance"."computer_id", "autotests_tracerperformance"."probe", "autotests_tracerperformance"."time_tostart", "autotests_tracerperformance"."hang_atstart", "autotests_tracerperformance"."time_tohang", "autotests_tracerperformance"."hang", "autotests_tracerperformance"."crash", "autotests_tracerperformance"."stacktrace", "autotests_tracerperformance"."framemax", "autotests_tracerperformance"."maxtime", "autotests_tracerperformance"."avgtime" FROM "autotests_tracerperformance" INNER JOIN "revisions" ON ("autotests_tracerperformance"."revision_id" = "revisions"."id") WHERE ("autotests_tracerperformance"."computer_id" = 61  AND "revisions"."repo" = 'Trunk' )

直接从 psql 执行(最快):

2013-06-11 12:19:06 EEST psql [local] mferreiraLOG:  duration: 1332.902 ms  statement: SELECT "autotests_tracerperformance"."id", "autotests_tracerperformance"."date", "autotests_tracerperformance"."video_id", "autotests_tracerperformance"."revision_id", "autotests_tracerperformance"."computer_id", "autotests_tracerperformance"."probe", "autotests_tracerperformance"."time_tostart", "autotests_tracerperformance"."hang_atstart", "autotests_tracerperformance"."time_tohang", "autotests_tracerperformance"."hang", "autotests_tracerperformance"."crash", "autotests_tracerperformance"."stacktrace", "autotests_tracerperformance"."framemax", "autotests_tracerperformance"."maxtime", "autotests_tracerperformance"."avgtime" FROM "autotests_tracerperformance" INNER JOIN "revisions" ON ("autotests_tracerperformance"."revision_id" = "revisions"."id") WHERE ("autotests_tracerperformance"."computer_id" = 61  AND "revisions"."repo" = 'Trunk' );

其他不需要从数据库加载这么多项目的查询执行几乎相同。

为什么这个查询的客户之间的时间差异如此之大?

注意:传输时间无关紧要,因为所有机器都在同一个 Intranet 中。此外,当客户端请求来自运行 postgresql 服务器的同一台 Linux 机器时,会看到较慢的时间。

注意 2: Psycopg2在 Windows 和 Linux 中的安装方式不同。在 Windows 中,我从预打包的二进制文件中安装它,而在 Linux 中,我运行“pip install psycopg2”,它依赖于系统上可用的 postgresql 安装。这是否会导致影响客户端性能的参数值不同(例如“work_mem”参数)?

4

1 回答 1

12

您可能需要检查慢速客户端是否进行 SSL 加密。当它在服务器上设置并且客户端已使用 SSL 支持编译时,默认情况下会发生这种情况。

对于检索大量数据的查询,时间差异很大。此外,一些 Linux 发行版(如 Debian/Ubuntu)默认启用 SSL,即使对于通过 localhost 的 TCP 连接也是如此。

例如,以下是使用热缓存检索 1,5M 行总重为 64Mbytes 的查询的时间差。

不加密:

$ psql "host=localhost dbname=mlist sslmode=disable"
密码:
psql(9.1.7,服务器 9.1.9)
键入“帮助”以获得帮助。

mlists=> \计时
定时开启。
mlists=> \o /dev/null
mlists=> 从邮件中选择主题;
时间:1672.258 毫秒

带加密:

$ psql "host=localhost dbname=mlist"
密码:
psql(9.1.7,服务器 9.1.9)
SSL 连接(密码:DHE-RSA-AES256-SHA,位:256)
键入“帮助”以获得帮助。

mlists=> \o /dev/null
mlists=> \计时
定时开启。
mlists=> 从邮件中选择主题;
时间:7017.935 毫秒

要全局关闭它,可以设置SSL=off.postgresql.conf

要为特定范围的客户端地址关闭它,请在更通用的条目之前的第一个字段中pg_hba.conf添加条目。hostnosslhost

要关闭客户端,这取决于驱动程序如何公开sslmode连接参数。如果没有,PGSSLMODE如果驱动程序是在libpq.

至于通过 Unix 域套接字 ( local) 的连接,SSL 从不与它们一起使用。

于 2013-06-11T13:01:50.270 回答