Mam aplikację Java, w której skalowalność jest przede wszystkim ograniczona przez pamięć RAM, którą chciałbym uruchomić na jednym lub kilku serwerach w centrum danych. Gdzie powinienem szukać sprzętu serwerowego, który może pomieścić 100 GB - 512 GB lub więcej pamięci RAM? Nie jestem ekspertem w takich sprawach, więc naprawdę nie wiem od czego zacząć.
Czy to dostaje się na terytorium superkomputera (6 cyfr lub więcej), czy też mogę uzyskać taki serwer za niskie 5-cyfrowe dolary?
Kilka uwag na podstawie poniższych pytań:
- Tak, starałem się wymyślić sposoby na usunięcie tego wymogu skalowalności, ale nie, tak naprawdę nie jest to opcja. Aplikacja zasadniczo wymaga bardzo szybkiego losowego dostępu do bardzo dużych ilości danych, przechowywanie na dysku twardym (być może za pośrednictwem bazy danych) go nie wycina.
- Jestem prawie pewien, że JVM może, przynajmniej teoretycznie, zwiększyć tak daleko. Regularnie uruchamiam swój kod z 10 GB przydzielonej do Sun 1.6 JVM bez zauważalnych problemów.
W porządku, patrz. Nie znajdziesz serwera, którego szukasz pamięci RAM, a przynajmniej takiego, który nie wymaga własnej sieci elektrycznej.
Dlaczego nie zastosować skalowalnego podejścia i nie używać pamięci memcached? Możesz rozdzielić pamięć na różne maszyny w sieci. Dane nigdy nie muszą dotykać dysku, a dzięki tak ultraszybkiej sieci, którą można kupić za pieniądze, o których mówisz, opóźnienia wcale nie będą stanowić problemu.
Oto klient memcached dla java: http://www.whalin.com/memcached/
A oto wprowadzenie do memcached na wypadek, gdybyś nie był zaznajomiony: http://www.danga.com/memcached/
Spójrz na to. Będzie to o wiele bardziej opłacalne niż budowanie pojedynczej potwornej maszyny z niesamowitą ilością pamięci RAM. Poza tym, jeśli robisz coś, co ma tego rodzaju wymagania, prawdopodobnie ma to kluczowe znaczenie dla misji i nie potrzebujesz ani jednego punktu awarii.
źródło
Serwery Opteron z 4 lub 8 gniazdami, takie jak HP DL585 lub DL785 lub Sun X4600, mogą zajmować duże ilości pamięci w zakresie 128-256 GB. Chociaż nie są tanie, z pewnością nie są w 6 cyfrowych metkach; 8-drożny, 32-rdzeniowy Sun X4600 z 256 GB list pamięci RAM w cenie około 35 000 $ na ich stronie internetowej, a to prawie tyle, ile zyskuje ten system. Prawdopodobnie przekonasz się, że możesz uzyskać system za nieco mniej niż cena katalogowa pokazana na stronie internetowej.
Mimo że moduły DIMM 4 Gb są dostępne, zwykle mają wyższą cenę, więc przejście na system z nimi maksymalny byłby znacznie droższy.
Jeśli chcesz użyć systemu tego typu, potrzebujesz 64-bitowego systemu operacyjnego. Upewnij się, że masz także 64-bitową maszynę JVM i sprawdź, czy działa ona dobrze z aplikacją.
źródło
Nie będę powtarzać sugestii sprzętowych (które są dźwiękowe), ale możesz spojrzeć na Terracotta, aby sprawdzić, czy pasuje ona do Twojej aplikacji.
http://www.terracotta.org/
źródło
Bądź absolutnie ostrożny, jakie takie rozmiary pamięci RAM. Skalowaliśmy maszynę HP do 64 GB (HP stwierdziło, że maszyna może wziąć 128 GB), ale dopiero po dodaniu dodatkowej płyty nośnej, wału chłodzącego i tak dalej (po wielu rozmowach z HP).
Tylko dlatego, że maszyna ma zająć do n GB, nie oznacza to, że będzie działać bez dodatkowych zmian. W naszym przypadku nie działały wszystkie normalne moduły pamięci, ponieważ były gorące, działały tylko bardzo specyficzne moduły.
źródło
Koszt pamięci RAM nie jest skalowany liniowo do dużych rozmiarów. To, że mogę kupić moduł DIMM o pojemności 1 GB za 15 USD, nie oznacza, że mogę uzyskać serwer o pojemności 128 GB za zaledwie 1920 USD ... na początek nie znajdziesz płyty głównej ze 128 gniazdami DIMM.
Powyżej pewnego rozmiaru (~ 8 do 16 GB) zaczynają się pojawiać płyty główne wymagające pełnego buforowania modułów DIMM (FB-DIMM), co kosztuje znacznie więcej na GB niż standardowa pamięć pulpitu.
Regularnie używamy maszyn z 128 GB pamięci, a cena znacznie spadła w ostatnich latach, ale nie mam żadnych aktualnych liczb ... ani żadnego doświadczenia, jak dobrze JVM skalowałby się do tego rozmiaru pamięci .
źródło
W rzeczywistości masz wiele opcji, tylko z listy HP masz blade BL680c, które mogą przyjąć 128 GB, ich DL580 / 585 mogą zająć 256 GB, a ich DL785 może przyjąć 512 GB. Niektóre komputery IBM mają pojemność do 256 GB, podobnie jak jeden Dell.
źródło
Myślę, że zaczniesz napotykać problemy z rezerwą przy 64 GB na tradycyjnym sprzęcie. Jeśli możesz skalować się stamtąd, byłbyś w porządku, ale sądzę, że o wiele bardziej opłacalnym rozwiązaniem byłoby zakwestionowanie twojej architektury. To prawda, że mówię to bez wiedzy o tym, co robicie, ale po prostu to wyrzucam.
źródło
Czy rozwiązanie EC2 firmy Amazon byłoby dla Ciebie opłacalne? Z pewnością byłoby to najbardziej opłacalne rozwiązanie.
źródło
Powiedzmy, że możesz zmieścić tyle pamięci w serwerze (jeśli się nie mylę, Linux na standardowym sprzęcie jest ograniczony do 64 GB, ale nie jestem pewien).
W większości systemów operacyjnych JVM jest ograniczona do przestrzeni sterty wynoszącej około 1,4 GB-1,6 GB, częściowo dlatego, że wymagana jest ciągła pamięć, a częściowo z powodu ograniczeń systemu operacyjnego.
W związku z tym dodatkowa pamięć RAM nie pomogłaby w skalowaniu jednej aplikacji, pozwoliłaby na uruchomienie tylko wielu instancji aplikacji. Będziesz jednak potrzebował wielu rdzeni i napotkasz różne inne problemy.
Po co ci tyle pamięci RAM? Być może będziesz w stanie znaleźć bazy danych, które można przechowywać w pamięci lub użyć napędu RAM, ale nie znam JVM, który pozwoliłby ci przechowywać tyle rzeczy w pamięci.
źródło
Typowym sposobem na uzyskanie większej ilości pamięci systemowej jest uzyskanie większej liczby systemów. Jeśli pamięć jest naprawdę wąskim gardłem, to nie tyle ile masz pamięci, ale jak dobrze Twoje dane są połączone z procesorami. Będziesz musiał skalować wiele rzeczy, aby zrobić ci dużo dobrego.
Aby to wyjaśnić, dodanie kilku zer do pamięci systemowej prawdopodobnie nie pozwoli zrobić tego, co myślisz. Przekonasz się, że teraz, gdy cały zestaw danych mieści się w pamięci lub nawet w nieco większym jej fragmencie, napotkasz inne wąskie gardło, takie jak unieważnienie pamięci podręcznej.
Właściwy sposób skalowania systemu jest powolny. Jeśli obecnie pracujesz, powiedzmy, na 4-rdzeniowym systemie z 8 koncertami pamięci RAM, najpierw wyprofiluj swoją aplikację, aby zobaczyć, gdzie naprawdę spędza czas, a następnie spróbuj podnieść do 12 lub 16 koncertów pamięci RAM i zobacz, jak to zrobić wyniki profilowania uległy zmianie.
Prawdziwe pytanie brzmi: dlaczego potrzebowałbyś około 100 razy więcej pamięci systemowej w porównaniu z innymi zasobami, niż to, co jest powszechnie dostępne. Jeśli wzorzec dostępu do danych jest w jakiś sposób przewidywalny, powinieneś zrobić zwiększenie przepustowości dysku, osiągnie to kilka kontrolerów RAID z kilkoma dyskami w paski.
Jeśli wzorzec dostępu do danych jest naprawdę, naprawdę losowy, prawdopodobnie istnieje miejsce na zoptymalizowany algorytm.
źródło
Prawdopodobnie potrzebujesz do tego specjalnego serwera.
Spróbuj spojrzeć na ES7000 od Unisys. Opis jest prawdopodobnie nieco przestarzały.
Może obsługiwać do 512 GB pamięci RAM. Korzysta ze znanych systemów operacyjnych, takich jak Windows i Linux Enterprise.
Będzie to kosztowało ~ 30 000 $ za standardową konfigurację, ale w przypadku Itanium i wszystkich dzwonków i gwizdków może wzrosnąć do ~ 600 000 $.
Przy tak dużej pamięci RAM możesz przechowywać dużo gorących danych bez dotykania miejsca na dysku.
źródło
Oczywiście potrzebujesz 64-bitowych systemów operacyjnych, ale nie jesteś na terytorium superkomputera. Na przykład PowerEdge R900 i R905 firmy Dell są dostępne z 256 GB pamięci RAM i używają zwykłych procesorów Intel Xeon / AMD Opteron i działają pod kontrolą systemów Linux, Solaris lub Windows 2003 i 2008.
Oczywiście kupowanie pamięci RAM bezpośrednio w firmie Dell nie jest bardzo opłacalne (chcą ~ 35 000 USD za 32 x 8 GB, podczas gdy można je uzyskać już za około 23 000 USD, być może mniej), ale z drugiej strony możesz chcieć aby upewnić się, że masz odpowiednie wsparcie, jeśli kupujesz serwer za 40 000 USD (nie spodziewałeś się, że 256 GB pamięci RAM będzie tanie, prawda? Jeśli 128 GB również jest OK, możesz zaoszczędzić ~ 12 000 USD).
Nie mam jednak doświadczenia, na którym systemie operacyjnym wybrać, uruchamianie Java 100+ GB zazwyczaj nie jest czymś, co robię :)
źródło
A może kompletnie gotowe rozwiązanie: baza danych. Wiem, że powiedziałeś, że to będzie zbyt wolne, ale to zależy od tego, co go hostuje. Co powiesz na hosting go na macierzy RAID0 wystarczającej ich liczby.
400 $ za gadżet, Pricewatch podaje chipy za 55 $ (nie sprawdziłem kompatybilności) za 4GB, więc to kolejne 440 $ za pamięć. To daje 32 GB za 840 USD. (Teoretycznie urządzenie może pobierać układy 8 GB, co daje w sumie 64 GB, ale żadne układy nie są jeszcze obsługiwane).
RAID0 4 z nich i jesteś w dolnej części swojego zakresu za nieco ponad 3000 $ + zwykłe pudełko. 16 z nich dostaje najwyższy poziom twojego zasięgu za 14 000 $.
To, czy jest to użyteczne, czy nie, sprowadza się również do charakteru danych - urządzenia te są niestabilne i wyczerpią swoją baterię zapasową w ciągu kilku godzin, chociaż mogą wykonać kopię zapasową na karcie CF.
źródło
Jestem wielkim fanem podejścia „wielu tanich serwerów”. Czy zastanawiałeś się może nad uruchomieniem tego rodzaju procesu na platformie Eucalyptus, dostępnej na Ubuntu 9.04? Możliwe jest, że możesz uruchomić ten program na kilku komputerach we własnej dedykowanej sieci gigabitowej z wieloma serwerami z 8, 16 lub 32 GB pamięci RAM i skalować w sposób liniowy, dodając więcej tanich serwerów, gdy ich potrzebujesz.
źródło
Przeczytałem twój komentarz na temat charakteru twojej aplikacji, ale nadal możesz rozważyć alternatywne rozwiązania.
FusionIO to jedna prawdziwa alternatywa. Tylko spójrz . Przy cenie 10 000 $ jest to nadal znacznie tańsze niż wysokiej klasy serwer. Przepisz przepustowość 1,0 GB / s - to naprawdę szalone.
Inną opcją jest oczywiście dysk SSD. Na wypadek, gdybyś widział specyfikację dysku SSD Intel® X25-E Extreme:
Umieszczenie kilku z nich w tablicy RAID 10 może zapewnić wystarczającą wydajność. A przy 400 USD za 32 GB jest o wiele tańszy niż alternatywne serwery wysokiej klasy.
źródło
W podobny sposób jak sugestia FusionIO, możesz uzyskać urządzenia, które pozwalają podłączyć dynamiczną pamięć RAM do interfejsu SATA. Coś w tym stylu (nie mam doświadczenia z produktem ani firmą, jest to tylko pierwsza opcja, która pojawiła się podczas wyszukiwania w „Zakupach Google”).
Możesz użyć kilku z nich jako zamontowanych systemów plików do buforowania danych przy użyciu logiki aplikacji (jest ona zasilana bateryjnie, więc powinna przetrwać rozruch i inne awarie) lub możesz użyć ich jako przestrzeni wymiany i pozwolić, aby jądro zdecydowało, jak z nich korzystać ( chociaż ponieważ jądra systemu operacyjnego są zwykle optymalizowane, zakładając, że wszystkie lokalizacje wymiany są wolniejsze o wiele rzędów wielkości i bardziej utajone niż prawdziwa pamięć RAM, prawdopodobnie będzie to musiało zostać znacznie poprawione, aby jak najlepiej wykorzystać takie ustawienie).
Opcja FusionIO będzie bardziej opłacalna, jeśli naprawdę potrzebujesz czegoś tak dużego, ten rodzaj pamięci RAM może być lepszy jako kompromis. Sprawdzając, jak dobrze serwer zdolny do 128 GB pamięci RAM na płycie głównej i kilka z pełnymi 64 GB zapełnionymi porównuje pod względem ceny i wydajności do specjalistycznego serwera, który obsługuje bezpośrednio 256 GB lub więcej, zostawiam ćwiczenie dla czytelnika!
źródło
3 lata po wyprawie sprawy są znacznie łatwiejsze.
Szukałem niektórych konfiguracji Siliconmechanics .
Najtańszym sposobem byłoby użycie platform AMD z 32 dimmami - 512 GB - 11,940 $ .
Alternatywną, ale znacznie droższą na GB jest platforma Intel z 64 dimmami - 1 TB - 48,769 $ .
źródło