Database 数据库中的CPU利用率实际上意味着什么?
我运行了两种查询 1.故意引入的查询,用于在大约10列中执行排序(order by)。这使用CPU,因为排序是CPU密集型操作 该场景涉及到运行查询,该查询耗时30秒,在100个不同的表上运行100个使用同时连接的查询。在32核机器上,所有32核的CPU使用率约为85%,所有100个查询并行运行 2.在表中插入一百万行 我不明白为什么这会消耗CPU,因为这纯粹是磁盘I/O。但我在一个表上插入了100万行,使用100个同时连接/线程,这些表上没有索引,现在插入并不是加载数据的最快方式,但这里的重点是,它在大约10个内核上消耗了大约32%的CPU时间。这比上面提到的要少很多,但我仍然只是个古玩 我可能是错的,因为Wal存档打开了,而查询日志打开了-这对CPU有影响吗?我假设没有,因为这些也是磁盘IODatabase 数据库中的CPU利用率实际上意味着什么?,database,performance,postgresql,cpu-usage,Database,Performance,Postgresql,Cpu Usage,我运行了两种查询 1.故意引入的查询,用于在大约10列中执行排序(order by)。这使用CPU,因为排序是CPU密集型操作 该场景涉及到运行查询,该查询耗时30秒,在100个不同的表上运行100个使用同时连接的查询。在32核机器上,所有32核的CPU使用率约为85%,所有100个查询并行运行 2.在表中插入一百万行 我不明白为什么这会消耗CPU,因为这纯粹是磁盘I/O。但我在一个表上插入了100万行,使用100个同时连接/线程,这些表上没有索引,现在插入并不是加载数据的最快方式,但这里的重点
除postgres外,此计算机上没有运行/安装其他进程/应用程序。如果表有主键,则它有一个隐式索引 如果表有主键,那么它将存储为b树而不是简单的平面表,这也是事实;我不清楚这一点,因为我的postgres fu在过去几年中有所减弱,但许多DBMS使用主键作为b-树的默认集群键,只将所有内容存储在b-树中。管理b树需要大量的CPU 此外,如果要从100个线程和连接中插入,则postgres必须执行锁定,以保持内部数据结构的一致性。争夺锁可能会消耗大量CPU,在拥有多个CPU的机器上尤其难以有效地完成这一任务-获取单个互斥体需要系统ala缓存一致性协议中每个CPU的合作 您可能想尝试不同数量的线程,同时测量总体运行时和cpu使用情况-您可能会发现,如果使用8个线程,cpu总使用量是当前使用量的1/10,但仍能在原始时间的110-150%内完成任务。这肯定是锁争用正在扼杀CPU使用率的迹象。许多不同的事情:
- 查询计划的CPU时间和执行器中执行查询的逻辑
- 将元组的文本表示转换为其磁盘格式。解析日期等等
- 日志输出
- 处理事务日志
- 写入共享_缓冲区插入要写入的页面时,扫描碎片_缓冲区以查找要写入的页面
- 用于锁管理的进程间通信
- 在检查唯一性、在索引中插入新键等时,扫描内存中缓存的索引副本
如果您真的想知道有趣的细节,请启动
perf
,启用堆栈跟踪以查看CPU时间花在哪里。downvorters:是否要留下评论?为什么要使用多线程插入?为了表演?您可以阅读我不明白为什么您会认为将数据写入数据库表纯粹是一个磁盘I/o过程。必须记录每次更改,修改块,保留更改以防操作需要回滚。这不像只是将数据从一个文件复制到另一个文件。我的假设是纯粹的磁盘I/O,但我有点怀疑自己,因此产生了一个问题。当然,这不仅仅是复制粘贴,而是什么会消耗更多的CPU,而且是可以调整/控制的。表上没有主键/索引,因此,我猜这与锁定部分有关,感谢您提供的信息,我将在这里进行更多的实验并返回。PostgreSQL不会按主键对表进行集群。主键由单独的索引支持。