PostgreSQL将自身限制为单核CPU使用(调试锁定问题?)
更新经过一些研究,这个问题似乎不正确-100%代表了所有核心,而不是单个核心,使得整个问题没有意义。我真诚地向社会道歉 在PostgreSQL 10、PostGIS 2.5.2上,在没有任何数据修改的情况下(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
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我也有这个问题,你找到问题的原因了吗?提前谢谢