Иногда сервер работает очень медленно и требует много времени для обслуживания запросов. iotop
показывает скорость чтения с диска в среднем 1-2 M / S в течение нескольких минут (что на самом деле не так уж и много), после чего сервер снова становится очень быстрым. при очень низкой скорости ожидания, по данным top, составляет около 60-90%.
Согласно учебнику по настройке mysql, все кеши mysql более чем в порядке. Поэтому я не знаю, почему сервер mysql так много читает с диска. Есть ли способ узнать, что вызывает столько операций ввода-вывода в mysql?
Я должен сказать, что это виртуальный сервер, так может ли быть, что другой клиент использует все возможности ввода-вывода?
Хорошо понимать, какой у вас базовый уровень хранения. У вас один физический диск? RAID1 или RAID5 из нескольких дисков или большого массива хранения, где LUN состоят из многих (40+) физических дисков. Каждый физический диск может дать вам примерно 150-200 запросов / с (в зависимости от скорости вращения).
Таким образом, показатель МБ / с не важен в выводе iostat / sar / dstat, потому что для последовательных операций чтения / записи современные диски могут делать более 100 МБ / с, но для случайных запросов с размером, например, 8 КБ, это даст у вас всего 150 * 8кБ = 1,2 МБ / с. Запросы от сервера базы данных почти всегда случайны.
Лучшая метрика, на которую следует обратить внимание, - это всегда время обслуживания io - это время, которое требуется хранилищу для обслуживания вашего запроса на чтение или запись. Вам не нужно беспокоиться о том, сколько у вас дисков, если время обслуживания меньше, например, 15-20 мс (миллисекунд), значит, вы знаете, что ваше хранилище работает хорошо. На почти незанятом сервере с кэшем с резервным питанием от батареи (BBWC) вы должны видеть время обслуживания записи менее 1 мс и время чтения менее 5 мс. Этот показатель также хорош для VPS, поскольку он покажет вам высокое время обслуживания, даже если хранилище занято обслуживанием других клиентов.
используйте sar, чтобы узнать историю io actvitiy на сервере. Я думаю, что sar уже настроен и запущен на этом сервере. Если нет, сделай это. Тогда может быть другая виртуальная машина, выполняющая тяжелые вызовы io, а ваш mysql занят ожиданием io. Я бы рекомендовал не использовать mysql или любую базу данных с даже умеренным трафиком для решения VPS. Если он обслуживает реальный трафик, тогда он должен быть на физическом сервере, поскольку io на VPS имеет тенденцию быть плохим, а mysql с плохим io работает плохо, и это влияет на весь смысл наличия db.