Назад | Перейти на главную страницу

клиент mysql медленный вход в систему

У меня возникла проблема с медленными подключениями / входами в систему на загруженный сервер 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             |