В настоящее время я действительно борюсь с проблемой производительности, когда все мои запросы к базе данных занимают в 1000 раз больше, чем обычно, когда мой сервер базы данных находится под «большой» нагрузкой.
У меня есть сервер, на котором работает ubuntu 12.04 и размещается моя база данных postgresql 9.2. Сервер находится на Hetzner.de и представляет собой EX6s (8-ядерный ксенон с оперативной памятью 32 ГБ и два жестких диска 3T в конфигурации RAID1 с использованием программного рейда ubuntus). Когда я запускаю большое количество запросов (которые я часто выполняю ночью), я вижу, что почти все использование ЦП тратится на ожидание ввода-вывода ЦП. У меня установлен новый мониторинг реликвий, и я не могу найти никаких других указаний на то, что может быть основной причиной этого ожидания ввода-вывода ЦП, что явно является узким местом для моей производительности и пропускной способности.
Итак, вопрос в том, что это за ожидание ввода-вывода процессора и чего он ждет?
Я добавил все обзорные диаграммы, которые я могу получить от новой реликвии внизу. Что я упускаю из виду? Должно быть очевидное узкое место? Куда мне нырнуть?
Использование ЦП сервера базы данных - злой, который говорит мне, что что-то не так https://rpm.newrelic.com/public/charts/cEdIvvoQZCr
Средняя загрузка сервера базы данных https://rpm.newrelic.com/public/charts/cMNdrYW51QJ
Физическая память сервера баз данных https://rpm.newrelic.com/public/charts/c3dZBntNpa1
Утилизация дискового ввода-вывода сервера базы данных - как видите, диск не используется очень сильно (почти ничего) https://rpm.newrelic.com/public/charts/9YEVw6RekFG
Сетевой ввод-вывод сервера базы данных (Мбит / с) - сеть представляет собой гигабитную внутреннюю сеть, в которой выполняются все коммуникации. https://rpm.newrelic.com/public/charts/lKiZ0Szmwe7
5 основных операций с базами данных по времени настенных часов https://rpm.newrelic.com/public/charts/dCt45YH12FK
Пропускная способность базы данных https://rpm.newrelic.com/public/charts/bIbtQ1mDzMI
Время ответа базы данных https://rpm.newrelic.com/public/charts/fPcNL8WA6xx
ОБНОВИТЬ:
После выполнения sudo iostat -k 1
Я начинаю подозревать. Я получаю много таких выводов, которых не вижу в NR:
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.00 0.00 0.00 0 0
sdb 0.00 0.00 0.00 0 0
sdc 546.00 2296.00 6808.00 2296 6808
sdd 593.00 1040.00 7416.00 1040 7416
md1 0.00 0.00 0.00 0 0
md0 0.00 0.00 0.00 0 0
md2 1398.00 3328.00 13064.00 3328 13064
md3 0.00 0.00 0.00 0 0
Короче, вам нужны более быстрые диски.
Когда процессы находятся в iowait, это означает, что они выпустили запрос ввода-вывода и ждут результатов этого запроса. При достаточном объеме ОЗУ большая часть вашего рабочего набора будет кэшироваться в ОЗУ, и, как таковые, операции чтения не будут способствовать большей части этого конфликта ввода-вывода, поэтому обычно виноваты записи.
Что касается графа ввода-вывода вашего диска, я подозреваю, что New Relic по какой-то причине неправильно собирает метрики ввода-вывода. Я бы порекомендовал, возможно, изучить вторичную систему сбора данных, такую как Munin. Если не считать этого, вы можете наблюдать за дисковым вводом-выводом в реальном времени, введя следующую команду:
$ iostat -k 1
Будет выведено чтение и запись на диск в реальном времени в кбит / с. Я подозреваю, что вы заметите там довольно много активности, которую не видит New Relic.