6

Я создаю консольную программу, которая может протестировать чтение/запись в кеш путем имитации нескольких клиентов и написали следующий код. Пожалуйста, помогите мне понять:Тест нагрузки с использованием C# Async Await

  • ли это правильный путь для достижения нескольких клиентов моделирования
  • Что я могу сделать больше, чтобы сделать это испытание подлинной нагрузки
void Main() 
{ 

    List<Task<long>> taskList = new List<Task<long>>(); 

    for (int i = 0; i < 500; i++) 
    { 
     taskList.Add(TestAsync()); 
    } 

    Task.WaitAll(taskList.ToArray()); 

    long averageTime = taskList.Average(t => t.Result); 

} 

public static async Task<long> TestAsync() 
{ 
    // Returns the total time taken using Stop Watch in the same module 
    return await Task.Factory.StartNew(() => // Call Cache Read/Write); 
} 
+1

Похоже, что WCF и многие другие сервисные узлы предотвращают большую нагрузку от одного отправителя, поэтому, даже если вы закроете свою службу с одного компьютера, другие могут легко получить доступ к вашему сервису. –

+1

Возможно, некоторые задачи могут быть запланированы с помощью «Factory.StartNew», и их выполнение будет задерживаться в случае огромного количества одновременных задач. – cassandrad

ответ

2

Скорректированный код немного, чтобы увидеть, сколько потоков у нас есть в определенное время.

static volatile int currentExecutionCount = 0; 

static void Main(string[] args) 
{ 
    List<Task<long>> taskList = new List<Task<long>>(); 
    var timer = new Timer(Print, null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1)); 

    for (int i = 0; i < 1000; i++) 
    { 
     taskList.Add(DoMagic()); 
    } 

    Task.WaitAll(taskList.ToArray()); 

    timer.Change(Timeout.Infinite, Timeout.Infinite); 
    timer = null; 

    //to check that we have all the threads executed 
    Console.WriteLine("Done " + taskList.Sum(t => t.Result)); 
    Console.ReadLine(); 
} 

static void Print(object state) 
{ 
    Console.WriteLine(currentExecutionCount); 
} 

static async Task<long> DoMagic() 
{ 
    return await Task.Factory.StartNew(() => 
    { 
     Interlocked.Increment(ref currentExecutionCount); 
     //place your code here 
     Thread.Sleep(TimeSpan.FromMilliseconds(1000)); 
     Interlocked.Decrement(ref currentExecutionCount); 
     return 4; 
    } 
    //this thing should give a hint to scheduller to use new threads and not scheduled 
    , TaskCreationOptions.LongRunning 
    ); 
} 

В результате: в виртуальной машине у меня есть от 2 до 10 нитей, работающих одновременно, если не использовать подсказку. С подсказкой - до 100. И на реальной машине я могу сразу увидеть 1000 потоков. Проводник процесса подтверждает это. Некоторые детали на hint, которые будут полезны.

+0

Огромное спасибо за предоставленную интересную информацию, особенно в отношении намека на то, чтобы каждый поток вызывался на отдельном клиенте, а не по расписанию –

2

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

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

Ваша программа принимает только потоки из пула потоков. Если вы запускаете больше задач, тогда есть потоки, некоторые задачи придется ждать до запуска TestAsync. Это время ожидания будет измерено, если вы запомните время Task.Run.

Помимо ошибок во времени, сколько запросов на обслуживание вы ожидаете одновременно? Достаточно ли свободных потоков в пуле потоков для имитации этого? Если вы ожидаете одновременно около 50 запросов на обслуживание, а размер пула потоков составляет всего 20 потоков, то вы никогда не будете запускать 50 запросов на обслуживание одновременно. И наоборот: если ваш пул потоков больше, чем количество ожидаемых одновременных запросов на обслуживание, тогда вы будете измерять более продолжительное время, чем это реально.

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

+0

Спасибо за приятные детали, будут отличаться от них –