我运行了两种查询,
1.特意引入了一个查询,用于在大约 10 列中执行排序(order by)。这会使用 CPU,因为排序是 CPU 密集型操作。
该场景涉及运行查询,该查询花费了 30 秒,并在 100 个不同的表上使用同时连接运行了大约 100 个查询。32 核计算机上的 CPU 使用率在所有 32 个核上约为 85%,并且所有 100 个查询都是并行运行的。
2.在表中插入一百万行。
我不明白为什么这会消耗CPU,因为这纯粹是磁盘I/O。但是我使用100个并发连接/线程在单个表上插入了100万行,并且这些表上没有索引,现在插入不是加载数据最快的方法,但这里的重点是它在大约 10 个核心上消耗了大约 32% 的 CPU 时间。这比上面的要少得多,但我仍然只是好奇。
我可能是错的,因为 Wal 归档已打开并且查询日志已打开 - 这是否对 CPU 有影响。我假设不会,因为这些也是磁盘 IO。
除了 postgres 之外,该计算机上没有运行/安装其他进程/应用程序。
最佳答案
许多不同的事情:
- 用于查询规划的 CPU 时间以及用于查询执行的执行器中的逻辑
- 将元组的文本表示形式转换为其磁盘上的格式。解析日期等等。
- 日志输出
- 处理事务日志
- 插入要写入的页面时写入shared_buffers,扫描shard_buffers以获取要写出的页面
- 用于锁管理的进程间通信
- 在检查唯一性、在索引中插入新键等时扫描内存中缓存的索引副本
- ...
如果您确实想了解有趣的细节,请启动 perf
并启用堆栈跟踪,以查看 CPU 时间花费在哪里。
关于database - 数据库中的 CPU 利用率实际上意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32847425/