Pracując przy projekcie, który bardzo mocno wykorzystuje obliczenia matematyczne, po raz pierwszy natknąłem się w praktyce na ograniczenia pamięciowe. W pierwszych wersjach systemu nie udało nam się tych ograniczeń zauważyć, gdyż operowaliśmy na małych próbkach danych rzędu 1000x20. Oczywiście należało sprawdzić działanie także dla większej próbki danych i wyskoczyło nam pierwsze z ograniczeń.
Początkowo prace deweloperskie przeprowadzane były na maszynie z systemem 32bitowym z pamięcią 4GB. Występuje tutaj zjawisko ograniczenia pamięci dla procesu do 2GB (ewentualnie do 3GB z odpowiednim przełącznikiem). Przez jakiś czas wystarczał nam obecny limit... Ale po co się ograniczać skoro procesory są 64bitowe? Tak więc po przeinstalowaniu systemu na Windows Server 2008 x64 nastąpiła przedwczesna radość z praktycznie zerowymi limitami (nie mam do dyspozycji serwera z 2TB pamięci RAM
).
Pierwszym problem przy uruchamianiu aplikacji pojawił się z bibliotekami matematycznymi Intel Math Kernel Library, były jeszcze 32bitowe, ale nie sprawiło dużo kłopotów przerobienie jej na wersję 64bitową (aczkolwiek trzeba było trochę doczytać;P ).
W końcu z wielką radością w oczach aplikacja została odpalona i można było patrzeć jak rośnie słupek zajętości pamięci przez proces, urósł do około 4GB. No dobra, ale jakie tutaj są ograniczenia? Okazuje się, że najbliższym limitem jest ciągł obszar jaki można zaalokować. Próba zdefiniowania tablicy typu Byte o liczbie elementów większej niż 2^31 zakończyła się porażką (mniejszą bądź równą - należy wziąć jeszcze narzut platformy .NET - jak najbardziej udało się zaalokować). Dlaczego akurat tablica może mieć rozmiar tylko 2GB? No cóż, wina leży po stronie platformy .NET i środowiska CLR.
Następny krokiem była próba zaalokowania kilku tablic po 2GB każda. Niestety po 6 takich wyświetlił mi się wyjątek OutOfMemoryException (patrz rysunek)

Przyczyną braku pamięci zapewne była wielkość pliku wymiany, gdyż odpowiedni licznik pokazywał ładną liczbę 15999MB (rysunek). Zajętość co prawda wyniosła 14484MB, ale kolejne 2GB tutaj już się nie mieszczą

Ostatecznie muszę stwierdzić, że o ile limit 2GB na wielkość ciągłej pamięci do zaalokowania może boleć (należałoby się zagłębić bardziej w jaki sposób można to obejść), to obszar pamięci dla jednego procesu jest jak na razie nie do zapełnienia dla mnie pożytecznymi danymi, a zawsze można jeszcze zwiększyć rozmiar pliku wymiany.
Warto przeczytać:
- BigArray<T>, getting around the 2GB array size limit
- Memory Limits for Windows Releases
- Zarządzanie pamięcią w 32 i 64-bitowych systemach Windows
Dwa dni temu na stronach Microsoftu można było zauważyć długo oczekiwane następne wydanie CTP SQL Servera 2008, które w przeciwieństwie do CTP5 zaczęło oficjalnie wspierać LINQ to SQL w Visual Studio 2008. Pierwszy kontakt z CTP6 wyszedł dosyć dobrze, bez problemów dało zainstalować się na kilku serwerach (opartych na Windows Server 2008) – nie pojawił się żaden błąd i wszystko działało od ręki. Problemy zaczęły się dopiero w momencie, gdy zapragnąłem zainstalować go na moim laptopie. A zaczęło się to mniej więcej tak
Odinstalowałem (tzn. spróbowałem odinstalować) wpierw poprzednią wersję SQL Server 2008 oraz SQL Server Express 2005, niestety ten proces nie do końca się powiódł, gdyż wystąpił błąd o niezbyt rozbudowanej treści "Setup has encountered the following error: Failed to retrieve data for this request..". W Internecie jedyne co udało mi się znaleźć to opis, że trzeba ręcznie usunąć aplikacje (np. za pomocą Windows Install Clean Up, a następnie wyczyścić pliki z katalogu Program Files). Tak więc też uczyniłem.
Po restarcie systemu i odpaleniu instalatora SQL Server 2008 w niecałe 30s pojawił się znowu identyczny błąd (gdy odpaliłem ręcznie instalator SQL Database Engine wyświetlił jakieś dziwne zapytanie SQL i również instalacja się nie powiodła). Google już niestety na ten temat milczało. Ale ponieważ tak łatwo nie można się poddać, więc szukałem dalej;).
Rozwiązanie problemu znajdowało się w sercu systemu Windows – w rejestrze
Postanowiłem być trochę brutalny i usunąłem wszystkie wpisy związane z SQL Serverem z klucza HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ (delikatne próby usuwania wybiórczych wpisów także spełzły na niczym). Efektem tego było szczęśliwe zainstalowanie Microsoft SQL Server 2008 CTP6. Można więc wracać już do zabawy
Download: Microsoft SQL Server 2008 CTP6 (February 2008)
Kolejny dzień zmagań z konfiguracją maszyn wirtualnych chyba również nie zakończy się sukcesem. Przedstawię może najpierw moją sytuację.
Istnieją sobie dwa serwery fizyczne S1 i S3, są ze sobą spięte siecią. Wczoraj na S1 instalowałem kolejny wirutalny serwer S2 na platformie Hyper-V. Dodałem jedną wirtualną kartę sieciową i podłączyłem ją bezpośrednio z kartą fizyczną S1. Teoretycznie wszystko powinno działać, ale niestety nie do końca. Komunikacja z S1 do S3 przebiega bezproblemowo, z S2 do S3 również, z S1 do S2 już niestety nie. Co jest naprawdę dziwne, gdyż według dokumentacji (troszkę lakonicznej) i doświadczenia z sieciami opartymi na oprogramowaniu VMWare powinno wszystko działać..

Jak to mówią: jak coś nie idzie wróć do problemu później :). Zrobiłem tak i w tym przypadku.
Problem udostępniania Internetu na wirtualnej maszynie rozwiązałem poprzez ponowne wywołanie kreatora roli Routing and Remote Access. Przedtem o ile wybrałem domyślne ustawienia dla sieci VPN to teraz wybrałem opcję konfiguracji NAT. Po wybraniu interfejsu zewnętrznego oraz interfejsów sieci prywatnych wszystko ładnie automagicznie się skonfigurowało.
Ale tutaj pojawia się kolejna wada sposobu konfiguracji routingu. Aby skorzystać z kreatora należy wpierw wyłączyć usługę Routing and Remote Access (kliknięcie prawym przyciskiem na nazwie w drzewki i wybranie Disable Routing and Remote Access, a następnie włączyć ponownie w sposób analogiczny. W tym momencie ukaże się nam odpowiedni kreator ustawień. Fajnie gdyby odpowiednia opcja pokazała się w menu Action tej usługi.., ale zapewne tak nie będzie.
Teraz zostało mi już tylko skonfigurowanie serwera VPN..
Dzisiaj kolejny raz miałem okazję instalować najnowszą oficjalną wersję testową Windows Server 2008. Moje wrażenia są ogólnie średnie. O ile za pierwszym i drugim podejściem instalacja trwała około 20minut to dzisiaj po połączeniu dysków w RAID0 sama instalacja wydłużyła się do około 35minut. Najpierw 5 minut czekało się zanim do końca odpali się instalator (można było machać tylko myszką, a na ekranie nic nie było...). Kolejne kilka minut zostało straconych na rozpoznanie dysku, ogólnie kiepsko współpracuje z RAIDem.
Po zainstalowaniu pierwsze co zrobiłem to zainstalowałem Hyper-V (tutaj należy dodać, że podczas instalacji systemu nie należy zmieniać lokalizacji na inną niż standardowa – English US – gdyż ta usługa nie będzie działać). Menadżer wirtualnych maszyn jest całkiem całkiem, integracja z konsolą MMC robi swoje;). Następnie stworzyłem nową wirtualną maszynę z dyskiem 35GB, który stworzył względnie szybko, i zainstalowałem kolejny raz Windows Server 2008. Tym razem instalacja wydłużyła się już do prawie godziny z tego już nie jestem zachwycony :).
Instalacja SQL Servera 2008 na wirtualnej maszynie poszła już całe szczęście dosyć szybko, a w między czasie postanowiłem skonfigurować sieć. I tutaj zaczęły się schody. O ile w konkurencyjnym produkcie VMWare Server (VMWare Workstation) wystarczy włączyć w ustawieniach karty sieciowej opcję NAT i wszystko się robi automatycznie, to tutaj już tak łatwo nie ma. Wpierw należało zainstalować rolę Network Policy and Access a razem z nią NPS (aby stworzyć połączenie VPN – ale to później będę potrzebował) oraz Routing and Remote Access. Jak narazie stanąłem w tym miejscu. Męczyłem się chyba ze dwie godziny kombinując jak tutaj udostępnić Internet na maszynę gościa, ale wszystkie próby zakończyły się niepowodzeniem. Dokumentacji w Internecie jest jeszcze mało, a pomoc systemu Windows o ile w niektórych momentach była bardzo pomocna, to w tym przypadku zawiodła.
Wrócę do tego problemu może trochę później...