2009-08-28 11 views
5

Rozważam problemy z wydajnością dużego systemu C#/.NET 3.5, który wykazuje spadek wydajności, ponieważ liczba użytkowników wysyłających żądania skaluje do 40-50 różnych żądań użytkowników na sekundę.Debugowanie i diagnozowanie problemów z konwojowaniem konwoju w .NET

Czas trwania żądania znacznie się zwiększa, podczas gdy obciążenia procesora i wejścia/wyjścia wydają się pozostawać mniej więcej takie same. Prowadzi mnie to do przekonania, że ​​możemy mieć problem z tym, jak wspólne obiekty w naszym systemie, które są chronione za pomocą instrukcji C# lock() {...}, mogą mieć wpływ na wydajność równoczesnego dostępu. W szczególności, podejrzewam, że występuje pewien stopień blokady konwoju na często używanych współdzielonych danych, które są chronione przez krytyczne sekcje (ponieważ odczytuje/zapisuje).

Czy ktoś ma sugestie, jak faktycznie zdiagnozować, czy konwój blokady jest problemem .. lub czy kłótnia blokady jakiegokolwiek rodzaju przyczynia się do długich czasów oczekiwania?

Odpowiedz

3

Konwoje z blokadą są ogólnie trudne do debugowania. Czy twoja ścieżka kodowa ma instrukcje blokowania sekwencyjnego bezpośrednio lub w oddziałach?

Licznik wydajności Total # of Contentions podaje szacunkową podstawę rywalizacji w aplikacji.

Złam również profiler i wygląd. Możesz także napisać kilka liczników perf, aby wyśledzić wolne części ścieżki kodu. Upewnij się również, że blokady są przechowywane tylko tak długo, jak to absolutnie konieczne.

Sprawdź również Windows Performance Tools. Zauważyłem, że są one niezwykle przydatne, ponieważ można wyśledzić wiele problemów niskiego poziomu, takich jak nieprawidłowe przełączanie kontekstów.

2

Nie mogę dostarczyć wiele informacji na temat diagnostyki, ale jeśli znajdziesz dowód na poparcie swojego założenia, możesz być zainteresowany System.Threading.ReaderWriterLockSlim, który pozwala na jednoczesne odczyty, ale zapobiega równoczesnym zapisom.

Powiązane problemy