Некорректная работа нагрузочного тестирования микшера и mixer_auto_start

gekz

New Member
Доброй ночи, при попытке использовать нагрузочное тестирование микшера отправляем запрос на /mixer/test/start и возвращает что все ок, но нагрузка не возрастает и последующий /mixer/find_all выдает, что нет микшеров. При попытке еще раз /mixer/test/start пишет, что "Test mixer already started". Остановка возвращает успешный статус. С чем это может быть связано или может конфликт каких настроек? Версия WCS сервера 5.2.714 ( триальная пока что) может еще с этим связано.
И второе при публикации потока с именем stream_name#room бывает так что мишкер автоматически не создается на сервере.
 

Max

Administrator
Staff member
Добрый день!
Спасибо за информацию о некорректной работе нагрузочного тестирования микшера.
По этой проблеме был заведен тикет WCS-2857. Сообщим, как только будет выпущен фикс.

Протестировали автоматическое создание микшера при публикации потока с именем stream_name#room. На наших серверах и на вашем сервере. Проблема не подтверждается.
Тестировали два варианта:
Вариант 1
Публиковали потоки в примере Two Way Streaming с именами stream#room1 и т.д. до stream#room10. После чего в результатах REST запроса /mixer/find_all отображалось 10 созданных микшеров.

Вариант 2
Публикуем поток stream#room1
Останавливаем публикацию потока
Снова публикуем поток stream#room1
и т.д. 10 раз.
Каждую итерацию проверяем существование микшера REST запросом /mixer/find_all
В этом варианте так же создалось 10 из 10 микшеров.

Если у вас проблема сохраняется, то расскажите подробнее, желательно со скриншотами, при каких действия у вас не происходит создания микшера и как вы проверяете работу. Опишите ваше тестовое окружение - версии браузеров, операционных систем и пр.
 

gekz

New Member
Two Way Streaming
там проблем никаких нет, проблема возникает при работе с MCU...
делаем подобно примеру
Code:
publishStream = session.createStream({
    ...
}).on(STREAM_STATUS.PUBLISHING, function (publishStream) {
    //play preview
    playStream(session);
    ...
});
и после
Code:
conferenceStream = session.createStream({
    name: streamName,
    display: remoteVideo,
    constraints: getConstraints()
    ...
});
conferenceStream.play();
и получается так, что поток публикуется (отслеживаем в консоле браузера chrome), но не воспроизводится... если ту же страницу перегрузить, то все ок.. хотя иногда даже надо несколько раз обновить. Такое ощущения, что "код" отрабатывает быстрее чем микшер создается и поэтому не воспроизводит сразу.. как будто нужен таймаут между публикацией и воспроизведением... но в зависимости от нагрузки на сервер таймаут может быть разный... как-то так.

И вот в 1 из подобных случаев оказалось, что микшера на сервере вообще нет, но воспроизвести с точностью не удалось
 

Max

Administrator
Staff member
и получается так, что поток публикуется (отслеживаем в консоле браузера chrome)
Публикацию потока более надежно отслеживать либо по получению события STREAM_STATUS.PUBLISHING, как Вы делаете для проигрывания preview потока в примере выше, либо на стороне сервера при помощи REST API /stream/find
Code:
POST /rest-api/stream/find HTTP/1.1
Host: wcs:8081
Content-Type: application/json

{
    "name":"user1#room1",
    "published":true
}
Запрос вернет 200, когда поток опубликован на сервере.
Также есть способ контроля доступности любого потока на сервере при помощи функции WebSDK Stream.available()
Code:
function availableStream(){
    var session = Flashphoner.getSessions()[0];
    var streamName = $('#playStream').val();
    session.createStream({
        name: streamName,
        display: remoteVideo
    }).available().then(function(stream){
        $("#availableStatus").text("AVAILABLE").attr("class", "text-success");
    }, function(stream){
        $("#availableStatus").text("UNAVAILABLE").attr("class", "text-danger");
    });
}
Для выходного потока микшера можно использовать либо Stream.available(), либо REST API
Code:
POST /rest-api/stream/find HTTP/1.1
Host: wcs:8081
Content-Type: application/json

{
    "name":"room1",
    "published":true
}
Такое ощущения, что "код" отрабатывает быстрее чем микшер создается и поэтому не воспроизводит сразу.. как будто нужен таймаут между публикацией и воспроизведением... но в зависимости от нагрузки на сервер таймаут может быть разный... как-то так.
Последовательность выполнения операций выглядит следующим образом:
1) Поток user1#room1 публикуется на сервере
2) Создается микшер room1
3) На сервере публикуются потоки room1, room1-user1room1
Задержки могут быть обусловлены пропускной способностью канала от клиента до сервера (особенно при публикации и проигрывании толстых потоков 720p и выше), общим количеством подключенных клиентов на сервере (поскольку канал сервера тоже не резиновый) и, в незначительной степени, нагрузкой на процессор сервера (здесь задержки могут составлять до сотни миллисекунд, поэтому ими можно пренебречь).
Поэтому наиболее общим подходом будет контроль публикации нужного потока через REST API или Stream.available()
 
Last edited:

gekz

New Member
Спасибо за детальное объяснение, теперь с этой частью разобрались и работает стабильно. Получается запрос mixer/startup со статусом 200 еще не означает, что потоки room1, room1-user1 опубликованы.
Поэтому наиболее общим подходом будет контроль публикации нужного потока через REST API или Stream.available()
Это помогло в решении ситуации
 
Last edited:

Max

Administrator
Staff member
Мы исправили проблему с запуском нагрузочных тестов микшера в сборке 5.2.746. Сборка 5.2.748 содержит также фиксы по оптимизации отрисовки фона в микшере. В связи с этим рекомендуем обновить сервер до последней актуальной сборки с этой страницы и провести тест.
На время проведения нагрузочного теста микшера необходимо отключить асинхронное завершение медиасессий (которое работает по умолчанию)
Code:
handler_async_disconnect=false
По окончании теста настройку нужно убрать из конфига сервера.
Получается запрос mixer/startup со статусом 200 еще не означает, что потоки room1, room1-user1 опубликованы.
Ответ 200 OK в ответ на запрос /mixer/startup
Code:
POST /rest-api/mixer/startup HTTP/1.1
Host: wcs:8081
Content-Type: application/json

{
    "uri":"mixer://room1",
    "localStreamName":"room1"
}
означает, что микшер создан с публикацией пустого выходного потока, т.е. поток room1 есть, но играть он не будет - там еще нет медиаданных. Медиаданные в потоке room1 появятся только после добавления в микшер хотя бы одного потока участника. Добавить можно как по REST API, так и с указанием имени микшера в имени потока, т.е. будет работать и
Code:
POST /rest-api/mixer/add HTTP/1.1
Host: wcs:8081
Content-Type: application/json

{
    "uri":"mixer://room1",
    "remoteStreamName":"user1"
}
и публикация потока user1#room1 из браузера
И только после успешного добавления в микшер участника, если включена поддержка MCU, будет опубликован поток без его аудио room1-user1room1
 
Top