我正在运行一个生成 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 有一个很好的概述。