Server A连接MariaDB服务器(Server C)速度异常缓慢求助
环境概述
- Server A:Debian 系统,搭载 Apache、PHP 组件
- Server B(旧服务器):Debian 系统,搭载 MySQL 服务
- Server C(新服务器):Debian 系统,搭载 MariaDB 服务
Server A 连接 Server B 耗时约 0.002 秒,速度极快;但连接 Server C 耗时在 0.3-1.5 秒之间,延迟明显。两台数据库服务器的 ping 响应速度一致,且已尝试同步 Server B 的配置参数到 Server C,问题仍未解决。
测试连接的 PHP 代码:
$begin = microtime(true); $db_c = new PDO('mysql:host='.$dburl.';dbname='.$dbtable.';charset=utf8',$dblogin,$dbpass); $db_c->query("SET NAMES 'utf8'"); $db_c->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); $end = microtime(true); $temps = $end - $begin;
具体排查方向
1. 禁用反向 DNS 解析
MySQL/MariaDB 默认会对客户端 IP 做反向 DNS 查找,若 Server C 的 DNS 配置存在延迟,会导致连接耗时增加。在 Server C 的 my.cnf(或 my.ini)配置文件中添加:
skip-name-resolve
保存后重启 MariaDB 服务,再测试连接速度。
2. 调整用户认证插件
MySQL 与 MariaDB 默认认证插件存在差异:旧版 MySQL 常用 mysql_native_password,而新版 MariaDB 默认使用 caching_sha2_password,后者在某些场景下会增加连接延迟。在 Server C 上执行 SQL 修改目标用户的认证插件:
ALTER USER '你的用户名'@'ServerA的IP' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;
修改后重新测试连接。
3. 优化 TCP 栈参数
检查 Server C 的 TCP 配置,临时调整以下参数测试效果:
# 禁用 TCP 延迟确认 echo 0 > /proc/sys/net/ipv4/tcp_delack_min # 增大 TCP 接收窗口 echo 4194304 > /proc/sys/net/core/rmem_max
若有效,将参数写入 /etc/sysctl.conf 实现永久生效。
4. 优化 PDO 连接配置
将手动执行的 SET NAMES 替换为 PDO 初始化命令,同时显式指定端口,减少连接过程中的协商开销:
$options = [ PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING ]; $db_c = new PDO('mysql:host='.$dburl.';port=3306;dbname='.$dbtable.';charset=utf8', $dblogin, $dbpass, $options);
也可尝试开启持久连接(注意需评估持久连接带来的资源占用风险):
$options[PDO::ATTR_PERSISTENT] = true;
5. 抓包定位延迟环节
在 Server A 上通过 tcpdump 抓取与 Server C 的数据库连接数据包,分析延迟发生在哪个阶段:
tcpdump -i any host ServerC的IP and port 3306 -w mysql_capture.pcap
用 Wireshark 打开捕获文件,确认是 TCP 握手慢、认证阶段慢还是其他步骤导致的延迟。
内容的提问来源于stack exchange,提问作者Fabien Duplus

