web-dev-qa-db-fra.com

Combien RAM== Un serveur a-t-il besoin?

J'ai un mal de serveurs déployé dans le monde entier. Ils exécutent Windows 2003 X64 avec SQL Server 2005 X64 avec 6 Go de RAM. Les cases n'ont pas la meilleure configuration (ni même une configuration acceptable), car le gars qui leur a ordonné il y a des années ne savait pas vraiment ce qu'il faisait.

Les cases sont à l'essai assez systématiquement en mémoire, finissent par utiliser le fichier de pagination et tout ralentit. Généralement, la commission de validation est de 5,8 Go, puis lorsque quelqu'un doit faire quelque chose d'intensité (par exemple exécuter un rapport), ce nombre passe par le toit.

J'essaie d'obtenir les pouvoirs qui doivent commander plus de mémoire, mais je reçois une opposition massive (par exemple, rendre le logiciel plus performant, coûte trop cher pour tous ces serveurs ou prouver que la boîte n'a pas assez de mémoire, etc. ..).

Existe-t-il des lignes directrices (ou une formule) pour combien RAM une boîte a-t-elle besoin que je peux présenter aux non-techniciens, afin que nous puissions enfin commander plus de mémoire?

12
AngryHacker

Pas vraiment un moyen de dire facilement parce qu'il dépend entièrement de votre utilisation et de votre application. Vous maxingez un serveur de base de données ... Quelle est la taille de la base de données? Quelles sont vos statistiques de transaction?

Les limitations du monde réel sont évidentes dans votre scénario. Vous courez pendant un certain temps sur 6 concerts sans problème, puis ça échange et battez-vous. C'est 6 gigues ne suffit pas.

Si la performance est suffisante que cela a une incidence sur les affaires, votre UPS plus élevé devrait entendre suffisamment de plaintes qu'il est prudent de la mémoire. Déterminer ce que vos coûts de temps, puis déterminez combien il coûtera de "syntoniser" le serveur et résoudre le réglage, lorsque la mémoire ajoutée au serveur peut très bien résoudre le problème pour le coût de la mémoire et moins d'une demi-heure de temps d'arrêt.

Vous ne connaissez pas la quantité exacte de mémoire dont vous avez besoin jusqu'à ce que vous puissiez réellement déployer dans votre utilisation de la vie réelle et que vous travaillez à partir de là.

Cela dit, vous voudrez peut-être vérifier que votre application est vraiment le goulot d'étranglement. Exécutez le moniteur de performances Windows pour voir votre distinction d'E/S de disque et votre débit de réseau. Voyez ce que votre niveau de fragmentation est aussi ( Google est un bon ami ici ). Vous pouvez essayer d'audit le code pour des problèmes évidents aussi où une requête est massivement inefficace ( Google à nouvea ).

Mais encore une fois, tout dépend de la gravité de cela. Cela vaut-il plus de choses à investir dans le réglage, ou est-il suffisamment mauvais pour lancer d'abord du matériel, puis essayez-le de l'adapter?

9
Bart Silverstrim

Un moyen facile de voir si vous avez besoin de plus RAM==== Pour graphiser la page Espérance de vie Perfmon comptoir. Ce compteur vous indique la longue dure SQL Server pensera que les données seront conservées dans le pool tampon avant sa besoin faire de la place pour d'autres données. Vous voulez ce nombre aussi élevé que possible. Avec 6 concerts de RAM installé (vous devez disposer de SQL défini sur Max Out à probablement 4 gigs), vous ne serez probablement que Conservez des données en mémoire pendant quelques minutes au plus, lorsque quelqu'un exécute un grand rapport, vous verrez ce numéro de réservoir à quelques secondes. Plus RAM vous avez, les données plus longues peuvent Soyez maintenu en mémoire et moins la lecture des disques devra être effectuée.

Par exemple, les systèmes que je travaille pour le moment dispose de 256 concerts de RAM et nous gardons des données en mémoire pendant environ 12 000 secondes environ.

S'il vous plaît ne demandez pas un numéro cible à toucher, vous voulez juste que le nombre aussi élevé que possible. Sans en savoir plus sur vos systèmes, je ne peux pas donner un bon numéro à tirer dessus.

12
mrdenny

Hmmmm. Eh bien, 6 gigs sont une quantité décente de RAM, même pour une installation MSSQL Big MSSQL. Vous voudrez peut-être réellement regarder et vous assurer que votre code vraiment IS efficace. Une transaction de 6 giges est un peu inhabituelle ... J'ai travaillé sur des systèmes de paie à l'échelle de l'état qui ne topotez pas de concerts sur la fin de la fin de l'exercice 1099 ... et d'avoir une course à pied souvent? Je ne sais pas. Avec quel type de données travaillez-vous?

Cela étant dit, vous pouvez créer autant RAM comme vous le souhaitez dans une boîte de 64 bits et que Ram est trop bon marché, alors pourrait aussi bien mettre autant de là que vous pouvez éventuellement ... ne peut pas vraiment trop RAM sur un serveur de base de données.

EDIT: Ceci est sauvagement hors de jour maintenant. J'ai des boîtes MSSQL avec 256 concerts de RAM.

6
Satanicpuppy

Avant de sauter le pistolet sur l'achat de plus de mémoire (ou de tout autre composant), je vous recommanderais d'exécuter une analyse de performance sur le serveur. Vous pouvez le faire seule à l'aide de Perfmon ou vous pouvez consulter à l'aide d'outils tiers. Vous devez analyser les performances du serveur OS et SQL. IMHO, trop souvent, sommes-nous prêts à lancer du matériel à un problème avant qu'une analyse appropriée ait été effectuée. Pour tout ce que vous savez à ce stade, cela pourrait être un problème avec une requête, une procédure stockée, un plan d'exécution, une utilisation de disque, une utilisation de la CPU, etc., etc. La pression de la mémoire peut souvent être un symptôme d'un autre goulot d'étranglement dans le système.

4
joeqwerty

En ce qui concerne les serveurs de base de données, il n'y a pas de mémoire "assez". Bien sûr, cela dépend de ce qu'ils font et de courir, mais s'il s'agit d'une base de données constamment utilisée contenant de nombreuses données et de faire des requêtes compliquées - 6 Go pourrait facilement être grossièrement inadéquate.

Je commencerais par mettre à niveau un serveur gênant à au moins 32 ou 64 Go et voir si cela aide. Sinon, tournez vers le réglage de la base de données, le dépannage de l'application et le débogage - que tous, à moins d'une idiot conçus la base de données, coûtent beaucoup plus que quelques bâtons de mémoire de qualité serveur (et même si un idiot a conçu le design évident Les erreurs corrigées avec le support conservé pourraient prouver tout un défi).

Cela dit, comme quelqu'un l'a dit - cela pourrait être quelque chose d'autre le retenir (en dehors des problèmes de conception logiciels), comme un manque de performance de disque ou d'E/S de réseau - embaucher un DBA Pro pour simplement passer à travers la surveillance de la performance SQL de base pour un la journée pourrait s'avérer utile.

1
Oskar Duveborn

comme "Satanicpuppy", il n'y a pas de telle de bélier, mais 6 Go devrait être correct, vous devriez peut-être repenser sur ce que votre serveur fait, je ne pense pas que vous avez un problème "matériel", vous devriez devoir Concentrez-vous sur votre programmation SQL ...

1
Remus Rigo

Vous devriez regarder construire plus d'index. Je pense que, en général, la plupart des gens sous-indice leur base de données.

Il s'agit toujours d'un code aérien, je n'ai pas encore complètement testé, mais cela devrait vous mettre dans la bonne direction

http://accessadp.com/2011/08/22/missing-indexes-great-script-for-Determining-Rerr/

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
0
Aaron Kempf