前言

在 mysql 的服务器配置中, 我们经常会使用到几个 timeout

诸如 connect_timeout, wait_timeout, interactive_timeout, read_timeout, write_timeout 等等 

我们 这里来看一下 他们的具体的使用场景, 以及具体控制的相关信息 是什么

 

 

connect_timeout

这个是 客户端 和 服务器建立连接之后, 客户端需要向服务器发起认证请求 

如果在 connect_timeout 期限内, 客户端未发送认证请求, 服务器会断开 和 客户端的连接

54 mysql 中各种 timeout - connect/wait/interactive/read/write_timeout_read

 

客户端和服务器这边新建了连接之后, 需要登录, 登录的时候设置了 socket 的读写超时时间为 connect_timeout

54 mysql 中各种 timeout - connect/wait/interactive/read/write_timeout_connect_02

 

登录之后, 如果是登录成功 

将 socket 的读写超时时间更新为 net_read_timeout, net_write_timeout

 

 

wait_timeout/interactive_timeout

这两个超时时间, 控制的是 一个连接 如果超过多久, 没有交互了, mysql 这边可以关闭这个连接了 

从描述上面看, 二者基本上是一样的, 从业务控制上面看, interactive_timeout 被转换为了 wait_timeout

54 mysql 中各种 timeout - connect/wait/interactive/read/write_timeout_mysql_03

54 mysql 中各种 timeout - connect/wait/interactive/read/write_timeout_mysql_04

 

这里是 登录校验 的时候, 将 interactive_timeout 转换为了 wait_timeout

54 mysql 中各种 timeout - connect/wait/interactive/read/write_timeout_read_05

 

 

这里是具体使用到的地方, “thd->get_protocol()->get_command” 是轮询 socket, 查看客户端是否有请求数据过来

因此 在轮询之前, 将 socket 的超时时间更新为了 wait_timeout

当前连接, 如果是超过了 wait_timeout 没有活跃, 则 超时, 然后 外层 handle_connection 的循环, 走 end_connection, close_connection 的相关流程 

54 mysql 中各种 timeout - connect/wait/interactive/read/write_timeout_timeout_06

 

 

read_timeout/write_timeout

这两个主要控制的就是 服务器这边从客户端读取数据, 和 服务器往客户端写出数据 的超时时间控制了

这两个系统变量 描述信息如下

54 mysql 中各种 timeout - connect/wait/interactive/read/write_timeout_mysql_07

54 mysql 中各种 timeout - connect/wait/interactive/read/write_timeout_mysql_08

 

read_timeout 的这边使用如下, 在处理客户端请求之前, 将 socket 的读取超时时间更新为 read_timeout

如果是 服务器这边读取客户端的请求数据, 超过了 read_timeout, 则超时 

54 mysql 中各种 timeout - connect/wait/interactive/read/write_timeout_timeout_09

 

write_timeout 的这边配置是在 登录连接之后, 将 socket 的写出超时时间更新为了 write_timeout

然后 后面的, 请求处理等等相关, 均是基于这个 write_timeout 的配置 

54 mysql 中各种 timeout - connect/wait/interactive/read/write_timeout_timeout_10

 

 

read_timeout 的整体更新流程

这个是在 创建连接, 处理业务, 关闭连接 的几个阶段的 socket 读取超时 时间的更新的一个大致的情况

初始化的时候, 使用全局变量的 read_timeout 进行初始化 读取超时时间

54 mysql 中各种 timeout - connect/wait/interactive/read/write_timeout_timeout_11

 

然后是 登录的使用, 使用 connect_timeout 来更新 socket 的读取超时时间 

54 mysql 中各种 timeout - connect/wait/interactive/read/write_timeout_read_12

 

然后是 登录验证之后, 将 socket 的读取超时时间更新为了 read_timeout

54 mysql 中各种 timeout - connect/wait/interactive/read/write_timeout_connect_13

 

然后是 轮询客户端请求之前, 将 socket 的超时时间 更新为了 wait_timeout

54 mysql 中各种 timeout - connect/wait/interactive/read/write_timeout_read_14

 

然后是处理客户端请求之前, 将 socket 的读取超时时间更新为了 read_timeout

54 mysql 中各种 timeout - connect/wait/interactive/read/write_timeout_timeout_15

 

之后是随着连接的 生命周期的业务处理, 在等待客户端请求信息之前将 socket 的读取超时时间更新为 wait_timeout, 在处理客户端的请求信息之前将 socket 的读取超时时间更新为 read_timeout

 

 

write_timeout 的整体更新流程 

这个是在 创建连接, 处理业务, 关闭连接 的几个阶段的 socket 写出超时 时间的更新的一个大致的情况

初始化的时候, 使用全局变量的 write_timeout 进行初始化 写出超时时间

54 mysql 中各种 timeout - connect/wait/interactive/read/write_timeout_mysql_16

 

然后是 登录的使用, 使用 connect_timeout 来更新 socket 的读取写出时间 

54 mysql 中各种 timeout - connect/wait/interactive/read/write_timeout_connect_17

 

然后是 登录验证之后, 将 socket 的读取超时时间更新为了 write_timeout

54 mysql 中各种 timeout - connect/wait/interactive/read/write_timeout_read_18

 

然后在之后连接的生命周期中, socket 的写出超时时间, 一直是 write_timeout

 

 

完