2011-06-26 14 views
9

Widziałem niektóre dyskusje podobne do tego pytania, ale nic, co naprawdę odpowie na problem, z którym się borykam.Szybkie sprawdzanie lub ograniczanie użycia pamięci wątku w .NET?

Pracuję nad aplikacją C#, w której zachowanie oprogramowania można dostosować za pomocą zinterpretowanych skryptów. Każdy skrypt działa na innym wątku podrzędnym aplikacji C#. (Używam interpretera Jint javascript do uruchamiania skryptów, ale moje pytanie jest równie ważne dla wszelkich innych okoliczności, w których wątek mógłby dynamicznie zachowywać się w aplikacji .NET). Jak dotąd działa to świetnie. Ale muszę się upewnić, że aplikacja zachowuje się sama. W przypadku złego skryptu, który może sprawić, że aplikacja skończy się z miejsca stosu, potrzebuję możliwości wykrycia i zatrzymania każdego wątku, który pochłania zbyt dużo pamięci. Koncepcyjnie może to być postrzegane jako podobne do przeglądarki internetowej określającej, czy javascript na stronie zajmuje zbyt dużo czasu lub zbyt dużo pamięci do wykonania. Problem polega na tym, że nie byłem w stanie określić, czy jest jakiś sposób na zrobienie tego w .NET.

Czy jest jakiś sposób, czy mogę umieścić twardy limit na ilość pamięci, którą wątek może wykorzystać, lub szybko sprawdzić wykorzystanie pamięci wątku z wątku rodzica? Nie chodzi mi o przepełnienie stosu w wątku, tylko przestrzeń sterty.

Oczywiście "oczywistym" rozwiązaniem byłoby podzielenie interpretacji na oddzielne procesy, a nie na osobne wątki, ale to by spowodowało znaczny spadek wydajności dla mojej aplikacji, ponieważ te skrypty modyfikują zachowanie oprogramowania i dlatego są przeznaczone do ścisłego sprzężony. Monitorowanie na poziomie aplikacji również nie byłoby idealne, ponieważ nie dostarczałoby informacji o tym, który skrypt nie zachowuje się sam. Ponadto powolna metoda przeznaczona do debugowania nie zadziała, ponieważ skrypty mają na celu umożliwienie szybkiej modyfikacji oprogramowania, a nie konieczność budowania, testowania i ponownego wdrażania. Potrzebuję tylko dość szybkiego sposobu, aby wykryć wątek, który je zbyt dużo, aby zabić i zignorować jego scenariusz.

Dzięki!

+0

"Pracuję nad aplikacją C#, w której zachowanie oprogramowania można dostosować za pomocą skryptów zinterpretowanych Każdy skrypt działa na innym wątku podrzędnym aplikacji C#"? Jeśli wszystko, co robisz, to dostosowywanie aplikacji. dlaczego skrypty muszą działać w oddzielnych wątkach? –

+0

"ponieważ te skrypty modyfikują zachowanie oprogramowania i dlatego są przeznaczone do ścisłego powiązania" - słyszę słowa ściśle powiązane ze skryptami i zaczynam się zastanawiać nad projektem ... –

+0

Jeśli chcesz ograniczyć wykorzystanie pamięci, to myślę, że lepiej korzystać z oddzielnych procesów. Jeśli istnieje niebezpieczeństwo, że jakiś skrypt nie ma absolutnie żadnej kontroli nad grą, to powinienem upewnić się, że działa on niezależnie od tego procesu. Nie jestem pewien, czy możesz ograniczyć sposób, w jaki chcesz, dla każdego wątku, ponieważ jeśli jakikolwiek interfejs API jest do tego dostępny, będzie to interfejs API systemu Windows i, o ile mi wiadomo, nie można mapować wątków zarządzanych wątków i okien do niego. być jakiegokolwiek użytku. – InBetween

Odpowiedz

0

WMI jest dla Ciebie jedną opcją. Wiem na pewno, że możesz monitorować wykorzystanie pamięci procesowej. Ale możesz zgłębić ten pomysł bardziej.

Here is small intro to WMI in C#. Istnieje cały zestaw klas, które można zapytać. A do sprawdzania lokalnych statystyk maszyn, nie będzie to bardzo drogie. Ale polecam najpierw wziąć numery wydajności.

+0

Problem tego podejścia, jak sądzę, polega na tym, że nie istnieje jeden do jednego związku pomiędzy zarządzanymi wątkami a wątkami Windows. – InBetween

3

Jak sugerują inne plakaty, host może być łatwiejszy w oddzielnym procesie. Nieco lżejsze podejście polegałoby na hostowaniu w osobnej domenie aplikacji i użyciu api app-domain resource monitoring do monitorowania użycia pamięci.

Powiązane problemy