当我这样做时,$ time psql -c "select repeat('a', 123456789)" -o /dev/null -U postgres -h hostname
我可靠地得到了大约 10 秒,传输速度约为 12 MB/秒。我想做得更好。
当传输相同大小的文本行时,我得到相同的速度(不要问),所以我不认为使用repeat
.
客户端是 EC2 实例 (m4.4xlarge)。它和 RDS 实例位于同一 AWS 区域和同一 VPC 中。使用计数 1,时间 < 0.1 秒,确认延迟较低。
EC2实例的传输速度似乎并不是极限。speedtest-cli 确认带宽约为 1600 Mbit/秒
在 m4.2xlarge、m6i.xlarge、t3.medium 三个不同大小的 RDS 实例上测试结果相同。所有这些都具有 >1Gbps 网络。
这似乎不是 TCP 慢启动 - 将计数加倍,时间也会加倍。
通过禁用 SSLPGSSLMODE="disable"
没有帮助。
将命令包装psql
在while true
循环中,我可以调用多个并发循环,它们各自以 12 MB/秒的速度传输,这表明这不是客户端或服务器的限制。
有什么建议么?你能在你的服务器上试试吗?谢谢!!
版本:
psql (11.18 (Ubuntu 11.18-1.pgdg22.04+1), server 11.16)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
psql
将整个结果集读入内存,然后尝试对其进行格式化以供输出。这种格式化速度相对较慢。在我看来,你的命令在本地运行(不带 -h)需要 4 秒。现在这个时间远少于 10 秒,但仍然很多,而且我们使用不同的系统,因此尚不清楚它们的可比性如何。
如果我通过在 psql 命令行中添加“-A”开关来关闭大部分格式化,则需要大约 0.8 秒,这与构造重复字符串所需的时间相差不远。