mysql 客户端登录缓慢 strace

mysql 客户端登录缓慢 strace

我遇到了一个问题,即连接到已加载的 mysql 服务器时速度很慢,即使通过 unix 套接字文件 (CentOS 6.3) 进行连接也是如此。(0.00 sec)在这种情况下,查询完成得非常快,但登录需要几秒钟,在这种情况下:

real    0m3.128s
user    0m0.010s
sys     0m0.011s

mysqld 正在运行skip-name-resolve,因此thread_cache_size在此问题期间不会创建新线程。这是一个基于负载的问题即服务器空闲时登录速度非常快。该服务器在强大的硬件上每秒处理大约 60 个连接和 300 个查询,因此利用率很低。

以下是 strace 中停顿的部分,以空行标记。我假设停顿read(意味着它正在等待服务器的响应:

$ time strace mysql -e 'select 1'
[...]
read(3, "# /etc/services:\n# $Id: services"..., 4096) = 4096
read(3, "ervice\nfinger          79/tcp\nfi"..., 4096) = 4096
read(3, "     209/udp                    "..., 4096) = 4096
read(3, "a-cluster      694/tcp          "..., 4096) = 4096
read(3, "   1494/tcp                     "..., 4096) = 4096
read(3, "603/udp                        #"..., 4096) = 4096
close(3)                                = 0
munmap(0x7f10609da000, 4096)            = 0
rt_sigaction(SIGPIPE, {SIG_IGN, [PIPE], SA_RESTORER|SA_RESTART, 0x3318c32920}, {SIG_DFL, [], 0}, 8) = 0
socket(PF_FILE, SOCK_STREAM, 0)         = 3
fcntl(3, F_SETFL, O_RDONLY)             = 0
fcntl(3, F_GETFL)                       = 0x2 (flags O_RDWR)
connect(3, {sa_family=AF_FILE, path="/var/run/mysqld/mysqld.sock"}, 110) = 0
setsockopt(3, SOL_SOCKET, SO_RCVTIMEO, "\2003\341\1\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0
setsockopt(3, SOL_SOCKET, SO_SNDTIMEO, "\2003\341\1\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0
setsockopt(3, SOL_IP, IP_TOS, [8], 4)   = -1 EOPNOTSUPP (Operation not supported)
setsockopt(3, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
read(3,



"e\0\0\0\n5.5.29-ndb-7.2.10-cluster-g"..., 16384) = 105
open("/usr/lib/locale/locale-archive", O_RDONLY) = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=99158576, ...}) = 0
mmap(NULL, 99158576, PROT_READ, MAP_PRIVATE, 4, 0) = 0x7f105216f000
close(4)                                = 0
stat("/usr/share/mysql/charsets/Index.xml", {st_mode=S_IFREG|0755, st_size=18312, ...}) = 0
brk(0x222b000)                          = 0x222b000
open("/usr/share/mysql/charsets/Index.xml", O_RDONLY) = 4
read(4, "<?xml version='1.0' encoding=\"ut"..., 18312) = 18312
close(4)                                = 0
futex(0x986300, FUTEX_WAKE_PRIVATE, 2147483647) = 0
write(3, "P\0\0\1\205\242\17\0\0\0\0\1!\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 84) = 84

不管怎样,这个 mysqld 是 NDB(MySQL Cluster)前面的一个 API 节点,但我觉得它与 NDB 无关,因为针对 NDB 表的查询也返回得非常快。

更新

将我们的 php 应用程序配置为使用持久连接(p:<hostname>使用 mysqli)完全解决了该问题,但与普通 mysqld 和 Percona XtraDB Cluster 相比,我仍然对这个问题的连接率如此之低感到惊讶。

回答@HTTP500 的问题,我们看不到checking permissions状态,但在任何给定时间确实会看到其中一些:

395354 | unauthenticated user | connecting host    | NULL    | Connect | NULL | login                             | NULL             |

相关内容