资料库 |有没有办法确定哪些查询消耗的 IOPS 最多?
RDS | Is there a way to identify what queries consume the most IOPS?
我们目前正在达到我们数据库上分配的 IOPS 的限制,这让我想知道我们如何确定对我们的 IOPS 使用贡献最大的因素。
我们可以看到有哪些查询 运行、它们花费了多长时间、这些查询有多少次 运行 但这并不能直接回答哪些查询用完了所有的问题postgresql RDS 数据库的 IOPS,我们必须做出有根据的猜测。有没有更好的方法?
安装pg_stat_statements
并设置track_io_timing = on
就简单了。
pg_stat_statements
扩展提供了一个同名的视图,您可以像这样查询:
SELECT query,
blk_read_time + blk_write_time AS io_time
FROM pg_stat_statements
ORDER BY blk_read_time + blk_write_time DESC
LIMIT 20;
这样做有两个缺点:
由于 PostgreSQL 使用缓冲 I/O,读取或写入不一定会转到磁盘,但可以转到操作系统内核缓存,实际上不会导致 I/O。但是由于这样的 I/O 请求很快,它们应该只产生一小部分结果。
更大的问题是,由于关系数据库的体系结构,您不会在那里看到大多数写入请求,因为写入通常发生在检查点期间,不能归因于单个查询。
正因为如此,跟踪 shared_blks_dirtied + shared_blks_written
可能比跟踪 blk_write_time
更好,它不会告诉您 I/O 时间,但可以让您知道有多少 8kB阻止此查询被写入。
即使您无法通过这种方式获得准确的数字,pg_stat_statements
也会让您了解哪些语句导致的结果最多 I/O。
我们目前正在达到我们数据库上分配的 IOPS 的限制,这让我想知道我们如何确定对我们的 IOPS 使用贡献最大的因素。
我们可以看到有哪些查询 运行、它们花费了多长时间、这些查询有多少次 运行 但这并不能直接回答哪些查询用完了所有的问题postgresql RDS 数据库的 IOPS,我们必须做出有根据的猜测。有没有更好的方法?
安装pg_stat_statements
并设置track_io_timing = on
就简单了。
pg_stat_statements
扩展提供了一个同名的视图,您可以像这样查询:
SELECT query,
blk_read_time + blk_write_time AS io_time
FROM pg_stat_statements
ORDER BY blk_read_time + blk_write_time DESC
LIMIT 20;
这样做有两个缺点:
由于 PostgreSQL 使用缓冲 I/O,读取或写入不一定会转到磁盘,但可以转到操作系统内核缓存,实际上不会导致 I/O。但是由于这样的 I/O 请求很快,它们应该只产生一小部分结果。
更大的问题是,由于关系数据库的体系结构,您不会在那里看到大多数写入请求,因为写入通常发生在检查点期间,不能归因于单个查询。
正因为如此,跟踪 shared_blks_dirtied + shared_blks_written
可能比跟踪 blk_write_time
更好,它不会告诉您 I/O 时间,但可以让您知道有多少 8kB阻止此查询被写入。
即使您无法通过这种方式获得准确的数字,pg_stat_statements
也会让您了解哪些语句导致的结果最多 I/O。