Попытка устранить проблему с таинственным узким местом io диска, вызванным MySQL.
Я использую следующие команды для проверки скорости чтения / записи диска:
#write
dd if=/dev/zero of=/tmp/writetest bs=1M count=1024 conv=fdatasync,notrunc
#read
echo 3 > /proc/sys/vm/drop_caches; dd if=/tmp/writetest of=/dev/null bs=1M count=1024
Я перезагрузил компьютер, отключил cron, чтобы ни один из моих обычных процессов не выполнял запросы, убил веб-сервер, который обычно работает, и убил mysqld.
Когда я запускаю тест чтения без запущенного mysqld, я получаю 1073741824 bytes (1.1 GB) copied, 2.19439 s, 489 MB/s
. Постоянно около 450-500 МБ / с.
Когда я запускаю резервную копию службы mysql, а затем снова запускаю тест чтения, я получаю 1073741824 bytes (1.1 GB) copied, 135.657 s, 7.9 MB/s
. Постоянно около 5 МБ / с.
Запуск show full processlist
в mysql не показывает никаких запросов (и я все равно отключил все, что выполняло бы запросы). На вкладке состояния сервера MySQLWorkbench я вижу, что чтение InnoDB колеблется от 30 до 200 операций чтения в секунду и от 3 до 15 операций записи в секунду, даже если запросы не выполняются. mysqld набирает скорость чтения с диска 1 МБ в секунду, когда запросы не выполняются. Это кажется большим, учитывая, что запросы не выполняются, но в то же время этого недостаточно, чтобы моя команда dd
занимала так много времени ... Единственное, что выполняет disk io, - это jbd2/sda3-8
.
Не уверен, связано ли это, но если я попытаюсь убить сервер mysql с помощью service mysql stop
, он скажет: «Попытка остановить MySQL истекло время», и процесс mysqld продолжит работу, но я не могу дольше подключаться к БД. Я должен использовать kill -9
, чтобы убить процесс mysqld и перезапустить сервер.
Все это кажется неожиданным. Этот сервер месяцами выполнял тяжелый анализ журналов, вставки и выборки большого объема, пока в прошлые выходные мы не увидели узкое место io диска.
Как я могу узнать, почему MySQL так много читает с диска когда по сути простаивает?