PostgreSQL将自身限制为单核CPU使用(调试锁定问题?)

PostgreSQL将自身限制为单核CPU使用(调试锁定问题?),postgresql,postgis,Postgresql,Postgis,更新经过一些研究,这个问题似乎不正确-100%代表了所有核心,而不是单个核心,使得整个问题没有意义。我真诚地向社会道歉 在PostgreSQL 10、PostGIS 2.5.2上,在没有任何数据修改的情况下(SELECTquerys only),我有40个相同的GIS查询并行运行(使用不同的参数),每个查询耗时约20-500ms。服务器有很多RAM、NVME SSD CPU使用率始终显示100%的单核,这意味着所有查询都在等待无法并行执行的内容,但我不确定如何找到它 多次检查pg_stat_ac

更新经过一些研究,这个问题似乎不正确-100%代表了所有核心,而不是单个核心,使得整个问题没有意义。我真诚地向社会道歉

在PostgreSQL 10、PostGIS 2.5.2上,在没有任何数据修改的情况下(
SELECT
querys only),我有40个相同的GIS查询并行运行(使用不同的参数),每个查询耗时约20-500ms。服务器有很多RAM、NVME SSD

CPU使用率始终显示100%的单核,这意味着所有查询都在等待无法并行执行的内容,但我不确定如何找到它

多次检查
pg_stat_activity
表明所有查询都处于活动状态,其
wait_事件可能是以下情况之一:

  • 等待\u事件对于所有
  • 一些
    clientrad
    lock\u manager
    ,将其他所有内容设置为空
  • 许多
    lock\u管理器
    ,以及一些
    clientrad
    和null

有没有办法找出可能导致这种情况的原因?

这是令人惊讶的,因为阅读查询从来不会锁定除
访问独占
锁以外的任何东西,而这是诸如
删除表
截断
更改表
和类似语句等操作所需的锁

可能这些锁是内部PostgreSQL数据结构上的“轻量级锁”,通常只保留很短的时间。我不知道PostGIS查询中的什么可能会对此类内部锁产生高争用,但是您没有显示语句或其执行计划,也没有显示确切的锁事件

如果您有多个并发查询,每个查询都需要很长的时间,比如500毫秒,那么肯定应该并行运行

除了一些内部锁争用的可能性之外,我可以想到两种解释:

  • 大多数查询都足够短,一个核心就足以处理所有查询。每个连接的大部分时间都在等待客户端

  • 该系统是I/O绑定的,因此大多数CPU只是在摆弄它们的拇指。CPU iowait%等于或大于10表示该值


  • 您确定读取的CPU使用率正确吗?你在使用什么工具?你看到了什么?你能举一个查询的例子吗?@Yurik我也有这个问题,你找到问题的原因了吗?提前谢谢