Server Unit держит на себе весь голосовой стек клиента: обработку звонков, распознавание, языковую модель и синтез речи. Каждый блок несёт 100 одновременных звонков. Прежде чем это число попадёт в договор, его нужно проверить, поэтому мы построили нагрузочный тест и прогнали его дважды.
Мы хотели узнать, выдерживает ли блок свои номинальные 100 звонков так, чтобы ответы всё ещё звучали как разговор, и как он ведёт себя сверх них: при 120%, 150% и 176%.
Измерено на одном Server Unit с агентом-рекрутером и имитируемыми звонящими на том же блоке, по G.711 A-law через измерительный мост: 22 ступени нагрузки в 9 сериях, 22 018 ответов, около 129 часов разговора. Нагрузка указана как доля номинальной ёмкости (100 одновременных звонков), а время ответа как индекс, где один звонок равен 1,00.
Коротко: среднее время ответа остаётся в оценке «Стандарт» или выше до номинальной ёмкости, а с ранним стартом до примерно 117%. При 176% все звонки соединились и ни один не оборвался. На каждой ступени ответ получили более 99% реплик звонящих, а один раунд оптимизации под высокую нагрузку удвоил нагрузку, которую блок несёт в оценке «Стандарт».
Как мы измеряли
- Имитируемые звонящие на том же блоке. Каждый разговор состоит из двух телефонных звонков: тестируемый агент и имитируемый звонящий. Двадцать имитируемых звонящих, у каждого свой голос, манера и настроение, спрашивают о вакансии, делают паузы и отвечают, как люди. Server Unit обслуживает оба конца каждого разговора, поэтому нагрузка на телефонию вдвое больше, чем создал бы настоящий разговор такого же размера.
- Реалистичные зависимости. Внешние системы, к которым обращается агент, отвечают с фиксированной реалистичной задержкой.
- Одни часы на линии. В тракте звука стоит измерительный мост. Он отмечает момент, когда фраза звонящего заканчивается, и момент, когда приходит первый звук ответа агента. Время ответа — это интервал между ними. Оно охватывает всё, что происходит внутри блока, включая паузу в конце реплики и передачу звука.
- Ступени. Нагрузка растёт ступенями от одного разговора до 176% номинальной ёмкости. Каждая ступень две минуты устанавливается, затем измеряется не меньше пяти. Ступень с одним разговором идёт двадцать минут.
- Ступень должна заслужить место. Ступень засчитывается, только если проходит восемь проверок: устойчивое состояние (вторая половина не медленнее первой), неудавшиеся реплики, исправность измерительного моста, перекрывающаяся речь, соответствие событий моста журналу агента, потерянная телеметрия, отказы в звонках и ограничители ресурсов.
- Два режима. Мы измерили агента в стандартном режиме и с ранним стартом, при котором языковая модель начинает работать с распознанным текстом до формального закрытия реплики.
Что получилось
Диапазоны нагрузки
Оценки описывают, как звонящий воспринимает ответ. Каждая оценка заканчивается на своём индексе времени ответа.
| Диапазон нагрузки | Нагрузка, % номинальной ёмкости | Оценка ответа | Индекс до | Что замечает звонящий |
|---|---|---|---|---|
| Низкая | до 42 | Платина | 1,22 | Ответы приходят почти с той же скоростью, что и на одном звонке |
| Умеренная | 42–65 | Золото | 1,49 | Быстрый ответ |
| Высокая | 65–100 | Стандарт | 2,03 | Естественная пауза; диапазон заканчивается на номинальной ёмкости |
| Пиковая | 100–137 | Минимум | 2,71 | Заметная пауза, но всё ещё разговор |
| Всплеск | 137–176 | Предел | — | Более долгая пауза, все звонки по-прежнему соединены |
С ранним стартом каждый диапазон расширяется: «Платина» до примерно 57% номинальной ёмкости, «Золото» до примерно 78%, «Стандарт» до примерно 117%. Ранний старт мы измерили до 128% номинальной ёмкости.
Номинальная ёмкость достигнута
При 100 одновременных звонках среднее время ответа примерно вдвое больше, чем на одном звонке (индекс 2,02), и ответы остаются в оценке «Стандарт». С ранним стартом блок держит «Стандарт» примерно до 117% номинальной ёмкости.
| Нагрузка, % номинальной ёмкости | Индекс ответа | С ранним стартом | 95-й процентиль / медиана | Доля пропускной способности |
|---|---|---|---|---|
| 1 звонок | 1,00 | 0,88 | 1,73 | 0,01 |
| 24 | 1,07 | — | 1,61 | 0,38 |
| 36 | 1,15 | — | 1,61 | 0,55 |
| 50 | 1,30 | 1,14 | 1,69 | 0,74 |
| 64 | 1,48 | — | 1,72 | 0,94 |
| 80 | 1,75 | — | 1,70 | 1,00 |
| 96 | 1,97 | 1,71 | 1,62 | 0,98 |
| 112 | 2,20 | — | 1,69 | 0,94 |
| 128 | 2,52 | 2,21 | 1,68 | 0,99 |
| 152 | 3,02 | — | 1,60 | 0,91 |
| 176 | 3,34 | — | 1,71 | 0,81 |
Время ответа растёт медленнее нагрузки
Кривую мы описываем одним числом, эластичностью нагрузки: на сколько процентов растёт время ответа при росте нагрузки на один процент.
| Диапазон нагрузки, % номинальной ёмкости | Эластичность | Время ответа на +10% нагрузки |
|---|---|---|
| 24–64 | 0,33 | около 3% |
| 64–128 | 0,77 | около 8% |
| 128–176 | 0,88 | около 9% |
Эластичность остаётся ниже 1 вплоть до 176%, и на кривой нет излома, после которого она резко идёт вверх. Клиент, который превышает номинальную ёмкость на 20%, получает заметно более долгую паузу, но система продолжает работать.
Хвост сохраняет пропорции
Медианный ответ и ответ на 95-м процентиле сохраняют одно соотношение на каждой ступени, от одного звонка до 176%:
Ответ на 95-м процентиле примерно в 1,6–1,7 раза больше медианного на каждой ступени нагрузки.
Медленные ответы растут вместе с остальными, поэтому клиент, знающий типичную паузу, может оценить и худшую.
Пропускная способность держится
Число ответов в секунду растёт с нагрузкой, достигает пика примерно при 80% номинальной ёмкости и остаётся в пределах 6% от пика с 64% до 128% от неё. При 176% блок всё ещё обрабатывает около 80% пиковой пропускной способности.
Звонки и медиа
- Реплики с ответом. На каждой ступени ответ получили более 99% реплик звонящих.
- Медиа. На измерительной линии не потерялось ни одного RTP-пакета ни на одной ступени.
- Приём звонков. При 176% номинальной ёмкости одновременно было поднято 352 SIP-звонка. Все соединились, ни один не оборвался.
- Модели. Очереди языковой модели и синтеза речи оставались пустыми на каждой ступени.
Раунд 1 и раунд 2
Мы провели тест, оптимизировали стек под высокую нагрузку и провели тест ещё раз. Оптимизация затронула тракт медиа, распределение детектора голоса между звонками, обработку тишины в синтезированной речи и момент запуска языковой модели.
| Показатель | Раунд 1 | Раунд 2 |
|---|---|---|
| Ёмкость в оценке «Стандарт» | около половины номинальной ёмкости | номинальная ёмкость |
| Ёмкость в оценке «Золото» | около 36% номинальной ёмкости | около 65% номинальной ёмкости |
| Время ответа, один звонок | исходное | на 22% ниже |
| Время ответа при половине номинальной ёмкости | исходное | на 34% ниже |
| Пиковая пропускная способность | исходная | почти вдвое выше |
Раунд 2 достиг номинальных 100 звонков, поэтому число в спецификации измеренное. Страница «Технологии» показывает, где нагрузочный тест находится в стеке. В заметке Voicecore (на английском) описан следующий шаг в обработке звука: ядро на Rust.
Условия теста
Измерено по G.711 на тестовой телефонной линии, с двадцатью имитируемыми звонящими и агентом-рекрутером; 94% первых фраз пришли из голосового кэша.