2010-06-11 6 views
6

Przepraszam, jeśli jest to więcej błędu serwera vs. stackoverflow. Wydaje się, że jest na granicy.Jak mogę przekroczyć 60% Limit pamięci IIS7 w aplikacji do buforowania ASP.NET

Mamy aplikację, która przechowuje dużą ilość danych produktu dla aplikacji handlu elektronicznego przy użyciu buforowania ASP.NET. Jest to obiekt słownikowy z elementami 65K, a nasze obliczenia powodują, że rozmiar obiektu wynosi ~ 10 GB.
Problem:

  1. Ilość pamięci zużywa obiekt wydaje się być znacznie powyżej naszych obliczeń 10GB.

  2. NAJWIĘKSZA KONCERN: Nie możemy wydawać się używać ponad 60% z 32 GB na serwerze.

Co próbowaliśmy tej pory:

W machine.config/system.Web (sf nie pozwala tagi, przepraszam formatowanie):

processModel autoConfig="true" memoryLimit="80" 

W web.config/system.web/caching/cache (sf nie zezwala na znaczniki, ułaskawmy formatowanie):

privateBytesLimit = "20000000000" (and 0, the default of course) 
percentagePhysicalMemoryUsedLimit = "90" 

Środowisko: systemu Windows 2008R2 x64 32GB RAM IIS7

Nic nie wydaje się, aby umożliwić nam przekroczyć wartości 60%. Zobacz zrzut ekranu Taskmana.

http://www.freeimagehosting.net/image.php?7a42144e03.jpg

+0

Wykształcone odgadnięcie: serwer ponownie dostosowuje swoją pamięć, aby dostosować się do zwiększonego obciążenia, na które się rzuca, używając większej ilości pliku wymiany, aby zrekompensować lub szybciej zbiera pamięć. Coś w tym stylu. Jak wygląda karta Wydajność w Taskmanie podczas zwiększania obciążenia? Czy zwiększa się rozmiar pliku wymiany? –

+0

@Robert: Swap pozostaje prawie płaski (co ma sens, ponieważ jest to pamięć podręczna w pamięci). Warto jednak sprawdzić. @all: Zastanawiam się, czy problemem jest rozmiar pojedynczego obiektu. Czy GC wymaga pewnej ilości "wolnego miejsca" do przesuwania obiektów, a ten _jeden_ obiekt przekroczył to? – evilknot

+0

Czy wymieniasz obiekty ze słownika i poza nim? Jeśli tak, to może wywierać presję na GC, ponieważ każda zamiana uwolni obiekt, który musi zostać w pewnym momencie usunięty. GC może nie czekać, aż zabraknie pamięci, zanim wykona kolekcję. Niektóre profile pamięci mogą być w porządku. –

Odpowiedz

1

Czy bierzesz za pomocą różnych strategii buforowania? Wbudowane buforowanie nie jest tak bogate w funkcje i będziesz walczył o to, by zrobić o wiele więcej (chyba, że ​​jakiś guru IIS ma jakieś sprytne zadanie).

Spędziliśmy dużo czasu pracując nad tym i poddaliśmy się. Używamy szczuplejszych obiektów do przechowywania w pamięci podręcznej i uzyskiwania pełniejszych obiektów w razie potrzeby.

Kiedy musieliśmy się nad tym zastanowić, zbadaliśmy Memcached i Velocity, ale wycofaliśmy się z ich wdrożenia. Są jednak bardziej funkcjonalne.

Również, w jaki sposób przechowujesz elementy w pamięci podręcznej przez kod? Czy umieszczasz je tam na początku aplikacji lub po pierwszym wniosku dla każdego? Powodem, dla którego pytam, jest to, czy klucze do pamięci podręcznej są skuteczne i czy faktycznie zapełniasz pamięć podręczną w kółko i nie pobierając niczego (może to być tylko jeden typ obiektu). Udało nam się to zrobić raz, dodając na przykład czas na konkretny klucz pamięci podręcznej.

+0

Zdecydowanie odkrywamy inne skrytki. Zapełniamy pamięć podręczną jednorazowo, gdy aplikacja się uruchamia i nie ulega zmianie. Przyglądaliśmy się powyższym, oprócz nCache. Dzięki! – evilknot

+1

+1, pamięć podręczna asp.net jest tu naprawdę błędna - prawdopodobnie chcesz czegoś innego i nie chcesz tego robić. –

2

Trochę późno, ale mam prawie ten sam problem. Problem z ustawieniem memoryLimit na processModel polega na tym, że wydaje się, że nie ma on żadnego efektu, mimo że został udokumentowany jako taki.

percentagePhysicalMemoryUsedLimit Podobnie wygląda na to, że powinien zrobić coś, ale nie ma żadnego efektu.

privateBytesLimit="20000000000"Działa jednak. Poszedłem i debugowałem proces i znalazłem obiekt CacheMemorySizePressure, który pomyślnie podniósł wartość i ustawił ją na _memoryLimit. Sprawdziłbym to jeszcze raz.

Inną opcją jest ustawienie progu odtworzenia użycia pamięci prywatnej w puli aplikacji IIS. To powinno również zostać odebrane i zastąpić domyślny limit 60%.

Trzecia opcja wykorzystuje nową klasę MemoryCache i ustawienie na niej .