Question De combien de RAM un serveur a-t-il réellement besoin?


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

Les boîtes manquent assez souvent de mémoire, finissent par utiliser le fichier d'échange et tout ralentit. En règle générale, les frais de validation sont de 5,8 Go, puis, lorsque quelqu'un doit faire quelque chose d'intensif (par exemple, générer un rapport), ce nombre augmente.

J'ai essayé d'obtenir plus d'énergie de la part des puissances, mais je rencontre une opposition massive (par exemple, rendre le logiciel plus performant, coûter trop cher pour tous ces serveurs, ou prouver que la boîte n'a pas assez de mémoire, etc.). ..).

Existe-t-il des directives (ou une formule) concernant la quantité de RAM requise par une boîte que je peux présenter aux non-techniciens, afin que nous puissions enfin commander plus de mémoire?


10
2017-10-23 21:27


origine


Le système est-il développé en interne? - Oskar Duveborn
@ Skar. Oui, je suis le développeur et le code est optimisé à fond. Il y a simplement une tonne de données. - AngryHacker
Puis voir ma réponse. C'est le genre de chose dans laquelle je me spécialise. - mrdenny


Réponses:


Pas vraiment un moyen de dire facilement parce que cela dépend entièrement de votre utilisation et de l'application. Vous maximisez un serveur de base de données ... quelle est la taille de la base de données? Quelles sont vos statistiques de transaction?

Les limites du monde réel sont évidentes dans votre scénario. Vous jouez pendant 6 concerts sans problème, puis vous échangez et vous battez. 6 concerts ne suffisent donc pas.

Si les performances sont suffisantes pour avoir un impact sur les affaires, vos supérieurs hiérarchiques devraient entendre suffisamment de plaintes pour qu'il soit prudent d'augmenter la mémoire. Déterminez le coût de votre temps, puis combien il en coûtera pour "régler" 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 du coût de la mémoire et moins d'une demi-heure de travail. temps d'arrêt.

Vous ne saurez pas exactement combien de mémoire vous avez besoin avant de déployer votre utilisation réelle et de travailler à partir de là.

Cela dit, vous voudrez peut-être vérifier que votre application est vraiment le goulot d'étranglement. Exécutez l’analyseur de performances Windows pour consulter les statistiques d’entrées / sorties de disque et le débit du réseau. Voyez quel est votre niveau de fragmentation (Google est un bon ami ici). Vous pouvez également vérifier le code pour des problèmes évidents où une requête est massivement inefficace (Google à nouveau).

Mais encore une fois, tout dépend de l'impact que cela aura sur l'entreprise. Vaut-il plus la peine d’investir dans le réglage, ou est-il suffisant de lancer le matériel d’abord puis de l’accorder?


9
2017-10-23 21:58



+1 taille et statistiques nécessaires - Oskar Duveborn


Un moyen facile de voir si vous avez besoin de plus de RAM consiste à tracer le compteur de performances Page Life Espérance. Ce compteur indique la durée pendant laquelle SQL Server pense que les données seront conservées dans le pool de mémoire tampon avant de devoir laisser de la place à d'autres données. Vous voulez ce nombre aussi élevé que possible. Avec 6 Go de RAM installés (vous devriez avoir le code SQL réglé au maximum à probablement 4 Go), vous ne conserverez probablement les données en mémoire que pendant quelques minutes au maximum. Lorsque quelqu'un génère un rapport volumineux, ce réservoir de numéros s'affiche. à quelques secondes. Plus vous avez de RAM, plus les données peuvent être conservées longtemps en mémoire et moins il faudra lire les disques.

Par exemple, les systèmes sur lesquels je travaille en ce moment ont 256 Go de RAM et nous conservons les données en mémoire pendant environ 12 000 secondes.

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


11
2017-08-26 17:27





Hmmmm. Eh bien, 6 Go sont une quantité décente de RAM, même pour une grosse installation MSSQL. Vous voudrez peut-être regarder et vous assurer que votre code est vraiment efficace. Une transaction de 6 Go est un peu inhabituel ... J'ai travaillé sur des systèmes de paie à l'échelle de l'État qui ne dépassaient pas un concert au traitement de fin d'année 1099 ... Et en avoir un en cours d'exécution souvent? Je ne sais pas. Avec quel type de données travaillez-vous?

Cela étant dit, vous pouvez stocker autant de RAM que vous le souhaitez dans une boîte 64 bits, et le ram est très peu coûteux, vous pouvez donc en mettre autant que vous le pouvez ... Vous ne pouvez pas vraiment avoir trop de RAM sur un serveur de base de données.

Edit: Ceci est complètement obsolète. J'ai des boîtes MSSQL avec 256 Go de RAM.


6
2017-10-23 21:37



Vous ne pouvez pas vraiment avoir trop de RAM sur un serveur de base de données. Peut-être pas, mais vous pouvez avoir de la RAM sur laquelle vous avez gaspillé de l'argent parce que vous ne l'utilisez pas. Bien que je sois d’accord avec l’idée générale selon laquelle il est rentable d’être généreux pour certaines tâches, je ne pense pas que cela se limite à injecter des ressources dans un système sans en comprendre les exigences. - Rob Moir
@ Robert: Ce n'est pas comme si je préconisais l'achat d'un serveur lame. Il est assez facile de maximiser la RAM sur un serveur, et si vous manquez de mémoire, pourquoi ne pas en ajouter plus? Je pense que le problème réside probablement dans son code, mais si vous pouvez résoudre le problème avec quelques centaines de dollars de RAM, c'est une utilisation efficace de l'argent. - Satanicpuppy
@ Robert: Je suis d'accord. Mais j'ai trop souvent vu des gens dépenser des milliers de dollars en codeurs et en consultants pour résoudre un problème de logiciel, mais lancer un peu plus de matériel informatique ferait la même chose pour une fraction du coût. - Satanicpuppy
6 Go est une bonne taille de configuration de la mémoire SQL Server? Vous utilisez de très petits serveurs. J'ai des boîtes avec 256 Go installés et des amis avec 512 Go installés. 6 concerts n'est rien. - mrdenny
@mdmarra: Eh. En 2012, bien sûr. En 2009? Pas tellement. - Satanicpuppy


Avant de vous lancer dans l'achat de plus de mémoire (ou de tout autre composant), je vous recommande d'exécuter une analyse des performances sur le serveur. Vous pouvez le faire vous-même en utilisant perfmon ou en utilisant des outils tiers. Vous devez analyser les performances du système d'exploitation et du serveur SQL. IMHO, nous sommes trop souvent prêts à lancer du matériel sur un problème avant qu'une analyse appropriée ait été effectuée. Tout ce que vous savez à ce stade-ci peut poser problème: requête, procédure stockée, plan d'exécution, entrée / sortie disque, utilisation de l'unité centrale, etc. La pression sur la mémoire peut souvent être le symptôme d'un autre goulot d'étranglement dans le système.


4
2017-10-23 22:08





comme dit "Satanicpuppy", il n’existe pas trop de RAM, mais 6 Go devraient suffire, peut-être devriez-vous repenser à ce que votre serveur fait, je ne pense pas que vous ayez un problème de "matériel", vous devriez concentrez-vous sur votre programmation SQL ...


1
2017-10-23 21:54





En ce qui concerne les serveurs de base de données, il n’existe pas de mémoire "suffisante". Bien sûr, cela dépend de ce qu’ils font et exécutent, mais s’il s’agit d’une base de données constamment utilisée, qui contient beaucoup de données et qui effectue des requêtes compliquées, 6 Go pourraient facilement être totalement inadéquats.

Je commencerais par mettre à niveau un serveur gênant vers au moins 32 ou 64 Go et de voir si cela aiderait. Si ce n'est pas le cas, tournez-vous vers le réglage de la base de données, le dépannage des applications et le débogage - qui, à moins qu'un idiot ait conçu la base de données, coûtent beaucoup plus que quelques bâtons de mémoire de niveau serveur (et même si un idiot a conçu la chose, il est même évident les erreurs corrigées avec le support retenu pourraient s'avérer un défi).

Cela dit, comme quelqu'un l'a dit - cela pourrait être quelque chose d'autre qui le retient (hormis des problèmes de conception de logiciel), comme un manque de performances d'E / S disque ou réseau - l'embauche d'un DBA pro pour simplement contrôler les performances SQL de base jour pourrait être utile.


1
2018-02-18 18:15





Vous devriez envisager de créer plus d'index. Je pense qu'en général, la plupart des gens sous-indexent leur base de données.

Ceci est toujours le code de l'air, 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-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

0
2017-08-26 17:01