PostgreSQL 大量大型数组和写入

PostgreSQL 大量大型数组和写入

我正在运行一个生成 8 个线程的 python 程序,每个线程都通过 psycopg2 启动自己的 postmaster 进程。这是为了最大限度地利用我的 CPU 核心 (8)。每个线程调用一系列 SQL 函数。这些函数中的大多数通过使用 unnest() 并将每个 FLOAT8 乘以与每行关联的另一个 FLOAT8 来遍历数千行,每行都与一个大的 FLOAT8[] 数组 (250-300) 值相关联。这种数组方法最小化了索引和表的大小。函数以将相同形式的行 (pk INT4, array FLOAT8[]) 插入另一个表而结束。python 调用的一些 SQL 函数将更新此类表 (具有大数组) 的一行。

现在我已将 PostgreSQL 配置为将大部分内存用于缓存(我认为有效缓存大小为 57 GB),只将一小部分内存用于共享内存(我认为是 1GB)。首先,我想知道 PostgreSQL(以及我的应用程序)中的缓存和共享内存之间有什么区别。

我注意到,在应用程序读取最密集的部分(Select unnest(array) 等)中,仅使用了总 CPU 处理能力的 20-40%。其次,我想知道我可以做些什么来改进这一点,以便使用 100% 的 CPU。根据我的观察,这似乎与 python 或其 GIL 无关。

谢谢

答案1

有效缓存大小不会更改任何内存设置,它仅用于查询规划中的估算目的。将 shared_buffers 提高到可用 RAM 的 25% 左右,看看速度是否有任何差异。

另外,使用 EXPLAIN 获取查询计划并查看是否需要一些额外的索引或更好的配置。

答案2

看来您遇到了 I/O 瓶颈。您有大量缓存内存,但数据集有多大?当前磁盘配置是什么?磁盘有多忙?瓶颈可能是网络吗?

另外要检查的是每个进程有多少工作内存。有可能无缘无故地有大量内存流量。

本网站对调整 postgres 有一个很好的概述。

相关内容