Хост-процессор не масштабирует частоту, когда гостю KVM это нужно

Я задал этот вопрос на сервере , но он также мог быть опубликован здесь. Я буду синхронизировать ответы, если их можно найти.

Наблюдение:
У меня есть сервер HP с двухъядерным процессором AMD (Turion II Neo N40L), который может масштабировать частоты от 800 до 1500 МГц. Масштабирование частоты работает под FreeBSD 9 и под Ubuntu 12.04 с ядром Linux 3.5. Однако, когда я установил FreeBSD 9 в среду KVM поверх Ubuntu, частотное масштабирование не работает. Гость (таким образом, FreeBSD) не определяет минимальную и максимальную частоты и, следовательно, не масштабирует что-либо, когда загрузка процессора становится выше. На хосте (таким образом, Ubuntu) процесс KVM использует от 80 до 140% ресурса ЦП, но частотное масштабирование не происходит, частота остается на частоте 800 МГц, хотя, когда я запускаю любой другой процесс в том же поле Ubuntu, регулятор ondemand быстро масштабирует частоту до 1500 МГц!

  • Случайные части древнего оборудования, не работающего вместе (Mac G5, сетевой адаптер Sun)
  • Добавление других прав rw для файла
  • Top говорит, что используется 100% процессор, но 50% ядер простаивают?
  • Поместите grub на виртуальный диск
  • Разделенные разделы FreeBSD и Linux
  • Как получить список всех запланированных заданий cron на моей машине?
  • Концерн и вопрос:
    Я не понимаю, как процессор, возможно, виртуализирован, и если гость должен выполнить правильное масштабирование. Нужно ли, чтобы некоторые функции процессора были доступны для гостя для этого?

    отв:
    Следующая заметка о выпуске Red Hat имеет тенденцию предполагать, что частотное масштабирование работает даже в виртуализованной среде (см. Главу 6.2.2 и 6.2.3), считая, что в примечании не рассматривается технология виртуализации, с которой эта работа работает (kvm, xen и т. Д. .?)

    Для информации, вывод cpufreq-info на Ubuntu:

     $ cpufreq-info cpufrequtils 007: cpufreq-info (C) Dominik Brodowski 2004-2009 Report errors and bugs to cpufreq@vger.kernel.org, please. analyzing CPU 0: driver: powernow-k8 CPUs which run at the same hardware frequency: 0 CPUs which need to have their frequency coordinated by software: 0 maximum transition latency: 8.0 us. hardware limits: 800 MHz - 1.50 GHz available frequency steps: 1.50 GHz, 1.30 GHz, 1000 MHz, 800 MHz available cpufreq governors: conservative, ondemand, userspace, powersave, performance current policy: frequency should be within 800 MHz and 1.50 GHz. The governor "ondemand" may decide which speed to use within this range. current CPU frequency is 800 MHz. cpufreq stats: 1.50 GHz:14.79%, 1.30 GHz:1.07%, 1000 MHz:0.71%, 800 MHz:83.43% (277433) analyzing CPU 1: driver: powernow-k8 CPUs which run at the same hardware frequency: 1 CPUs which need to have their frequency coordinated by software: 1 maximum transition latency: 8.0 us. hardware limits: 800 MHz - 1.50 GHz available frequency steps: 1.50 GHz, 1.30 GHz, 1000 MHz, 800 MHz available cpufreq governors: conservative, ondemand, userspace, powersave, performance current policy: frequency should be within 800 MHz and 1.50 GHz. The governor "ondemand" may decide which speed to use within this range. current CPU frequency is 800 MHz. cpufreq stats: 1.50 GHz:14.56%, 1.30 GHz:1.06%, 1000 MHz:0.79%, 800 MHz:83.59% (384089) 

    Причина, по которой я хочу, чтобы эта функция работала: экономить энергию, работать тише (менее жарко), а также простое любопытство, чтобы лучше понять, почему это не работает и как заставить его работать.

  • Почему startx дает черный экран без ошибок?
  • Каковы соответствующие разрешения на выполнение для ~ / bin?
  • Портативный Firefox Linux
  • Есть ли определенный способ связать исходный код драйвера в ядре Linux с самим устройством?
  • Как перезапустить сервер ngnix на CentOS
  • Добавление пользователя в группу по умолчанию
  • 3 Solutions collect form web for “Хост-процессор не масштабирует частоту, когда гостю KVM это нужно”

    Я нашел решение благодаря подсказке Нильса и хорошей статье .

    Настройка регулятора DVDS по требованию

    Регулятор ondemand имеет набор параметров для управления, когда он нажимает масштабирование динамической частоты (или DVFS для динамического масштабирования напряжения и частоты). Эти параметры расположены под деревом sysfs: /sys/devices/system/cpu/cpufreq/ondemand/

    Один из этих параметров – это up_threshold который, как и название, является пороговым (единица – это% от CPU, я не знаю, хотя если это на ядро ​​или объединенные ядра), над которым регулятор ondemand запускается и начинает динамически изменять частоту ,

    Чтобы изменить его на 50% (например), используя sudo, просто:
    sudo bash -c "echo 50 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold"

    Если вы являетесь пользователем root, возможна еще более простая команда:
    echo 50 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold

    Примечание: эти изменения будут потеряны после перезагрузки следующего хоста. Вы должны добавить их в файл конфигурации, который читается во время загрузки, например, /etc/init.d/rc.local на Ubuntu.

    Я узнал, что моя гостевая виртуальная машина, хотя и потребляла много хостов (80-140%) на хосте, распределяла нагрузку на оба ядра, поэтому ни одно ядро ​​не превышало 95%, поэтому процессор, к моему раздражению, был оставаясь на частоте 800 МГц. Теперь с вышеупомянутым патчем процессор динамически меняет частоту на ядро ​​намного быстрее, что лучше соответствует моим потребностям, 50% кажется лучшим порогом для моего гостя, ваш пробег может отличаться.

    Необязательно, проверьте, используете ли вы HPET

    Возможно, некоторые из применимых, которые неправильно используют таймеры, могут пострадать от DVFS. Это может быть проблемой в среде хоста и / или гостевой среды, хотя хост может иметь некоторый запутанный алгоритм, чтобы попытаться свести это к минимуму. Тем не менее, у современных процессоров есть более новый TSC (счетчик временных меток), которые не зависят от текущей частоты CPU / ядра: константа (константа_tsc), инвариантная (инвариантная_tsc) или непрерывная (nonstop_tsc), см. Эту статью Chromium о ресинхронизации TSC для получения дополнительной информации о каждом. Поэтому, если ваш процессор оснащен одним из этих TSC, вам не нужно принудительно вводить HPET. Чтобы проверить, поддерживает ли ваш ЦП хоста, используйте аналогичную команду (измените параметр grep на соответствующую функцию ЦП, здесь мы тестируем постоянный TSC):

     $ grep constant_tsc /proc/cpuinfo 

    Если у вас нет одного из этих современных TSC, вы должны:

    1. Active HPET, это описано здесь после;
    2. Не используйте CPU DVFS, если у вас есть какие-либо приложения в виртуальной машине, которые полагаются на точное время, которое рекомендовано Red Hat .

    Безопасное решение заключается в том, чтобы включить таймеры HPET (см. Ниже более подробную информацию), они медленнее запрашивают, чем TSC (TSC находятся в CPU, а HPET находятся на материнской плате) и, возможно, не имеют точной (HPET> 10 МГц, TSC часто максимальные часы процессора), но они намного надежнее, особенно в конфигурации DVFS, где каждое ядро ​​может иметь разную частоту. Linux достаточно умен, чтобы использовать лучший доступный таймер, он будет полагаться сначала на TSC, но если он окажется слишком ненадежным, он будет использовать HPET. Эта работа хороша для систем хоста (голый металл), но из-за не всей информации, должным образом экспортированной гипервизором, это скорее задача для гостевой виртуальной машины обнаруживать плохое поведение TSC. Трюк заключается в том, чтобы заставить использовать HPET в гостях, хотя вам нужен гипервизор, чтобы сделать этот источник часов доступным для гостей!

    Ниже вы можете узнать, как настроить и / или включить HPET в Linux и FreeBSD.

    Конфигурация Linux HPET

    HPET или высокоточный таймер событий – это аппаратный таймер, который можно найти на большинстве товарных ПК с 2005 года. Этот таймер можно эффективно использовать с помощью современной ОС (ядро Linux поддерживает его с 2,6, стабильная поддержка FreeBSD с новейшей версии 9.x но был введен в 6.3 ), чтобы обеспечить постоянное согласование времени с управлением мощностью ЦП. Это позволяет создавать и упростить реализацию планировщика без такового .

    В основном HPET похож на защитный барьер, который, даже если хост имеет DVFS активен, события синхронизации хоста и гостя будут в меньшей степени затронуты.

    Существует хорошая статья от IBM относительно включения HPET , в ней объясняется, как проверить, какой аппаратный таймер используется вашим ядром, и какие имеются. Я приведу здесь краткое резюме:

    Проверка доступных аппаратных таймеров:
    cat /sys/devices/system/clocksource/clocksource0/available_clocksource

    Проверка текущего активного таймера:
    cat /sys/devices/system/clocksource/clocksource0/current_clocksource

    Более простой способ принудительного использования HPET, если он у вас есть, – это изменить загрузчик, чтобы попросить его включить (начиная с ядра 2.6.16). Эта конфигурация зависит от распределения, поэтому, пожалуйста, обратитесь к своей собственной документации для распространения, чтобы правильно ее настроить. Вы должны включить hpet=enable или clocksource=hpet в строке загрузки ядра (это опять же зависит от версии или дистрибутива ядра, я не нашел никакой согласованной информации).
    Это гарантирует, что гость использует таймер HPET.

    Примечание: на моем ядре 3.5 Linux, похоже, автоматически запускает таймер hpet.

    Конфигурация гостевой HPET FreeBSD

    На FreeBSD можно проверить, какие таймеры доступны, запустив:
    sysctl kern.timecounter.choice

    Текущий выбранный таймер можно проверить с помощью:
    sysctl kern.timecounter.hardware

    FreeBSD 9.1, по-видимому, автоматически предпочитает HPET через другого провайдера таймера.

    Todo: как заставить HPET на FreeBSD.

    Экспорт гипертекста HPET

    KVM, похоже, автоматически экспортирует HPET, когда хост поддерживает его. Однако для гостя Linux они предпочтут другие автоматически экспортированные часы, которые являются kvm-часами (паравиртуализированная версия хост-TSC). Некоторые люди сообщают о проблемах с предпочтительными часами, ваш пробег может отличаться. Если вы хотите принудительно вставить HPET в гостевую систему, см. Выше раздел.

    VirtualBox по умолчанию не экспортирует часы HPET в гостевой режим, и в GUI нет возможности сделать это. Вам необходимо использовать командную строку и убедиться, что VM отключена. команда:

     ./VBoxManage modifyvm "VM NAME" --hpet on 

    Если гость продолжает выбирать другой источник, кроме HPET, после вышеуказанного изменения, обратитесь к вышеприведенному разделу, чтобы заставить ядро ​​использовать часы HPET в качестве источника.

    Это не гость, который запускает высококлассные – хост должен это сделать. Таким образом, вы должны снизить соответствующий уровень запуска на хосте.

    на хосте, kvm cpu выглядит как процесс. Механизм масштабирования не рассматривает процессы, а только общее потребление процессора.

    и обычно лучше всего отключить масштабирование / дросселирование CPU / etc при запуске виртуальных машин

    Linux и Unix - лучшая ОС в мире.