Nous avons commencé à rencontrer un problème concernant l'actualisation de notre modèle tabulaire SSAS.
Le modèle tabulaire SSAS comprend 38 tableaux.
Ce processus fonctionne sans problème depuis plus d'un an, mais depuis environ un mois maintenant, nous n'avons pas pu traiter avec succès les tables dans le modèle.
Si j'accède à la base de données SSAS> Clic droit> Base de données de processus> Sélectionnez le mode pour traiter les valeurs par défaut, puis OK, c'est à ce moment que le problème se produit.
Il restera là pendant environ 5 minutes avant d'échouer avec le message d'erreur:
Échec de l'enregistrement des modifications sur le serveur. Erreur renvoyée: "Il n'y a pas assez de mémoire pour terminer cette opération. Veuillez réessayer plus tard lorsqu'il y aura peut-être plus de mémoire disponible.
Si j'essaie de "traiter" les tables individuellement, je reçois également le même message d'erreur.
J'ai examiné les paramètres de mémoire pour SSAS, dans la fenêtre avancée et j'ai réinitialisé les valeurs à leurs valeurs par défaut. Ainsi, les valeurs clés (comme je le sais) sont actuellement:
Le serveur a été redémarré plusieurs fois, nous avons toujours le même problème.
Détails de l'environnement:
Centre de données Windows Server 2016
SQL Server 2017 (RTM-CU9-GDR) (KB4293805) - 14.0.3035.2 (X64)
Version SSAS: 14.0.223.1
Mode serveur: tabulaire
Mémoire du serveur: 64 Go
Mémoire affectée à SQL Server: 28 Go
J'ai préparé plusieurs articles en ligne concernant ces types de problèmes, mais rien ne semble pertinent/utile jusqu'à présent.
Toute orientation/assistance serait grandement appréciée.
Avertissement: je ne suis pas un gars BI/SSAS. Je suis juste un DBA à qui ce problème a été demandé, alors pardonnez-moi si je ne l'explique pas correctement.
TL/DR: Ajoutez plus de mémoire, réduisez la taille de vos modèles et/ou déplacez SQL Server Services ou SQL Server Analysis Services vers un autre serveur (par ex. évolutif)
Explication plus longue: Nous avons suivi cet exercice il y a quelques mois avec notre serveur de production Tabular SSAS, et avons en fait contacté Microsoft pour des recommandations "formelles" comme notre L'équipe d'infrastructure était avare de RAM (ce que je peux comprendre car ce n'est pas exactement pas cher). Par souci de clarté, l'erreur que nous avons rencontrée était la suivante:
L'opération a été annulée car la mémoire disponible pour l'application est insuffisante. Si vous utilisez une version 32 bits du produit, envisagez de passer à la version 64 bits ou d'augmenter la quantité de mémoire disponible sur la machine.
Notre serveur était initialement configuré avec 64 Go de mémoire et hébergeait 2 modèles SSAS totalisant 40 Go. Aucun autre service SQL Server n'a été hébergé sur cette machine. Certains jours, nos modèles traiteraient sans problème, mais la plupart du temps, ils échoueraient. Nous redémarrerions le serveur et alors peut-être qu'ils réussiraient ... si le vent était juste et les étoiles et les planètes toutes alignées.
Contrairement aux modèles multidimensionnels (MOLAP/ROLAP/HOLAP), les modèles tabulaires par défaut sont chargés entièrement en mémoire lorsqu'ils exploitent technologie In-Memory . Si les modèles ne peuvent pas être chargés entièrement en mémoire, vous rencontrez des problèmes.
Malheureusement, la documentation de Microsoft décompose sur ce que sont les "recommandations de mémoire" car je ne trouve aucun document formel fournissant autre chose que des niveaux "minimum" qui sont nécessaires pour simplement exécuter le service. D'après le ticket d'assistance que nous avons déposé, les recommandations de Microsoft étaient les suivantes:
Pour un modèle de taille X, provision entre 2X - 10X RAM sur le serveur SSAS à utiliser par le service SSAS, qui est en outre influencé par les facteurs suivants:
- Le traitement du cube nécessite 2X - 3X RAM pour un traitement complet qui inclut un cliché instantané du modèle dans la mémoire intégrée.
- Le nombre d'utilisateurs/rapports connectés au cube augmente également RAM exigences, parfois jusqu'à 10X selon le nombre de rapports, le volume, etc. car les utilisateurs/rapports peuvent générer des requêtes DAX qui effectuent le calcul ou matérialisation de la mémoire (qui fait que le moteur génère un résultat intermédiaire non compressé et peut entraîner une consommation de mémoire plus élevée que prévu).
- Le nombre de modèles en cours de traitement peut également augmenter l'empreinte mémoire requise.
- Activez VertiPaqPagingPolicy si le paramètre est désactivé, afin que SSAS puisse utiliser le fichier d'échange du système d'exploitation pour de la mémoire supplémentaire au détriment des performances de traitement et de requête.
Ce que nous avons fini par faire était d'augmenter la quantité de RAM sur notre serveur, ce qui a finalement résolu nos problèmes pour le moment. La seule autre véritable "solution" alternative est de limiter la quantité de données que vous besoin dans votre (vos) modèle (s) ou évoluer (par exemple déplacer des services vers un autre serveur) votre déploiement sur d'autres serveurs.
Ce que je pense qu'il se passe dans votre cas, c'est que votre service SSAS manque de mémoire car votre service SQL Server est également hébergé sur le même serveur. Fondamentalement, vous devez séparer ces services les uns des autres ou avoir suffisamment RAM sur le serveur pour les laisser fonctionner en parallèle. Je suggère fortement de séparer vos services SSAS sur un serveur différent si possible, mais les problèmes de licence peuvent avoir un impact, assurez-vous donc d'avoir suffisamment de RAM.
Vous pouvez également manipuler les paramètres de configuration situés dans le fichier msmdsrv.ini, mais pour notre scénario, nous n'avons pas eu beaucoup de succès avec ceux-ci, ce qui fait des différences significatives dans le résultat final de l'épuisement. de la mémoire.
J'ai eu un problème similaire et jusqu'à ce que nous commencions à utiliser Azure Analysis Services, j'ai dû trouver un moyen de contourner l'édition standard SSAS qui ne peut allouer que 16 Go de mémoire, que votre serveur sur site dispose de 64 Go de mémoire.
Si vous utilisez Enterprise Edition, je suggère d'examiner la création de partitions dans les tables de votre modèle de données et seuls les enregistrements d'actualisation ont été mis à jour récemment. Sinon, si vous utilisez l'édition standard, actualisez votre modèle en 2 parties ou plus. Par exemple, mettez 19 tables dans un seul travail, selon la taille de vos tables. Essayez de l'équilibrer.
{
"refresh": {
"type": "full",
"objects": [
{
"database":"AdventureWorks",
"table":"A"
}
,
{
"database":"AdventureWorks",
"table":"B"
}
,
{
"database":"AdventureWorks",
"table":"C"
}
,
{
"database":"AdventureWorks",
"table":"D"
}
,
{
"database":"AdventureWorks",
"table":"E"
}
,
....
]
}
}
Je pense qu'une meilleure solution sera d'utiliser l'un de ces plans S sur Azure en fonction de la taille de votre modèle de données, puis d'utiliser des partitions de table.