У меня возникла проблема с медленными подключениями / входами в систему на загруженный сервер 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 является узлом API перед NDB (MySQL Cluster), но я чувствую, что он не имеет ничего общего с NDB, поскольку запросы к таблицам NDB также возвращаются очень быстро.
ОБНОВИТЬ
настройка нашего приложения php для использования постоянных подключений (p:<hostname>
с mysqli) полностью решил проблему, но я все еще удивлен, насколько низкая скорость соединения стала проблемой по сравнению с обычным mysqld и Percona XtraDB Cluster.
чтобы ответить на вопрос @ HTTP500, мы не видим checking permissions
состояние, но вы видите некоторые из них в любой момент времени:
395354 | unauthenticated user | connecting host | NULL | Connect | NULL | login | NULL |