如何调整 innodb_read_io_threads ?

Goo*_*bot 8 mysql innodb mariadb tuning

innodb_read_io_threads和的默认值为innodb_write_io_threads4。如何检查您的服务器负载是否需要更高数量的线程?

正如我定期检查的那样show engine innodb status \G,没有可追踪的活动:

--------
FILE I/O
--------
I/O thread 0 state: waiting for completed aio requests (insert buffer thread)
I/O thread 1 state: waiting for completed aio requests (log thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
...
I/O thread 32 state: waiting for completed aio requests (write thread)
I/O thread 33 state: waiting for completed aio requests (write thread)
Pending normal aio reads: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] , aio writes: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ,
Run Code Online (Sandbox Code Playgroud)

此外,将其增加到最大值 64 有何缺点?如果不使用,它们是无害的空闲线程。

Bil*_*win 15

Pending normal aio reads: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] , aio writes: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ,
Run Code Online (Sandbox Code Playgroud)

这些数字对应于您的读取线程和写入线程。你可以看到它们都是零。这意味着所有 I/O 都已处理完毕,即没有排队的 I/O 请求等待空闲线程。所以不需要增加线程数。

如果您经常在该行中看到非零值,则可能意味着您有大量 I/O 活动,以至于现有线程无法满足需求。

根据我的经验,对于任何数据库服务器来说,因 I/O 请求而不堪重负是非常不寻常的。在几乎所有情况下,默认的线程数足以轻松处理负载。此外,每个线程可以同时处理多个 I/O 请求,因为它使用异步 I/O。

即使您的数据库服务器不需要它,增加线程数也没有太大的缺点。这只是意味着会有更长的 0 行。但这不是必需的。

作为一般规则,我希望对 MySQL 配置文件进行尽可能少的更改。一切都使用默认值,除非有真正的理由要更改它。

如果您将这些配置选项设置得更高,那么最终,您团队的新成员会问:“为什么 innodb_*_io_threads 值设置得这么高?” 并且您必须再次解释为什么您认为提高不需要提高的配置值如此重要。

  • 专业提示:如果将每个选项设置为默认值以外的值,请在 MySQL 配置文件中写入注释,以准确解释为什么为每个选项选择该值。任何必须维护您的数据库服务器的人都会感谢您(包括六个月后您忘记为什么设置每个选项的您)。 (8认同)