Как смоделировать большое количество клиентов с помощью UCMA для нагрузочного тестирования?

Я создал приложение, используя SDK 2013 на стороне клиента Lync и UCMA 4.0. Сейчас я тестирую свое приложение с большим количеством пользователей. Как смоделировать большое количество клиентов с помощью клиентского SDK UCMA или Lync?


person swapnil    schedule 27.11.2015    source источник


Ответы (2)


Это зависит от того, что именно вы хотите «симулировать».

Если вам нужен только трафик вызовов, есть sipp, но это просто вызовы sip, которые на самом деле не отражают фактический клиент Microsoft Lync.

Насколько мне известно, Microsoft не предоставляет в Lync инструментов для нагрузочного тестирования. Вам придется генерировать их самостоятельно на основе того, что именно вы хотите «симулировать».

С доверенным приложением UCMA вы должны иметь возможность запускать и использовать большое количество пользовательских конечных точек для «симуляции» общих служб lync (таких как случайное изменение присутствия, выполнение вызовов, отправка мгновенных сообщений и т. д.). Вам придется создать такое приложение самостоятельно.

person Shane Powell    schedule 30.11.2015

Я создал инструмент в UCMA, чтобы провести стресс-тест для всех моих приложений, чем я сделал.

Он прост в изготовлении и состоит из двух частей. Этот пример — стресс-тестер для звонков. Конечно, вы можете легко сделать другой, используя этот пример.

  1. Мы создаем нашу платформу, следуйте нашему Set-CsTrustedApplication.

    var platformSettings = new ProvisionedApplicationPlatformSettings("InnixiTester", "urn:application:innixitester"); 
    var collabPlatform = new CollaborationPlatform(platformSettings);
    
    collabPlatform.EndStartup(collabPlatform.BeginStartup(null, null));
    

Хорошо, я знаю, что я здесь неправильно связываю Начало и Конец в одну строку кода. Однако это всего лишь пример кода. Я приглашаю вас прочитать статью Тома Моргана., он объясняет, почему делать это так, как я, нехорошо.

  1. Здесь мы используем параллельный цикл, чтобы создать конечную точку всех наших пользователей. Таким образом, это происходит быстрее.

    /*
     * Proprieties of the class 
     */
    
    private AutoResetEvent _waitForStressTestToFinish = new AutoResetEvent(false);
    private List<UserEndpoint> _listUserEndpoints = new List<UserEndpoint>();
    private int _maxUsers = 200;
    private int _tickTotal;
    private int _tickCount;
    private int _nbrCallsByIntervall;
    
    /*
     * End
     */
    
    _maxUsers = 200; // Nbr max of users
    const var callsTotal = 200; // Nbr of total call
    const var timeToTest = 30; // Total time to test
    const var intervalOfCalls = 5; // We want to make our calls between specific intervals
    
    
    Parallel.For(0, _maxUsers, i => 
            {
                CreateUserEndpoint(collabPlatform, i.ToString());
            });
    
  2. Вы просто создаете свою UserEndpoint здесь. Сценарий таков, что мои пользователи в активном каталоге — от stressuser0 до stressuser200. С расширением от +14250 до +1425200

    private void CreateUserEndpoint(CollaborationPlatform cp, string iteration)
    {
        try
        {
            UserEndpointSettings settingsUser = new UserEndpointSettings($"sip:stressuser{iteration}@pferde.net", "pool2010.pferde.net", 5061);
    
            settingsUser = InitializePublishAlwaysOnlineSettings(settingsUser);
    
            var userEndpoint = new UserEndpoint(cp, settingsUser);
    
            userEndpoint.EndEstablish(userEndpoint.BeginEstablish(null, null));
    
            PublishOnline(userEndpoint);
    
            _listUserEndpoints.Add(userEndpoint);
    
            Console.WriteLine($"The User Endpoint owned by URI: {userEndpoint.OwnerUri} was created\n");
        }
        catch (Exception)
        {
            Console.WriteLine($"failed to create for --> sip:stressuser{iteration}@pferde.net");
            throw;
        }
    
    }
    
    private UserEndpointSettings InitializePublishAlwaysOnlineSettings(UserEndpointSettings settings)
    {
        settings.AutomaticPresencePublicationEnabled = true;
        settings.Presence.PreferredServiceCapabilities.AudioSupport = CapabilitySupport.Supported;
    
        return (settings);
    }
    
  3. Пришло время звонить! Мы собираемся написать простой алгоритм с таймером. Собирается вычислить, сколько вызовов нужно сделать за время X, за Y вызовов и за Z интервалов.

       Console.WriteLine("Tape a key to place calls...");
       Console.ReadKey();
    
       PlaceCalls(callsTotal, timeToTest, intervalOfCalls);
    
       _waitForStressTestToFinish.WaitOne();
    
       }
      catch (Exception ex)
     {
     Console.WriteLine($"Shutting down platform due to error {ex}");
     ShutdownPlatform(collabPlatform);
     }
     ShutdownPlatform(collabPlatform);
    }
    
    private void PlaceCalls(int callsMax, int timeMax, int timeIntervall)
    {
        _tickTotal = timeMax / timeIntervall;
        _nbrCallsByIntervall= callsMax / _tickTotal;
    
        Console.WriteLine($"_nbrCallsByIntervall --> {_nbrCallsByIntervall}");
    
        var timeIntervalTimespan = new TimeSpan(0, 0, 0, timeIntervall);
        _timer = new Timer(timeIntervalTimespan.TotalMilliseconds);
        _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
        _timer.Enabled = true;
    }
    
    
    void _timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        if (_tickCount < _tickTotal)
        {
            Console.WriteLine($"\n Pause Timer | On {_tickCount} to {_tickTotal}\n");
            _timer.Enabled = false;
            for (var i = 0; i <= _nbrCallsByIntervall - 1; ++i)
            {
                ConversationSettings convSettings = new ConversationSettings();
                Conversation conversation = new Conversation(_listUserEndpoints[generateNumber(0, _listUserEndpoints.Count)], convSettings);
    
                var audioVideoCall = new AudioVideoCall(conversation);
                CallEstablishOptions options = new CallEstablishOptions();
    
                var gNbr = generateNumber(0, _listUserEndpoints.Count);
                try
                {
                 // Here I'm calling a single phone number. You can use GenerateNumber to call stressusers each others. But you have to extend your code to accept the calls coming.
                    audioVideoCall.BeginEstablish($"3322", options, null, audioVideoCall);
                }
                catch (Exception)
                {
                    Console.WriteLine("Fail to Call the remote user...");
                    throw;
                }
               Console.WriteLine($"Call--> +1425{gNbr}.Counter--> {_tickCount} Ticket--> {_tickTotal} and thread id {Thread.CurrentThread.ManagedThreadId}");
            }
            _tickCount++;
            _timer.Enabled = true;
            Console.WriteLine("\n reStart Timer \n");
        }
        else
        {
            Console.WriteLine("\n!!! END Stress test !!!\n");
            _timer.Enabled = false;
            _waitForCallToEstablish.Set();
        }
    }
    
    private int generateNumber(int min, int max)
    {
        var r = new Random();
        Thread.Sleep(200);
        return (r.Next(min, max));
    }
    
person Magellan    schedule 05.02.2016