Amazon RDS 上的 IOPS

Qui*_*ter 5 amazon-rds

我对 AWS 非常陌生。insertAmazon RDS 表上的一次记录操作是否算作 1 IOP?

我有一个每天插入大约 100 万条记录的用例,并且希望该作业在大约 10-20 分钟内完成运行。这会算作 100 万 IOP 吗?这是否意味着我的 IOPS 应该是 1000000/(10*60) = 1667 IOPS?

此外,select查询会算作 1 IOP 还是等于返回的记录数?

jyn*_*nus 4

将选择查询计数为 1 IOP 还是等于返回的记录数?

不会。假设Amazon准确地计算了IOP(毕竟它们是虚拟机),那么SQL和磁盘IO操作之间存在一些抽象:

  • com_selectSQL 操作:可以通过、com_insert等计数器看到SHOW GLOBAL STATUS。请注意,如果您有像 query_cache 这样的缓存,则几乎不会执行任何磁盘操作(因为结果将直接从内存返回)。
  • 'Handler_%'处理程序(“行”)操作:可以通过计数器看到SHOW GLOBAL STATUS
  • 引擎操作:读取单行或插入单行(Handler_write)对于每个引擎都会以不同的方式完成,这意味着 MySQL 是否缓冲。例如,对于 InnoDB,您可以检查缓冲池读取请求与磁盘读取请求的全局状态变量。单行读取可能需要对索引和 UNDO 历史记录中的行的不同版本进行多次读取才能返回。
  • 文件系统缓存:经常读写的数据通常会被操作系统缓存在内存中。这将通过避免实际的磁盘 IO 来加速后续的读取和写入(特别是在像 Amazon 这样的地方,其中 IO 可以位于本地磁盘上或通过具有非确定性响应的网络)。
  • 磁盘IO:即使在处理实际IO时,写入通常也是以块的形式完成的。

我没有详细介绍 MySQL 和操作系统的内部结构,即使不这样做,你也可以看到事情并不明显——事实上,减少 IO 并了解为什么在某些情况下会有如此多的 IO 是最重要的领域之一数据库优化。

像 InnoDB 这样的引擎将要求其所有页面在插入时写入 3 或 4 次(一次在事务日志上,一次在实际表空间上,一次在双写缓冲区上,还可以选择在二进制日志上) - 这是一种简化 - 它不需要考虑索引更新、元数据、统计信息等。了解您需要多少 IOPS 的最佳方法是在特定设置上进行测试。即使有一些假的较小的测试,它也会比理论更可靠。在操作系统和数据库级别进行缓存将使数字显着不同。

例如,有一天我以 200.000 行/秒的速度插入了数千万条记录LOAD DATA(没有 SQL 开销),因为我有足够的内存几乎只写入 InnoDB 缓冲池。不过,磁盘需要几分钟时间才能与内存内容同步。