与具有相同规格的远程服务器相比,PostgreSQL COPY 命令在本地要慢得多

问题描述 投票:0回答:1

我在本地运行 PostgreSQL

COPY
命令时遇到性能问题。具体来说,我的 .csv 文件位于本地计算机上,我使用 COPY 将它们推送到远程 PostgreSQL 服务器。我的远程后端应用程序服务器和本地 PC 都具有相同的规格(均具有 SSD、类似的 RAM 和 CPU 内核)。 PostgreSQL 数据库本身托管在不同的远程服务器上,只能通过特定的白名单互联网连接进行访问。

配置

  • 核心数:8
  • 内存: 16 GB
  • 磁盘空间: 100 GB(50% 可用)
  • 操作系统:Linux Ubuntu
  • 姜戈:5.1
  • Python:3.11

问题是,与远程服务器相比,

COPY
命令在我的本地计算机上运行速度明显慢,尽管两个环境非常相似。我的本地电脑通过VPN连接到互联网,速度也很快。当我在本地运行下面的代码时,它比在服务器上运行要慢得多。我还注意到另一个问题:当我在本地运行进程时,通过 PSQL、pgAdmin、DBeaver 等建立连接变得非常慢。很多时候,它无法连接到远程数据库。我不确定这个问题是由多重处理还是不同的宽带连接引起的。

这是我的代码片段:

from functools import partial
from multiprocessing import Pool, cpu_count
import psycopg2


def get_connection(env):
    conn = psycopg2.connect(f"""postgresql://{env["USER"]}:{env["PASSWORD"]}@{env["HOST"]}:{env["PORT"]}/{env["NAME"]}""")
    try:
        yield conn
    finally:
        conn.close()

def copy_from(file_path: str, table_name: str, env, column_string: str):
    with get_connection(env) as connection:
        with connection.cursor() as cursor:
            with open(file_path, "r") as f:
                query = f"COPY {table_name} ({column_string}) FROM STDIN WITH (FORMAT CSV, HEADER FALSE, DELIMITER ',', NULL '')"
                cursor.copy_expert(query, f)
        connection.commit()


with Pool(cpu_count()) as p:
    p.map(partial(copy_from, table_name=table_name, env=env, column_string=column_string), file_path_list)

本地机器

操作系统:具有 Seqrite EndPoint Security 的 Linux Ubuntu 22.04 LTS

追踪路线结果:

  • 网关:~3.5 毫秒
  • 中间跳跃:6.5 毫秒至 40.7 毫秒
  • 最终跳跃:7.7 毫秒至 12.7 毫秒

远程服务器

操作系统:Linux Ubuntu

追踪路线结果:

  • 网关:~0.2 毫秒至 0.7 毫秒
  • 中间跳跃:所有响应要么不可用,要么< 1 ms

问题:

  1. 尽管具有相似的规格和快速的互联网连接,但为什么
    COPY
    命令在本地可能会变慢?
  2. 我应该在本地计算机上检查任何特定的优化或配置以提高性能吗?
  3. 网络延迟或其他因素是否会影响本地性能?如果是,我该如何解决这个问题?

任何见解或建议将不胜感激!

python database postgresql multiprocessing psycopg2
1个回答
0
投票

PostgreSQL 数据库本身托管在不同的远程服务器上,只能通过特定的白名单互联网连接进行访问。 ... 我本地电脑是通过VPN连接互联网的,速度也很快。

如果没有更多信息,我不能说,但性能差异可以简单地归因于必须通过 VPN 在互联网上发送大量数据。

您提供了延迟数字,但这与持续传输大量数据无关;我认为 CSV 很大,因为您不会注意到小 CSV 的问题。 与 COPY 相关的是持续传输速率。 这就是您应该测试的。

延迟是指获得响应所需的时间。传输速率是指数据传输的速度。用管道系统来比喻,延迟是指打开水龙头后需要多长时间才能取水,传输速率是指有多少水可以通过管道。您的传输速率仅与最慢的管道一样快,而这可能就是 VPN。

托管网络可以有两种数据传输速率:初始数据的快速速率,以及更多数据的较慢速率。小文件传输速度快,大文件启动速度快,然后速度变慢。由于大多数操作都会传输大量小文件(考虑带有小图像和文本文件的网页),这使得大多数事情的连接感觉很快。但是传输大文件(例如大 CSV)时,速度会变慢。这是为了节省带宽,同时保持连接流畅。

您应该关注的是服务器的持续传输速率。尝试使用

scp
将 CSV 文件传输到服务器,看看需要多长时间。

© www.soinside.com 2019 - 2024. All rights reserved.