我运行一个python程序,产生8个线程,每个线程通过psycopg2启动自己的postmaster进程。 这是为了最大限度地使用我的CPU核心(8)。 每个线程调用一系列SQL函数。 这些函数中的大多数通过使用unnest()并将每个FLOAT8乘以与每行关联的另一个FLOAT8,从而通过成千上万的行关联到一个大的FLOAT8 []数组(250-300)值。 这种数组方法最大限度地减less了索引和表的大小。 该函数以插入到同一表格(pk INT4,数组FLOAT8 [])的一行的另一个表中的方式结束。 一些由python调用的SQL函数将会更新这些types的表(大数组)。
现在我已经configurationPostgreSQL使用大部分的内存caching(我认为57 GB的effective_cache_size),只有less量的共享内存(我认为是1GB)。 首先,我想知道Cache和共享内存在PostgreSQL(和我的应用程序)方面有什么区别。
我注意到,在大多数读取密集型应用程序(Select unnest(array)等)期间,我的总CPU处理能力只有大约20-40%被使用。 所以第二,我想知道我能做些什么来改善这个问题,这样就可以使用100%的CPU。 根据我的观察,似乎与python或其GIL没有任何关系。
谢谢
effective_cache_size不会更改任何内存设置,它仅用于查询计划中的估计目的。 将共享缓冲区占用大约25%的可用内存,查看速度是否有差异。
另外,使用EXPLAIN来获取查询计划,看看你是否需要一些额外的索引或更好的configuration。
看来你已经遇到了I / O瓶颈。 你有很多高速缓冲存储器,但是数据集有多大? 什么是当前的磁盘configuration? 磁盘有多忙? 瓶颈是networking吗?
另一件要检查的是每个进程有多less工作内存。 有可能是没有理由有很多的内存stream量。
这个网站有一个良好的调整postgres概述。