一次系统响应慢的排查
先说一下,系统的相关信息,一共两个系统分别称呼是 A 和 B 吧。1. 两个系统都没有源码;2. A 是 springboot 项目,B 是传统的 Tomcat;3. 两者都是使用内网 IP 地址连接同一个数据库;4. 两个系统包括数据库都是一个月前老服务器迁移到了新服务器。表现是 A 系统也就是 springboot 系统响应速度正常,B 系统也就是那个 Tomcat 系统响应速度相对正常,就是有一点慢,但是一直没有放在心上,内部系统,能用,有一天发现 B 系统的某个接口特别特别慢,以至于会响应超时,然后排查这个问题,还有就是目前只发现了这一个接口慢,A 系统有一个类似功能的接口,响应速度也正常。
当时看到这个响应,第一反应:B 系统有个配置错了,因为一个月前刚迁移了系统,而 B 系统一共有三个配置文件,需要配置数据库连接,有个地方忘记修改了,刚好这个接口用的是这个系统的配置文件的连接地址,所以调用数据库连接超时报错,经排查发现三个地址的配置均修改了,是正确的。
在上一步的排查中也没有发现有任何报错日志,所以第二反应,出现了慢查询,但是感觉不太应该,数据库是完整迁移的,以前也不慢啊,而且 A 系统有个功能类似的接口,响应速度也算正常。其实正常是看慢查询日志,看有没有相关的 SQL,但是系统没有记录,所以通过 SQL 语句查询:
SELECT trx_id AS 事务ID, trx_state AS 状态, trx_started AS 开始时间, trx_mysql_thread_id AS 线程ID, TIME_TO_SEC(TIMEDIFF(NOW(), trx_started)) AS 已运行秒数, trx_query AS 当前SQL FROM information_schema.INNODB_TRX ORDER BY trx_started\G
经查询,调用这个接口的时候,没有超长执行的 SQL 语句所以排除。
然后下一个排查方向是不是 jdbc 的驱动版本不对,B 系统的 jdbc 版本还是 5 点几,而数据库的版本已经是 8 点几,这有点对不上啊,大模型说 8 点几的认证方式修改了,所以那就修改 jdbc 的版本测试,然后没有任何变化。
接着想是不是新迁移的服务器性能跟不上,其实感觉这个也不太可能,因为已经查询了,没有超长 SQL 再执行,还是把系统拉到测试环境试了一下,速度正常,测试环境服务器不如线上服务器。
再然后对比测试环境和线上的区别,发现数据库的配置有区别:测试环境配置有个参数:skip-name-resolve,线上没有,线上配置该参数后重启 MySQL,响应速度恢复。
作为一名开发,非 DBA,对这个参数确实不了解,以下是大模型对这个参数的解释:
skip-name-resolve 是 MySQL 中的一个配置参数,用于控制 MySQL 服务器是否对客户端连接进行 DNS 反向解析(即将客户端的 IP 地址解析为主机名)。
含义详解:
– 默认行为(未设置 skip-name-resolve):
– 当客户端连接到 MySQL 时,MySQL 会尝试通过 DNS 反向解析客户端的 IP 地址,获取其主机名。
– 然后在权限系统(如 mysql.user 表)中匹配 ‘user’@’host’ 的授权记录,其中 host 可以是主机名或 IP。
– 这个过程可能涉及正向和反向 DNS 查询,如果 DNS 配置不当或网络延迟高,会导致连接变慢甚至失败。
– 启用 skip-name-resolve(在配置文件中添加 skip-name-resolve):
– MySQL 跳过 DNS 反向解析,只使用客户端的 IP 地址进行身份验证。
– 此时,在权限表中,所有 ‘user’@’host’ 的 host 部分必须是 IP 地址或通配符(如 %),不能是主机名。否则这些基于主机名的授权将被忽略,导致用户无法登录。
使用场景:
– 在 内网环境 或 DNS 不可靠/不可用 的环境中,建议启用此选项以提升连接速度和稳定性。
– 在 高性能或高并发 场景下,避免 DNS 解析带来的额外延迟。
– 如果你确定所有用户授权都是基于 IP 地址(例如 ‘myuser’@’192.168.1.%’ 或 ‘myuser’@’%’),那么启用它是安全的。
配置方式:
在 MySQL 配置文件(如 my.cnf 或 my.ini)的 [mysqld] 段中添加:
[mysqld] skip-name-resolve
然后重启 MySQL 服务使配置生效。
注意事项:
– 启用后,不能使用主机名作为授权的 host 部分。例如 ‘user’@’webserver.local’ 将失效。
– 如果你使用了像 ‘user’@’localhost’ 这样的本地连接,通常不受影响,因为 localhost 会走 Unix socket(Linux/macOS)或命名管道(Windows),不经过 TCP/IP,因此不触发 DNS 解析。
– 如果应用通过 127.0.0.1 连接,则属于 TCP/IP 连接,但因为是 IP,所以兼容 skip-name-resolve。
总结:
skip-name-resolve 能提升连接性能并避免 DNS 相关问题,但要求权限系统中只使用 IP 地址或 % 作为主机标识。在大多数生产环境中推荐启用,前提是授权策略已适配。
问题虽然解决了,但还有最后一个问题:为什么 A 系统响应速度正常,B 系统这个接口就不正常,其他接口响应相对较慢,但也没有超时呢?
其实原因很简单:A 系统使用了数据库连接池,所以系统启动的时候会初始化一批连接放到了连接池中,需要的时候直接从池子中取一个即可,所以响应速度正常;B 系统三个配置文件,其中有两个没有使用连接池,其他接口需要连接数据库的时候就是单次链接,所以仅仅慢一些而已,而这个接口需要很多次连接数据,每次连接数据库都很慢,次数多了,总时间就超过前端写的 60 秒超时,提示响应时间超时了。
作 者: BridgeLi,https://www.bridgeli.cn
原文链接:http://www.bridgeli.cn/archives/808
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
近期评论