Резюме: у нас есть интернет-радиостанция в VirtualBox, и у нас есть проблема, заключающаяся в том, что виртуальная машина работает чуть медленнее, чем в реальном времени, из-за чего воспроизведение аудио начинает заикаться через некоторое время, потому что буферные буферы заканчиваются.
Вот настройка: мы запускаем RadioDJ внутри виртуальной машины Windows 7; Виртуальная машина имеет 2 назначенных ядра и 2 ГБ оперативной памяти. Основной операционной системой является CentOS 7, работающая на четырехъядерном процессоре Intel Xeon X3440 с HyperThreading на частоте 2,53 ГГц (макс.) И 16 ГБ ОЗУ; Linux сообщает о 8 ядрах.
Виртуальная машина работает нормально, нагрузка на процессор на обоих ядрах составляет в среднем около 25% и не увеличивается до максимума. Мы производим 4 потока битов (MP3 и AAC+), ретранслируемых через IceCast, и все страдают от одной и той же проблемы: RadioDJ генерирует биты для потоков просто слишком медленно, поэтому через несколько минут звук заикается, потому что буферные буферы запускаются пустыми. Слушатель должен либо приостановить проигрыватель на несколько секунд, чтобы заново заполнить буфер или возобновить воспроизведение (*).
Эта виртуальная машина работала на другом сервере без особых проблем (четырехъядерный Xeon X3430, без гиперпоточности, 8 ГБ ОЗУ). Это также было слишком медленно, но прошло бы 45 минут, прежде чем проблемы стали заметны.
На новом сервере сначала проблемы были намного хуже; буферы истощатся за 90 секунд. Я подсчитал, что виртуальные процессоры работают на 4,5% медленнее, чем в реальном времени.
Итак, что я попробовал:
- Назначение 1 ядра на ВМ: без улучшений.
- Перезапуск индекса производительности Windows; без улучшения.
- Другой виртуальный аудио драйвер (см. Ниже); без улучшения.
- Установка паравиртуализации в VirtualBox на Hyper-V: это немного помогло.
Есть два возможных виновника. Одним из них является звуковой драйвер: RadioDJ требует наличия аудиокарты, но на новом сервере ее нет. Я подозреваю, что RadioDJ использует карту для синхронизации аудиофреймов и генерации битовых потоков. Поэтому я использую Null Audio Driver в VirtualBox и виртуальную звуковую карту ICH AC97 для Windows. Все еще дрейфует ... Я установил виртуальный аудиокабель VB в надежде, что он будет использовать тактовую частоту процессора для "истинной" частоты дискретизации 44100. Проблема меньше, но все еще около 0,68% слишком медленно.
Второй виновник может заключаться в том, что новый Xeon имеет переменную скорость процессора (старый сервер, похоже, имеет фиксированную скорость), но установка регулятора Linux на «производительность» не имеет большого значения. В любом случае, Windows 7 также может справиться с динамической скоростью процессора.
Последнее интересное замечание: у меня все время был открыт диспетчер задач Windows, когда я набирал это сообщение, и счетчик времени работы, кажется, смещался взад и вперед по сравнению со временем настенных часов (по чистой случайности я запустил виртуальную машину незадолго до полуночи, поэтому время запуска почти соответствует времени моего рабочего стола). Похоже, что виртуальная машина работает не так точно ... Дрейф составляет от +17 до +37 секунд.
Главный вопрос: как заставить виртуальную машину работать на 100% или, если предположить, что RadioDJ использует звуковую карту для синхронизации, действительную (виртуальную) звуковую карту?
(*) Я понимаю, что из-за небольших различий в скорости процессора и звуковой карты любой поток воспроизведения может сместиться и очистить буфер.