...

Анализ производительности VPS: оптимизация времени простоя процессора и времени ожидания ввода-вывода.

Я показываю, как анализ производительности VPS позволяет измерить время простоя процессора и задержки ввода-вывода, и как узкие места в виртуализации хостинга становятся четко видны. Я использую проверенные пороговые значения, инструменты и шаги по настройке для уменьшения задержек и поддержания постоянного времени отклика, уделяя особое внимание CPU и ВВОД/ВЫВОД.

Центральные пункты

Прежде всего, я хотел бы обобщить наиболее важные рекомендации, которые я бы рекомендовал для эффективной оптимизации Производительность использовать.

  • Кража процессораОбнаружение перегруженных узлов, измерение %st, минимизация шумных соседей.
  • Ожидание ввода-выводаПроверьте пути хранения, уменьшите задержки за счет кэширования и NVMe.
  • ИзмерениеОбъедините vmstat, iostat, top и PSI, считайте корреляции.
  • OvercommitКонтролируйте выделение vCPU и время готовности, устанавливайте ограничения.
  • SLOsОпределяйте предельные значения, отслеживайте отклонения, своевременно планируйте миграцию.

Что на самом деле означает время кражи ЦП

Время кражи описывает потерянное вычислительное время, в течение которого vCPU вынужден ждать, поскольку гипервизор отдает приоритет другим гостевым системам; top отображает это как %st, это не Холостой ход-time. Значения ниже 10 % обычно не критичны, в то время как постоянные плато выше этого значения указывают на удержание хоста и увеличение задержки, которые я немедленно устраняю. Шумные соседи часто провоцируют эти эффекты, например, через пики cron или резервные копии, которые я выравниваю по времени. Новичкам стоит обратить внимание на Понимание времени кражи процессора, чтобы быстрее классифицировать симптомы. При проведении аудита я всегда соотношу %st с коэффициентом использования и временем реагирования, чтобы выявить причину и следствие. очистить отдельно.

Правильное время ожидания ввода/вывода данных

Высокие показатели %wa в vmstat указывают на то, что потоки ожидают ответа от памяти или сети, и поэтому CPU простаивает. В системах хранения с общим доступом это время ожидания быстро увеличивается, особенно если многие ВМ ведут случайную запись на один и тот же LUN. Твердотельные накопители NVMe обеспечивают значительно меньшие задержки в тестах IOPS (например, 4k random) и уменьшают джиттер, что заметно снижает нагрузку на базы данных. Я также проверяю настройки QD (Queue Depth) и планировщика, поскольку неправильные параметры замедляют процессы записи небольших файлов. Для рабочих нагрузок CMS и магазинов кэширование с обратной записью оправдывает себя, если я использую ограничения согласованности и резервное копирование. расписание.

Измерения: vmstat, iostat, top и PSI

Я начинаю с vmstat 1 и наблюдаю r, us, sy, id, wa, st; r больше, чем количество vCPU, и одновременно высокий уровень %st сигнализирует о перегрузке. Хозяева. iostat -x 1 показывает await, svctm и util для каждого устройства, которые я использую для определения "горячих точек" в хранилище. Я использую top или htop для отслеживания нагрузки на каждый процесс и проверки, не блокируют ли несколько потоков все подряд. В контейнерных средах я также читаю PSI в /proc/pressure/cpu и /proc/pressure/io, чтобы увидеть паттерны ожидания с течением времени. Я комбинирую эти источники, чтобы получить целостную картину перед оптимизацией реализуйте.

Распознавание предельных значений, SLO и выбросов

Я определяю SLO, около 99 % запросов менее 300 мс, и связываю их максимум с 5 % Украсть и низкое время ожидания ввода-вывода. Затем я оцениваю временные ряды: короткие пики %st допустимы, более длительные фазы ухудшают пропускную способность и качество обслуживания клиентов. Я считаю перцентили, а не средние значения, потому что отдельные выбросы доминируют на критических путях. Для баз данных я проверяю интервалы задержек (1, 5, 10, 50 мс), чтобы пики не оставались незамеченными. Если показатели SLO подскакивают, я немедленно планирую контрмеры, такие как живая миграция или ограничение ресурсов, прежде чем потерять пользователей; это позволяет сохранить производительность. предсказуемо.

Сужение круга причин: процессор vs. хранилище vs. сеть

Если top показывает высокий %st без времени простоя, предположение о перегруженном хосте очевидно, в то время как высокий %wa с умеренным процессором указывает на хранилище; поэтому я разделяю Домены чистый. Если r в vmstat коррелирует с увеличением времени выполнения простых вычислительных заданий, я определяю причину кражи. Если показатели процессора остаются стабильными, но iostat-await растет, я обращаю внимание на узкие места IOPS или настройки очередей. Для сетевых путей я использую датчики задержки и наблюдаю за ретрансляциями, чтобы не спутать потерю пакетов с ожиданием ввода-вывода; дополнительные советы я даю в статье Понимание I/O‑Wait. Эти диагностические действия не позволят мне закрутить не те винты, а затем закрутить те же самые винты позже. Советы возвращение.

Оптимизация против времени кражи процессора

Я уменьшаю чрезмерное количество vCPU, поскольку слишком большое количество vCPU создает давление на планирование и увеличивает время простоя; меньшее количество ядер с более высокой тактовой частотой часто помогает немедленно. Учет NUMA приносит свои плоды: я привязываю рабочие нагрузки к соответствующему узлу и минимизирую межузловой доступ. Изолированные экземпляры с зарезервированными ресурсами предотвращают шумное влияние соседей, если провайдер предлагает такую возможность. Что касается кода, то я удаляю циклы ожидания и заменяю опросы событиями, чтобы процессор не блокировался искусственно. Я также отслеживаю среднюю нагрузку по отношению к количеству vCPU и сохраняю сигналы тревоги, возрастающие от 5-10 краж %; так я поддерживаю время отклика. тесно.

Сокращение задержек ввода-вывода: кэширование и хранение данных

Я перемещаю горячие чтения в Redis или Memcached, чтобы не пересылать данные из Диск должны прийти. Для путей записи я оптимизирую интервалы фиксации и размеры пакетов, объединяя небольшие нагрузки на запись. Тома на базе NVMe с высокой производительностью IOPS значительно сокращают время ожидания, особенно при использовании 4k random. На уровне файловой системы я проверяю параметры монтирования и выравнивания, чтобы избежать ненужного усиления записи. В Kubernetes я устанавливаю запросы/лимиты, сродство узлов и выделенные классы хранения, чтобы стручки не делили дефицитные ресурсы ввода-вывода. блок.

Прагматичное управление избыточным использованием гипервизора

Избыточная коммисия возникает, когда поставщики продают больше vCPU, чем имеется физических ядер; в результате увеличивается время готовности и становится заметным Украсть. Я отслеживаю CPU-Ready через гипервизор и делаю выводы, когда превышаю 5 %. Правильный выбор размера, лимиты и пакетные задания со сдвигом по времени уменьшают конфликты в планировщике хоста. Если провайдер поддерживает это, я использую живую миграцию на более тихие хосты или бронирую экземпляры с низким overcommit. Я кратко излагаю историю и меры в Перегрузка процессора чтобы я мог принимать решения, основанные на фактах и быстро встретиться.

Практическая проверка: эталоны и корреляции

Я проверяю постоянство хоста с помощью небольших эталонных циклов, таких как серия операций, требующих больших затрат процессора, время выполнения которых я сравниваю; сильный разброс показывает, что Украсть там. Для дисков я использую профили fio (randread/randwrite, 4k, QD1-QD32) и регистрирую перцентили IOPS, пропускной способности и задержки. Параллельно я проверяю сетевые задержки, чтобы не перепутать эффекты. Я провожу эти измерения несколько раз в день, чтобы распознать ежедневные закономерности и исключить окна обслуживания. Я сопоставляю результаты с показателями приложений, чтобы показать, как пики непосредственно влияют на доход, время сеанса или количество ошибок. удар.

Выбор поставщика и данные о его работе

Для продуктивных рабочих нагрузок я ищу сильные показатели для одного ядра, высокие показатели IOPS и низкий разброс в долгосрочной перспективе; именно так я добиваюсь коротких результатов. Задержки. В тестах провайдеры с ограниченной избыточной нагрузкой обеспечивают ощутимо более стабильное время отклика. webhoster.de часто показывает очень хорошие результаты в сравнениях, например, высокую производительность одного ядра и низкое время кражи. Бюджетных виртуальных машин может быть достаточно, но для критически важных сервисов я планирую резервы и рассчитываю на 12-40 евро в месяц для надежных ресурсов. В следующей таблице приведены типичные ключевые показатели, которые я использую для принятия решений; значения являются ориентирами и помогают мне принять правильное решение. Классификация.

Метрики webhoster.de (1-е место) Конкуренция (средняя)
Одноядерный балл 1.771+ 1.200-1.500
IOPS (4k) 120.000+ 50.000-100.000
Время кражи (Ø) < 5 % 10-20 %
Ожидание ввода-вывода Низкий Средне-высокий

Разумный выбор планирования расходов и тарифов

Я начинаю с небольших планов, обеспечивающих хорошую одноядерную производительность, и повышаю ее только при возникновении узких мест; таким образом я плачу только за реальную производительность. Требуется. Я планирую пики трафика с помощью резервов на прорыв и краткосрочных модернизаций вместо того, чтобы постоянно оставаться в избытке. Для сервисов с большим объемом данных я заказываю более быстрые тома NVMe или выделенные классы хранения, так как соотношение цены и производительности часто лучше, чем обновление процессора. Управляемый VPS имеет смысл, если провайдер гарантирует мониторинг и сбалансированное размещение; это снижает вероятность длительного плато. Я проверяю тексты SLA и требую прозрачных метрик, чтобы можно было надежно рассчитать SLO. держать.

Управление процессором, турбо и C-состояния

На виртуальных машинах политика энергопотребления процессора напрямую влияет на задержку. Я проверяю, установлен ли регулятор на „производительность“ и стабильно ли используются турбо-режимы. Для сервисов, чувствительных к задержкам, я ограничиваю глубокие C-состояния, чтобы ядрам не приходилось многократно выходить из спящего режима. В ходе серии измерений я сравниваю время отклика с различными настройками регулятора и фиксирую наилучшее сочетание. Я также проверяю источник синхронизации (tsc против kvmclock) и время синхронизации, поскольку нестабильные часы могут искажать метрики и провоцировать таймауты. Цель: стабильная синхронизация, отсутствие непредсказуемых скачков частоты и ощутимо меньшее время отклика под нагрузкой.

Память и своп как скрытый драйвер ввода-вывода

Помимо процессора и диска, давление на память также замедляет работу. Я слежу за частотой ошибок страниц, свободным кэшем и активностью свопа; если своп увеличивается, %wa часто взрывается. Для приложений с высокими требованиями к кэшу я умеренно регулирую своппинг, планирую достаточно оперативной памяти и использую zswap только выборочно для смягчения пиковых нагрузок. Я тестирую прозрачные огромные страницы в зависимости от рабочей нагрузки: некоторые базы данных выигрывают от статических огромных страниц, другие нагрузки больше выигрывают от деактивированной дефрагментации THP. Важно соотнести давление на память с PSI (памятью), чтобы я мог распознать риски OOM, циклы ресайза и LRU thrash на ранней стадии. Меньшее давление на память обычно означает более постоянные задержки и меньшее количество заторов ввода-вывода из-за свопинга.

Файловые системы, планировщики и опережающее чтение

Я согласовываю файловую систему с рабочей нагрузкой. Для NVMe я обычно ставлю планировщик „none“, для SATA/SSD „mq-deadline“ или „kyber“ проявляют себя. Я настраиваю read-ahead: небольшие случайные обращения (БД, очереди) с низким read-ahead, последовательные задания (резервное копирование, ETL) с более высоким значением. Опции монтирования, такие как noatime/nodiratime, сохраняют запись метаданных, регулярный fstrim поддерживает стабильную производительность SSD. В ext4/xfs я проверяю режим журнала и интервалы фиксации; уменьшаю усиление записи за счет чистого выравнивания и объединения небольших записей. Я измеряю эффект от каждого изменения с помощью кривых ожидания и перцентилей задержки, а не просто сырых показателей IOPS.

Просмотр контейнеров и cgroup: доли, квоты и дросселирование

В контейнерах пики задержки часто вызваны дросселированием процессора. Я предпочитаю запросы/лимиты с буферами, чтобы ядро не дросселировало постоянно. Я использую доли процессора для создания относительной справедливости, а жесткие квоты - только в тех случаях, когда изоляция важнее пиковой производительности. Для ввода/вывода я взвешиваю cgroups (io.weight) и ограничиваю наихудшие открыватели с помощью io.max, чтобы чувствительные сервисы могли дышать. Я сопоставляю сигналы PSI на cgroup со временем отклика P99, чтобы видеть, оказывают ли отдельные стручки давление на хост. В результате получается предсказуемое распределение нагрузки без сильных падений из-за штрафов планировщика.

Распознавание моделей рабочей нагрузки: Web, Batch, Database

Веб-интерфейсы сильно реагируют на кражи и беглые колебания ввода-вывода; здесь я намеренно ограничиваю параллелизм (количество потоков/рабочих) и поддерживаю стабильность пулов соединений. Я перемещаю пакетные задания за пределы пикового времени, снижаю их приоритет и выравниваю пропускную способность с помощью пакетной обработки. Я оптимизирую базы данных для низких задержек в хвосте: стратегии промывки журналов, достаточные буферные пулы и отсоединенные вторичные индексы, где это необходимо. Для фаз, требующих интенсивной записи, я планирую короткие высокоинтенсивные „окна всплеска“, а остальное время поддерживаю постоянную нагрузку, вместо того чтобы постоянно работать в условиях неоптимальной смешанной нагрузки. Четкие шаблоны = меньше столкновений с соседями на том же хосте.

Операционная рутина: оповещения, справочники и окно изменений

Я связываю технические метрики с оповещениями SLO: %st более 5-10 % дольше N минут, задержки PSI через порог, iostat-await через определенные ведра задержек. Я сопрягаю оповещения с учебниками: запускаю миграцию, ужесточаю ограничения, увеличиваю кэширование, настраиваю read-ahead. Я вношу изменения небольшими шагами с помощью Mess-Gate; я останавливаюсь, когда хвостовые задержки становятся хуже. Я координирую окна обслуживания и задания резервного копирования, чтобы они не давали одновременной нагрузки на хранилище и процессор. Такая дисциплина гарантирует, что улучшения будут иметь долгосрочный эффект, и в повседневной работе не будет никаких сюрпризов.

Мини-справочник для быстрого эффекта

  • Управление: Проверьте управление процессором, стабилизируйте C-состояния и источник тактового сигнала.
  • Измерения: параллельно запустите vmstat/iostat/top/PSI, установите временные корреляции.
  • CPU: правильное определение размера vCPU, соблюдение NUMA, устранение busy-waits, установка тревог на %st.
  • Ввод/вывод: используйте NVMe, выберите подходящий планировщик, настройте read-ahead, планируйте fstrim.
  • Память: Swappiness и THP, зависящие от рабочей нагрузки, мониторинг кэша страниц и PSI.
  • Контейнер: Установите запросы/лимиты с помощью buffer, io.weight, чтобы избежать дросселирования.
  • Операции: разделение пакетных заданий, ступенчатое резервное копирование, связь оповещений SLO с рабочими книгами.

Краткое резюме

Я сосредоточился на Анализ на два рычага: уменьшить время простоя процессора и сократить время ожидания ввода-вывода. Измерения с помощью vmstat, iostat, top и PSI дают мне картину ситуации, корреляции с временем отклика показывают эффект. Затем я принимаю целенаправленные меры: Правильный размер, ограничения, учет NUMA, кэширование и более быстрое NVMe-хранилище. Если узкие места сохраняются, я планирую миграцию или изменение тарифов до того, как клиенты столкнутся с задержками. Если вы будете последовательно выполнять эти шаги, вы добьетесь стабильного времени отклика, защитите SLO и создадите надежный Пользовательский опыт.

Текущие статьи

Анализ задержек хостинга с учетом узких мест в сетевом хранилище PHP и базе данных
Серверы и виртуальные машины

Анализ задержек хостинга: сеть, хранилище, PHP и база данных

Анализ задержек в хостинге позволяет выявить узкие места в сети, хранилище, PHP и базе данных. Оптимизируйте время отклика сервера для достижения максимальной производительности хостинга.