6

Tworzę program konsoli, który może przetestować odczyt/zapis w pamięci podręcznej przez symulację wielu klientów i napisał następujący kod. Proszę mi pomóc zrozumieć:Załaduj test za pomocą C# Async Oczekuje na

  • Czy to poprawny sposób, aby osiągnąć symulację klienta wielofunkcyjnego
  • Co mogę zrobić więcej, aby uczynić to test prawdziwy ładunek
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

Wygląda na to, że WCf i wiele innych hostów usługowych nie będzie w stanie dużo załadować od jednego nadawcy, więc nawet jeśli bombardujesz swoją usługę z jednego komputera, inni będą mogli łatwo uzyskać dostęp do twojej usługi. –

+1

Prawdopodobnie niektóre zadania mogą zostać zaplanowane za pomocą 'Factory.StartNew', a ich wykonanie zostanie opóźnione w przypadku dużej ilości równoczesnych zadań. – cassandrad

Odpowiedz

2

Skorygowana kod nieznacznie, aby zobaczyć, ile wątków mamy w danym czasie.

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 
    ); 
} 

Wynikiem jest: wewnątrz maszyny wirtualnej mam od 2 do 10 wątków działających jednocześnie, jeśli nie używam podpowiedzi. Z podpowiedzią - do 100. I na prawdziwej maszynie widzę 1000 nitek na raz. Process Explorer potwierdza to. Niektóre informacje na temat hint byłyby pomocne.

+0

Ogromne podziękowania za dostarczenie interesującej informacji, szczególnie w odniesieniu do podpowiedzi, aby upewnić się, że każdy wątek jest wywoływany na oddzielnym kliencie, zamiast zaplanowanego. –

2

Jeśli jest bardzo zajęty, to najwyraźniej Twoi klienci muszą poczekać, aż ich obsługa zostanie obsłużona. Twój program nie mierzy tego, ponieważ twój stoper zaczyna działać, gdy zaczyna się żądanie usługi.

Jeśli chcesz zmierzyć, co się dzieje ze średnim czasem, zanim żądanie zostanie zakończone, powinieneś uruchomić stoper, gdy żądanie zostanie wysłane, a nie kiedy żądanie zostanie obsłużone.

Twój program pobiera tylko wątki z puli wątków. Jeśli zaczniesz więcej zadań, są wątki, niektóre zadania będą musiały poczekać, zanim uruchomi się TestAsync. Czas oczekiwania zostanie zmierzony, jeśli pamiętasz czas wywołania Task.Run.

Oprócz wad w pomiarach czasu, ile zgłoszeń serwisowych oczekujesz jednocześnie? Czy istnieje wystarczająca ilość wolnych wątków w puli wątków do symulacji tego? Jeśli oczekujesz około 50 zgłoszeń serwisowych w tym samym czasie, a rozmiar puli wątków wynosi tylko 20 wątków, nigdy nie uruchomisz jednocześnie 50 zgłoszeń serwisowych. Odwrotnie: jeśli twoja pula wątków jest znacznie większa niż liczba oczekiwanych równoczesnych zgłoszeń serwisowych, wówczas będziesz mierzyć dłuższe czasy niż w rzeczywistości.

Rozważ zmianę liczby wątków w puli wątków i upewnij się, że nikt inny nie używa nici puli.

+0

Dzięki za miłe szczegóły będą się różnić od nich –