Mysql DNS反向解析导致连接超时过程分析(skip-name-resolve) |
MySQL数据库收到一个网络连接后,首先拿到对方的IP地址,然后对这个IP地址进行反向DNS解析从而得到这个IP地址对应的主机名 。用主机名在权限系统里面进行权限判断 。反向DNS解析是耗费时间的,有可能让用户感觉起来很慢 。甚至有的时候,反向解析出来的主机名并没有指向这个IP地址,这时候就无法连接成功了 。 可以在配置文件里面禁止MySQL进行反向DNS解析,只需在my.cnf的[mysqld]段落中加入如下行即可: skip-name-resolve (windows与linux下一样的) 设备在连接mysql时候,等待服务器的banner信息需要4s左右,影响了Mysql服务的连接速度 。 1、Telnet端口验证 通过设备和虚拟机(Linux系统)分别Telnet Mysql服务的端口,会出现一下现象: 设备(UAG/SCANNER): telnet后,等待Mysql的服务器端回应大概需要等10s左右 。 [DPtech-Developer-Shell]telnet 10.101.0.206 3308 [root]'# telnet 10.101.0.206 3308 2、通过程序进行验证 具体源代码见附件:验证程序源代码 在设备上和虚拟机中的结果分别如下: [DPtech-Developer-Shell]/tcpclient_mips 10.101.0.1 3306 虚拟机: [root]tcp_demo# ./tcpclient 10.101.0.1 3306 可以发现,设备上大约比Linux服务器多耗时9s,其中10秒钟可能是recv本身超时的时间 。 3、通过不同操作系统进行Telnet验证 通过Windows系统和Linux虚拟机、设备,分别通过Telnet进行连接尝试,通过抓包分析得知,只有设备的耗时比较长,其他的耗时都比较短 。 Mysql论坛的提问: http://forums.mysql.com/read.php?11,250982,250982#msg-250982 另外通过自己写的C代码进行连接的时候也存在同样的问题,修改skip-name-resolve以后,实际上就可以发现该问题已经不存在了: 设备: [DPtech-Developer-Shell]/tcpclient_mips 10.101.0.1 3306 通过虚拟机Telnet连接另外一个ip 10.101.0.206时候发现速度也比较慢,消耗的时间基本上和设备中相当,可能是由于虚拟机和宿主主机之前不需要进行反向域名解析,或者说是应为系统本身就知道虚拟机IP地址(NAT模式)对应的主机名,所以不需要进行DNS反向解析,导致在虚拟机中出现了特殊情况 。 |