Ile pamięci RAM faktycznie potrzebuje serwer?

12

Mam kilka serwerów rozmieszczonych na całym świecie. Działają w systemie Windows 2003 x64 z SQL Server 2005 x64 z 6 GB pamięci RAM. Pudełka nie mają najlepszej (ani nawet akceptowalnej) konfiguracji, ponieważ facet, który zamówił je lata temu, tak naprawdę nie wiedział, co robi.

W pudełkach zaczyna brakować pamięci, w końcu używa pliku stronicowania i wszystko zwalnia. Zazwyczaj opłata za zatwierdzenie wynosi 5,8 GB, a następnie, gdy ktoś musi zrobić coś intensywnego (np. Uruchomić raport), ta liczba przechodzi przez dach.

Próbowałem zdobyć moce, które nakazują zwiększenie ilości pamięci, ale mam ogromny sprzeciw (np. Zwiększenie wydajności oprogramowania, zbyt wysokie koszty dla wszystkich serwerów lub udowodnienie, że pudełko nie ma wystarczającej ilości pamięci itp. ..).

Czy istnieją wytyczne (lub formuła) określające, ile pamięci RAM potrzebuje urządzenie, które mogę przedstawić innym użytkownikom, abyśmy mogli w końcu zamówić więcej pamięci?

AngryHacker
źródło
Czy system został opracowany wewnętrznie?
Oskar Duveborn
@Oskar. Tak, jestem programistą, a kod jest zoptymalizowany do piekła iz powrotem. Jest po prostu mnóstwo danych.
AngryHacker
Zobacz moją odpowiedź. Właśnie w tym się specjalizuję.
mrdenny,

Odpowiedzi:

9

Naprawdę nie jest to żaden sposób, aby łatwo to stwierdzić, ponieważ jest to całkowicie zależne od twojego użycia i aplikacji. Maksymalnie wykorzystujesz serwer bazy danych ... jak duża jest baza danych? Jakie są twoje statystyki transakcji?

Rzeczywiste ograniczenia są oczywiste w twoim scenariuszu. Biegasz przez jakiś czas na 6 koncertach bez problemu, potem to zamiana i thrashowanie. Zatem 6 koncert to za mało.

Jeśli wydajność jest wystarczająca, aby mieć wpływ na biznes, to twoi wyżsi przełożeni powinni słyszeć wystarczająco dużo skarg, że rozsądnie jest zwiększyć pamięć. Sprawdź, ile kosztuje Twój czas, a następnie dowiedz się, ile będzie kosztowało „dostrojenie” serwera i rozwiązywanie problemów z dostrajaniem, gdy pamięć dodana do serwera może bardzo dobrze rozwiązać problem kosztu pamięci i mniej niż pół godziny przestoje

Nie poznasz dokładnej ilości potrzebnej pamięci, dopóki nie wdrożysz jej w rzeczywistości i nie zaczniesz z niej pracować.

To powiedziawszy, możesz chcieć sprawdzić, czy twoje zgłoszenie jest naprawdę wąskim gardłem. Uruchom monitor wydajności systemu Windows, aby zobaczyć statystyki we / wy dysku i przepustowość sieci. Sprawdź również swój poziom fragmentacji ( Google jest tutaj dobrym przyjacielem ). Możesz spróbować skontrolować kod pod kątem oczywistych problemów, w których zapytanie jest bardzo nieefektywne ( ponownie Google ).

Ale znowu wszystko zależy od tego, jak bardzo wpłynie to na biznes. Czy warto więcej zainwestować w strojenie, czy też jest wystarczająco zły, aby najpierw rzucić na niego sprzęt, a następnie spróbować go dostroić?

Bart Silverstrim
źródło
Potrzebny rozmiar +1 i statystyki
Oskar Duveborn
12

Łatwym sposobem sprawdzenia, czy potrzebujesz więcej pamięci RAM, jest zobrazowanie licznika perfmon Page Life Expectancy. Ten licznik informuje, jak długo SQL Server myśli, że dane będą przechowywane w puli buforów, zanim będzie trzeba zrobić miejsce dla innych danych. Chcesz, aby ta liczba była jak najwyższa. Przy zainstalowanych 6 gigabajtach pamięci RAM (powinieneś ustawić SQL na maksymalny limit na prawdopodobnie 4 gigabajty) prawdopodobnie będziesz przechowywać dane w pamięci maksymalnie przez kilka minut, gdy ktoś uruchomi duży raport, zobaczysz ten numer zbiornika do kilku sekund. Im więcej masz pamięci RAM, tym dłużej dane mogą być przechowywane w pamięci i tym mniej trzeba będzie czytać z dysków.

Na przykład systemy, z którymi obecnie pracuję, mają 256 GB pamięci RAM i przechowujemy dane w pamięci przez około 12000 sekund.

Proszę nie prosić o wybranie numeru docelowego, po prostu chcesz, aby liczba była jak najwyższa. Nie wiedząc dużo więcej o twoich systemach, nie mogę podać dobrej liczby, na którą można strzelać.

mrdenny
źródło
6

Hmmmm Cóż, 6 koncertów to niezła ilość pamięci RAM, nawet dla dużej instalacji MSSQL. Możesz naprawdę sprawdzić i upewnić się, że Twój kod jest naprawdę wydajny. Transakcja 6 gig jest trochę niezwykła ... Pracowałem nad ogólnopolskimi systemami płac, które nie przebiły koncertu pod koniec roku 1099 ... I żeby jeden działał często ? Nie wiem Z jakiego rodzaju danymi pracujesz?

To powiedziawszy, możesz włożyć tyle pamięci RAM, ile chcesz w 64-bitowym pudełku, a ram jest tani jak brud, więc równie dobrze możesz umieścić tam tyle, ile możesz ... Naprawdę nie mogę mieć zbyt dużo pamięci RAM serwer bazy danych.

Edycja: To jest teraz bardzo nieaktualne. Mam pudełka MSSQL z 256 gigabajtami pamięci RAM.

Satanicpuppy
źródło
1
Naprawdę nie może mieć zbyt dużo pamięci RAM na serwerze bazy danych. Być może nie, ale możesz mieć pamięć RAM, na którą zmarnowałeś pieniądze, ponieważ nie jest używana. Chociaż zgadzam się z ogólną ideą, że opłaca się być hojnym w stosunku do pudeł wykonujących określone rodzaje zadań, nie sądzę, że obejmuje to jedynie wrzucanie zasobów do systemu bez zrozumienia jego wymagań.
Rob Moir
2
@robert: To nie tak, że zalecam kupowanie serwera typu blade. Zwiększenie pamięci RAM na serwerze jest dość łatwe, a jeśli zabraknie pamięci, to dlaczego nie dodać więcej? Myślę, że problem prawdopodobnie tkwi w jego kodzie, ale jeśli możesz rozwiązać problem za pomocą pamięci RAM o wartości kilkuset dolarów, jest to wydajne wykorzystanie pieniędzy.
Satanicpuppy
1
@robert: Zgadzam się. Ale zbyt często widziałem, jak ludzie wydają tysiące na programistów i konsultantów, aby naprawić problem z oprogramowaniem, gdy rzucenie nieco więcej sprzętu spowoduje to samo za ułamek kosztów.
Satanicpuppy
1
6 koncertów to dobra konfiguracja pamięci SQL Server? Używałeś całkiem małych serwerów. Mam zainstalowane pudełka z 256 koncertami i mam przyjaciół z zainstalowanymi 512 koncertami. 6 koncertów to nic.
mrdenny
1
@mdmarra: Eh. Oczywiście w 2012 roku. W 2009? Nie tak bardzo.
Satanicpuppy
4

Zanim rzucisz się na zakup większej ilości pamięci (lub jakiegokolwiek innego komponentu), zaleciłbym przeprowadzenie analizy wydajności na serwerze. Możesz to zrobić samodzielnie za pomocą perfmon lub możesz skorzystać z narzędzi innych firm. Powinieneś przeanalizować wydajność zarówno systemu operacyjnego, jak i serwera SQL. IMHO, zbyt często jesteśmy gotowi rzucić sprzęt na problem, zanim zostanie przeprowadzona odpowiednia analiza. Z tego, co wiesz w tym momencie, może to być problem z zapytaniem, procedurą składowaną, planem wykonania, dyskowymi operacjami wejścia / wyjścia, wykorzystaniem procesora itp. Itp. Ciśnienie pamięci może często być objawem innego wąskiego gardła w systemie.

joeqwerty
źródło
1

jak powiedział „Satanicpuppy”, nie ma czegoś takiego jak zbyt dużo pamięci RAM, ale 6 GB powinno być w porządku, może powinieneś przemyśleć, co robi twój serwer, nie sądzę, że masz problem ze sprzętem, powinieneś skup się na programowaniu SQL ...

Remus Rigo
źródło
1

Jeśli chodzi o serwery baz danych, nie ma czegoś takiego jak „wystarczająca” pamięć. Oczywiście, zależy to od tego, co faktycznie robią i działają, ale jeśli jest to stale używana baza danych zawierająca dużo danych i wykonująca skomplikowane zapytania - 6 GB może być rażąco niewystarczające.

Zacznę od uaktualnienia jednego kłopotliwego serwera do co najmniej 32 lub 64 GB i zobaczę, czy to pomoże. Jeśli nie, przejdź do dostrajania bazy danych, rozwiązywania problemów z aplikacjami i debugowania - co wszystko, chyba że idiota zaprojektował bazę danych, kosztuje znacznie więcej niż kilka pamięci klasy serwerowej (a nawet jeśli idiota to zaprojektował, uzyskując nawet oczywisty projekt błędy naprawione przy zachowanym wsparciu mogą okazać się sporym wyzwaniem).

To powiedziawszy, jak ktoś inny stwierdził - może to być coś innego, co powstrzymywałoby go (oprócz problemów z projektowaniem oprogramowania), np. Brak wydajności dysku lub sieciowego wejścia / wyjścia - zatrudnienie DBA pro, aby przejść podstawowe monitorowanie wydajności SQL dla dzień może się przydać.

Oskar Duveborn
źródło
0

Powinieneś spojrzeć na budowanie większej liczby indeksów. Myślę, że generalnie większość osób zaniża indeks swoich baz danych.

To wciąż kod lotniczy, jeszcze nie przetestowałem go w pełni, ale powinien on poprowadzić Cię we właściwym kierunku

http://accessadp.com/2011/08/22/missing-indexes-great-script-for-determining-roi/

Select ‘create index IX_’ +
 sys.objects.name +
 isnull(replace(‘_’ + equality_columns, ‘,’, ‘_’), ”) +
 isnull(replace(‘_’ + inequality_columns, ‘,’, ‘_’), ”) + ‘ on ‘ +
 sys.objects.name +
 ‘(‘ +
 coalesce(equality_columns + ‘,’ + inequality_columns, equality_columns , inequality_columns ) +
 ‘) ‘ +
 isnull(‘ include (‘ + included_columns + ‘)’, ”)
 as CreateIndexSql,
 (CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.user_seeks)+CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.unique_compiles))*CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.avg_total_user_cost)*CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.avg_user_impact/100.0) AS Score,
 sys.schemas.schema_id,
 sys.schemas.name AS schema_name,
 sys.objects.object_id,
 sys.objects.name AS object_name,
 sys.objects.type,
 partitions.Rows, partitions.SizeMB,
 sys.dm_db_missing_index_details.equality_columns,
 sys.dm_db_missing_index_details.inequality_columns,
 sys.dm_db_missing_index_details.included_columns,
 sys.dm_db_missing_index_group_stats.unique_compiles,
 sys.dm_db_missing_index_group_stats.user_seeks, sys.dm_db_missing_index_group_stats.user_scans,
 sys.dm_db_missing_index_group_stats.avg_total_user_cost, sys.dm_db_missing_index_group_stats.avg_user_impact,
 sys.dm_db_missing_index_group_stats.last_user_seek, sys.dm_db_missing_index_group_stats.last_user_scan,
 sys.dm_db_missing_index_group_stats.system_seeks, sys.dm_db_missing_index_group_stats.system_scans,
 sys.dm_db_missing_index_group_stats.avg_total_system_cost, sys.dm_db_missing_index_group_stats.avg_system_impact,
 sys.dm_db_missing_index_group_stats.last_system_seek, sys.dm_db_missing_index_group_stats.last_system_scan
 FROM
 sys.objects
 JOIN (
 SELECT
 object_id, SUM(CASE WHEN index_id BETWEEN 0 AND 1 THEN row_count ELSE 0 END) AS Rows,
 CONVERT(numeric(19,3), CONVERT(numeric(19,3), SUM(in_row_reserved_page_count+lob_reserved_page_count+row_overflow_reserved_page_count))/CONVERT(numeric(19,3), 128)) AS SizeMB
 FROM sys.dm_db_partition_stats
 WHERE sys.dm_db_partition_stats.index_id BETWEEN 0 AND 1 –0=Heap; 1=Clustered; only 1 per table
 GROUP BY object_id
 ) AS partitions ON sys.objects.object_id=partitions.object_id
 JOIN sys.schemas ON sys.objects.schema_id=sys.schemas.schema_id
 JOIN sys.dm_db_missing_index_details ON sys.objects.object_id=sys.dm_db_missing_index_details.object_id
 JOIN sys.dm_db_missing_index_groups ON sys.dm_db_missing_index_details.index_handle=sys.dm_db_missing_index_groups.index_handle
 JOIN sys.dm_db_missing_index_group_stats ON sys.dm_db_missing_index_groups.index_group_handle=sys.dm_db_missing_index_group_stats.group_handle
 WHERE
 sys.dm_db_missing_index_details.database_id=DB_ID()
 AND (CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.user_seeks)+CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.unique_compiles))*CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.avg_total_user_cost)*CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.avg_user_impact/100.0) > 100
Aaron Kempf
źródło