innodb_read_io_threads
和的默认值为innodb_write_io_threads
4。如何检查服务器负载是否需要更高数量的线程?
正如我经常检查的那样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] ,
此外,将其增加到最大值 64 的缺点是什么?如果不使用,它们是无害的空闲线程。
这些数字对应于您的读取线程和写入线程。你可以看到它们都为零。这意味着所有 I/O 都已处理完毕,即没有等待空闲线程的排队 I/O 请求。所以不需要增加线程数。
如果您经常在该行中看到非零值,则可能意味着您的 I/O 活动繁重,以至于您现有的线程无法满足需求。
根据我的经验,对于任何数据库服务器来说,如此不堪重负的 I/O 请求是非常不寻常的。在几乎所有情况下,默认线程数足以轻松处理负载。此外,每个线程可以同时处理多个 I/O 请求,因为它使用异步 I/O。
即使您的数据库服务器不需要它,增加更高的线程数也没有太大的缺点。这只是意味着会有更长的 0 行。但这不是必需的。
作为一般规则,我希望尽可能少地对 MySQL 配置文件进行必要的更改。对所有内容都使用默认值,除非有真正的理由要更改它。
如果您将这些配置选项设置得更高,那么最终,您团队的新成员会问:“为什么 innodb_*_io_threads 值设置得这么高?” 而且您将不得不再次解释为什么您认为提高不需要提高的配置值如此重要。