10

我已经在我拥有的 VPS 上设置了 PostgreSQL——访问数据库的软件是一个名为 PokerTracker 的程序。

PokerTracker 在玩在线扑克时记录您所有的手牌和统计数据。

我希望可以从几台不同的计算机上访问它,因此决定将它安装在我的 VPS 上,经过几次小插曲后,我设法让它连接起来没有错误。

然而,性能是可怕的。我已经对“远程 postgresql 慢”等进行了大量研究,但还没有找到答案,所以希望有人能够提供帮助。

注意事项:

我试图执行的查询非常小。在 VPS 上本地连接时,查询会立即运行。

远程运行时,运行查询大约需要 1 分 30 秒。

VPS 运行 100MBPS,然后我连接到它的计算机在 8MB 线上。

两者之间的网络通信几乎是即时的,我能够毫无延迟地进行远程连接,并且托管了多个运行 MSSQL 的网站,并且所有查询都立即运行,无论是远程连接还是本地连接,因此它似乎特定于 PostgreSQL。

我正在使用他们的软件运行他们最新版本的软件和 PostgreSQL 的最新兼容版本。

该数据库是一个新数据库,几乎不包含任何数据,我已经运行了 Vacuum/analyze 等都无济于事,我没有看到任何改进。

我不明白 MSSQL 是如何几乎可以立即查询的,但 PostgreSQL 却苦苦挣扎。

我能够毫无问题地远程登录到 VPS IP 上的端口 5432,正如我所说的那样,查询确实执行了它只需要很长时间。

我注意到的是,当查询运行时,路由器上几乎没有使用任何带宽 - 但是我不希望它用于简单的查询,但不确定这是否是问题。我现在尝试在 3 个不同的网络上进行远程连接(包括不同的路由器),但问题仍然存在。

通过 LAN 通过另一台机器远程连接是即时的。

我还编辑了 postgre conf 文件以允许更多内存/缓冲区等,但我认为这不是问题 - 我要求它做的事情非常简单 - 它根本不应该是密集的。

谢谢,瑞奇

编辑:请注意客户端和服务器都运行 Windows。

这是来自配置文件的信息。

pg_hba - 当前允许所有流量:

# TYPE DATABASE 用户 CIDR-ADDRESS 方法

# IPv4 本地连接:
托管所有所有 0.0.0.0/0 md5
# IPv6 本地连接:
# 全部托管 ::1/128 md5

而 postgresqlconf - 我知道我已经为这个配置提供了一些庞大的缓冲区/内存,只是为了测试它是否是问题 - 只显示未注释的行:

听地址 = '*'
端口 = 5432
最大连接数 = 100
共享缓冲区 = 512MB
工作内存 = 64MB
max_fsm_pages = 204800
shared_preload_libraries = '$libdir/plugins/plugin_debugger.dll'
log_destination = 'stderr'
logging_collector = on
log_line_prefix = '%t'
datestyle = 'iso,mdy'
lc_messages = 'English_United States.1252'
lc_monetary = 'English_United States.1252'
lc_numeric = 'English_United States.1252'
lc_time = 'English_United States.1252'
default_text_search_config = 'pg_catalog.english'

需要任何其他信息,请告诉我。感谢你的帮助。

4

6 回答 6

7

我启用了日志记录并将日志发送给他们软件的开发人员。他们的回答是,这些软件最初打算在本地或接近本地的数据库上运行,因此在 VPS 上运行会很慢——由于网络延迟。

感谢您的所有帮助,但看起来我没有想法,这是由于软件,而不是 VPS 上的 PostgreSQL。

谢谢,瑞奇

于 2011-01-12T14:55:30.547 回答
2

您可以执行一个which 将告诉您查询在服务器上explain analyze的执行时间(没有将结果发送到客户端的网络开销)。

如果服务器执行时间非常快(与您看到的时间相比),那么这是一个网络问题。如果报告的时间与您观察到的时间非常相似,那就是 PostgreSQL 问题(然后您需要发布执行计划以及可能的 PostgreSQL 配置)

于 2011-01-11T17:56:01.197 回答
1

已经被这个问题困扰了一段时间,这个问题引导我找到答案,所以我想我会分享它以防万一。

服务器有一个辅助网络接口 (eth1),它被设置为默认路由。执行查询的客户端与 eth0 在同一子网内,因此这不会导致任何问题。但确实如此。

禁用默认路由会使查询在正常时间范围内返回。但长期的解决方法是将listen_addressesfrom更改'*'为正确的 IP。

于 2016-11-09T04:21:10.520 回答
0

使用网络监控工具(我推荐使用wireshark,因为它可以跟踪很多协议,包括postgresql 的)来查看网络连接是否正常。如果连接不好,您将看到丢弃/重新传输的数据包。

于 2011-01-11T12:51:40.923 回答
0

也许 Postgres 正在尝试使用ident对您进行身份验证,这不起作用(例如被防火墙屏蔽),并且必须等待超时才能通过其他方式允许连接。

尝试查询远程服务器以select version()使用 psql - 这应该是即时的,因为它不接触磁盘。

如果不是即时的,请发布您的pg_hba.conf(未注释的行)。

另一个可能的原因:

  • 使用 RevDNS 进行身份验证;
  • 服务器或客户端上的防病毒软件;
  • 其他一些连接阻塞了一个表或行,因为它没有清楚地结束。
于 2011-01-11T17:42:14.203 回答
0

这不是为什么 pg 访问在 VPN 上速度慢的答案,但一个可能的解决方案/替代方案可能是设置 TeamPostgreSQL 以通过浏览器访问 PG。它是一个 AJAX 网络应用程序,包括一些非常方便的功能,用于导航数据和管理数据库。

这也可以避免连接断开,根据我的经验,在通过 VPN 使用 pg 时这种情况很常见。

还有用于 Web 访问的 phpPgAdmin,但我提到了 TeamPostgreSQL,因为它对于导航和了解数据库中的数据非常有帮助。

于 2011-01-13T09:46:13.970 回答