SQL : taille d'unité d'allocation 4KB vs 64KB

Je suis en milieu d’implantation d'un système Dynamics AX 2012 R3 pour un de nos clients. On m’a récemment remis une machine virtuelle pour le serveur SQL. Lorsque je reçois un serveur SQL, je vérifie toujours la configuration des disques et j’effectue des tests de performances. 

Je m’aperçois que les disques sont configuré avec des blocs de 4KB. Il est clair que Microsoft recommande de formater les disques en 64KB pour des raisons de performance.



Avant d’envoyer un email à mon client afin de lui dire que les disques doivent être configuré avec des blocs de 64KB, je décide de faire des tests de performance afin de démontrer qu’il y a un gain de performance entre 4KB et 64KB.

À ma grande surprise, les tests indiquent AUCUN gain de performances. Voici mes tests :

64K = Lecture de blob de 64KB
1T, 4T, 8T = Nombre de thread
O32 = Queue Depth de 32
W0, W25 = Pourcentage en ecriture

Lors de mes tests, je désactive la cache logicielle et matérielle. La lecture et écriture est faite de façon aléatoires (non séquentielles)


Voici le tableau des résultats :


Disque avec taille d'unité d'allocation de 4KB


Disque avec taille d'unité d'allocation de 64KB



Je m’attendais à voir plus d'IOPs et une latence moins élever pour le disque configuré avec des blocs de 64 KB. Tout simplement parce que je me disais qu'il est plus rapide de lire 64 KB d'information lorsque le système doit lire seulement un bloc 64 KB. En revanche, lire 64 KB d’information lorsque le disque est formatter avec des blocs de 4 KB requiert la lecture de 16 blocs au disque, donc plus d'opérations physiques (mouvement des têtes) et par conséquent une plus longue latence.

Donc, pourquoi les chiffres ne démontrent aucune différence entre 4 KB et 64 KB ? J’en suis venu à la conclusion logique que les performances sont les mêmes puisque c'est un disque virtuel. Le disque est placer dans un VMFS formatter avec des blocs de 1 MB. Donc, il y a très peu d'impact au niveau des disques physiques.

Ainsi, j'imagine que les performances sont meilleurs seulement lorsque les disques sont RAW.

Toutefois. ma question est : Pourquoi Microsoft recommande de formatter les disques en 64 KB pour SQL même sur les machines virtuelles ? Surement parce que ça ne fait pas de mal.

SQL : DBCC CHECKDB last execution

Voici une requête que j'aime bien utiliser afin de savoir la dernière exécution de DBCC CHECKDBD pour chaque base de données

DECLARE @name VARCHAR(256)

CREATE TABLE #dbinfo
(ParentObject varchar(100),
Object varchar(100),
Field varchar(100),
Value varchar(100))

CREATE TABLE #dbinforesults
(dbname varchar(256),
LastRanDate datetime,
Status varchar(100),
DataPurityCheckEnabled varchar(3))

DECLARE db_cursor CURSOR FOR
SELECT name FROM sys.databases
WHERE state_desc='ONLINE'

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN

INSERT INTO #dbinfo
EXEC('DBCC DBINFO (['+@name+']) WITH TABLERESULTS')

INSERT INTO #dbinforesults (dbname, LastRanDate, Status)
(SELECT DISTINCT @name as dbname, Value as LastRanDate,
CASE
WHEN Value = '1900-01-01 00:00:00.000' THEN CONVERT(nvarchar (50),'BAD! DBCC CHECKDB Never Executed')
WHEN DATEDIFF(d, Value, GETDATE()) > 14 THEN CONVERT(nvarchar (50),'BAD! DBCC CHECKDB last execution more than 14 days ago')
ELSE CONVERT(nvarchar(50),'OK! DBCC CHECKDB last execution less than 14 days ago')
END AS Status
FROM #dbinfo
WHERE Field='dbi_dbccLastKnownGood')

UPDATE #dbinforesults SET DataPurityCheckEnabled=(SELECT
CASE
WHEN @name='master' OR @name='model' THEN 'N/A'
WHEN Value=0 THEN 'No'
WHEN Value=2 THEN 'Yes'
END as DataPurityEnabled
FROM #dbinfo
WHERE Field='dbi_dbccFlags')
WHERE dbname=@name

TRUNCATE TABLE #dbinfo

FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor

DROP TABLE #dbinfo
SELECT
dbname AS [Database Name],
LastRanDate AS [Last execution date],
Status AS [Comments],
DataPurityCheckEnabled AS [Data Purity Check Enabled]
FROM #dbinforesults
DROP TABLE #dbinforesults

Résultats



Dynamics AX 2012 : aos.config does not exist

Lors de la modification d'un port AIF dans Dynamics AX, la configuration est aussi sauvegardée localement. Vous pouvez y trouver le fichier de configuration dans le dossier ci-dessous:

C:\Program Files\Microsoft Dynamics AX\60\Server\MicrosoftDynamicsAX\Bin\XppIL\AppShare\ServiceGeneration

Ceci ne cause généralement pas de problème dans un environnement avec un seul serveur AOS. 

Il en est autrement dans un environnement multi-aos. Lors de l'activation du port, le fichier de configuration est généré localement sur le serveur AOS utiliser pour configurer le port AOS.

Ainsi, le message d'erreur suivant survient lorsqu'un autre serveur AOS tente d'utiliser le port

The specified configuration file does not exist: C:\Program Files\Microsoft Dynamics AX\60\Server\MicrosoftDynamicsAX\Bin\XppIL\AppShare\ServiceGeneration\PORTNAME\aos.config 

Pour corriger le problème, il suffit de redémarrer le serveur AOS afin que le fichier de configuration soit créé localement, ou de désactiver/activer le port en s'assurant d'être connecter sur le serveur AOS qui ne possède pas le fichier, ou de copier/coller les fichiers d'un serveur AOS qui possède la dernière version vers celui qui n'a pas été mis à jour.

Dynamics AX 2012 : Unable to write the generated WCF configuration to local storage

Voici le message d’erreur que j’ai trouvé sur mon serveur SSRS:

Unable to write the generated WCF configuration to local storage. The generated WCF configuration will be used from memory. The contents of the new configuration are written to the following temp file C:\Users\bcpxy\AppData\Local\Temp\Microsoft.Dynamics.AX.Framework.Services.Client.Configuration.ClientConfigurationInternal.log

Exception datils:
System.ComponentModel.Win32Exception: Access is denied

Pour une raison quelconque, le compte bcproxy essais de mettre à jour la configuration WCF locale. Dans ce cas-ci, la configuration est sauvegardée dans la base de register. Si vos desirers conservés la configuration dans la base de registres, il suffit de donner les droits full control au compte BCPROXY sur la clé de registre qui contient la configuration active.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Dynamics\6.0\Configuration\Original (installed configuration)


Malheureusement, je ne sais pas ce qui déclenche une mise à jour local de la configuration WCF. Un rapport peut-être ?

Azure : Désactiver AD Connect Sync

Dans mon laboratoire Azure, j’avais configuré AD Connect afin de synchroniser mes utilisateurs entre Windows Active directory et Azure Active directory.

J’ai éventuellement supprimé mon contrôleur de domaine sans avoir préalablement désactivé la synchronisation. Par conséquent, j'ai commencé à recevoir des notifications comme quoi la synchronisation ne fonctionnait plus.



Comment désactiver la synchronisation si je n’ai plus access à l’outil AD Connect ?

Tout d’abord, vous devez télécharger et installer Azure Active Directory Module for Windows PowerShell. 

Ensuite, vous devez vous connecter à Azure

$msolcred = get-credential
connect-msolservice -credential $msolcred

Note: Vous devez utiliser un compte cloud (exemple: admin@mtessier.onmicrosoft.com). Vous ne pouvez pas utiliser un compte LiveID ou un compte qui provident de Windows Active Directory.

Ensuite, désactiver la synchronisation:

Set-MsolDirSyncEnabled –EnableDirSync $false

Vous pouvez vérifier le status de la synchronisation

(Get-MSOLCompanyInformation).DirectorySynchronizationEnabled

Le processus peut prendre jusqu'à 72 heures tout dependant du nombre d'objets.

Dynamics AX 2012 : Method 'add' in COM object of class 'Documents' returned error

Message d’erreur lors de l’utilisation du Task Recorder avec Microsoft Dynamics AX 2012 R3 et Microsoft Office 2010:

Method 'add' in COM object of class 'Documents' returned error code 0x800A175D (unknown) which means: unknown



Pour corriger l’erreur, il suffit d’ouvrir Microsoft Word et de suivre les étapes suivantes: File > Options > Trust Center > Trust Center Settings > Protected View et désactiver Enable Protected View for files originating from the Internet.


Ensuite, l’erreur suivante est apparu:

Method 'add' in COM object of class 'Documents' returned error code 0x800A1436 (unknown) which means: Sorry, we couldn’t find your file. Is it possible it was moved, renamed or deleted ?


Dans ce cas-ci, assurez-vous d’avoir access au dossier specifier dans les paramètres



Dynamics AX : Crash and Hang Analysis

Je voulais créer un billet pour mettre en lien deux articles au sujet des crashs d’un serveur AOS. Le premier article est au sujet de l’outil Crash and Hangs Analysis qui se trouve sur le portail LCS. L'outil est bien expliqué dans le blog suivant: Crash and Hang analysis on LCS.

Le deuxième article explique comment collecter le dump: AOS crash, hang or memory leak debugging tools.

Il y a plusieurs exemples selon le problème que vous avez: AOS crashes, AOS Hangs et AOS Memory Leaks.

Prenez note que l’auteur utilise procdump.exe, il est fort probable que vous devez utiliser procdump64.exe si vous utiliser AX 2009 ou 2012.

Dynamics AX - Haute disponibilité (Part 3)

Dynamics AX est une solution mature qui vit dans une infrastructure complexe. Il est important de comprendre le rôle de chaque composant et de connaître son importance ou non au sein de l'entreprise. Par exemple, le système d'intégration peut être critique pour une entreprise et moins critique pour une autre. Même chose avec SharePoint et Enterprise Portal, plusieurs entreprises utilisent Enterprise Portal uniquement pour les Roles Center, il n’est peut-être pas nécessaire d'avoir une redondance au niveau des serveurs SharePoint dans ce cas.

Cluster

Un cluster est un groupe de ressource ayant le même but. Les membres d'un cluster se connaissent et partagent leur état. Dans certains cas, les membres d'un cluster se partagent des ressources, généralement le stockage. C'est une technologie couramment utiliser dans le domaine des technologies.

Load Balancing

C'est aussi un groupe de serveur, mais ils sont indépendants et n'échangent pas d'information sur leur état. Le trafic est généralement balancé entre les serveurs. On retrouve souvent cette technlogies avec les services Web, mais il est aussi utilisé dans d'autres contextes.

Solutions

Network - NIC

Network - Switches

Network - Firewall

Dynamics AX - AOS Servers

Dynamics AX - Document Management

Management Reporter
  • Aucune solution HA pour les services Application et Process

SharePoint

Dynamics AX - Haute disponibilité (Part 2)

Dynamics AX - Accord de niveau de service

La disponibilité est toujours un enjeu important des infrastructures Dynamics AX. Avant de pouvoir commencer la planification, il est important d'obtenir l'objectif de disponibilité. Celle-ci est souvent définie par les dirigeants d'entreprises et non par l'équipe des technologies de l'information. Certaines entreprises ont un ou plusieurs SLA internes, il suffit de voir si Dynamics AX peut s'attacher à l'une d'elles. Certaines petites entreprises doivent aller faire leur devoir et déterminer l'objectif de disponibilité. Dans ce cas, il est important de penser au scénario le plus critique pour l'entreprise: l'intégration avec un autre système, la fin de l'année fiscale, la production de produit en saison haute, etc.

Dynamics AX - Maintenance

Certains types d'opération nécessite la planification d'un arrêt d’un ou plusieurs services ou du système en entier. Par exemple, l'importation du code nécessite un redémarrage des services AOS. La reconstruction des index rend la table non disponible pour certaines opérations. Ainsi, il faut aussi tenir compte de cet aspect lors de la planification de la haute disponibilité.

Haute disponibilité, c'est plus que Dynamics AX ! 

Ensuite vient l'évaluation de l'infrastructure existante puisque'il n'y a pas seulement les composants AX qui entrent en jeu ! J'ai fait un petit tableau qui démontre tous les composants inclus dans une architecture Dynamics AX.  Il est important de prendre en considération toute l'infrastructure afin de ne pas avoir un point de défaillance unique.



Dynamics AX : Haute disponibilité (Part 1)

Qu'est-ce qu'un système hautement disponible ?

Les systèmes configurés afin d'offrir une disponibilité presque en tout temps se nomment système hautement disponible. Ces systèmes offrent un taux de disponibilité élevé généralement en se basant sur de la redondance matérielle et applicative. Un système hautement disponible bien configuré n'a pas de point individuel de défaillance (single point of failure). Entre d'autres mots, chaque composant matériel ou applicatif est redondant.

Lorsqu'une panne survient, un basculement des ressources est automatiquement démarré et le système continue d'être opérationnel. Plus le processus est transparent pour les utilisateurs, meilleur est le système de haute disponibilité.

Planification

Lors de la planification de l'architecture d'un système Dynamics AX, il est important de planifier la redondance des serveurs. Il y a deux façons de planifier la haute disponibilité du système:
  • Mettre en place un système de redondance pour chaque composant.
  • Protéger le système contre les multitudes de pannes possibles.

Dans ce billet, je met l'accent sur la mise en place du système de redondance pour chaque composant.

Mesurabilité

De façon générale, les entreprises utilisent les deux unités de mesure suivante:

  • The mean time to recovery (MTTR) - temps moyen jusqu’à la remise en route.
  • La disponibilité mesurée en pourcentage.

Dans le premier cas, si vous avez un seul serveur AOS et que celui-ci tombe en panne, combien de temps en moyenne vous faudra-t-il afin de remettre le service en route ? Et si le serveur AOS ne démarrait plus et que vous deviez effectuer une restauration ou une nouvelle installation ? Est-ce acceptable pour l'entreprise ?

Dans le deuxième cas, la disponibilité est mesurée en pourcentage. Par exemple, 99.99% veut dire que le système doit être disponible 99.99% du temps pour une période précise, une année par exemple. Dans cet exemple, le système ne sera pas disponible pendant 52 minutes dans une année incluant les pannes planifiées et non planifiées.



Type de panne

Une panne peut être planifiée ou non planifiée. Les pannes non planifiées peuvent être causées par plusieurs facteurs. Par exemple, panne matérielle, panne logicielle, panne électrique, erreur humaine, etc. Les pannes non planifiées perturbent système parce qu'elles sont difficiles à prédire.

Une panne planifiée peut aussi perturber le système, mais elles sont de façon générale plus facile à prévoir et gérer. Les pannes planifiées comprennent la maintenance, les mises à jour du système, les mises à jour du code, etc.

Tolérance aux pannes vs Haute Disponibilité

Lorsqu'un système hautement disponible tombe en panne, le système peut devenir non disponible pour quelques secondes ou minutes. Par exemple, lors d'une panne matérielle sur un host VMware, vSphere détecte la panne et redémarre les machines virtuelles sur un host différent. Le temps du démarrage, le système sera non disponible pour quelques secondes.

Tolérance aux pannes (Fault Tolerance) est un système qui est insensible aux pannes. Pour ce faire, la solution utilise une technologie qui réplique la machine entière incluant la mémoire vive. Par exemple, Fault Tolerance (FT) de VMware.

Ce billet met l'accent uniquement sur des technologies de haute disponibilité.

Dynamics AX 2012 : DIXF Data Lookup ne fonctionne pas

Lors de l'utilisation de DIEF dans un environnement AX 2012 R3, l'utilisateur n'était pas capable de générer le fichier source (generate source file). La fonction data lookup ne fonctionnait tout simplement pas.

La machine utilisée était un system All-in-One Windows 2012 R2 + Office 2010 32 bits + SQL 2014 + AOS + DIXF. C'est ça le problème. SSIS DIXF component requiert les driver 64 bits pour Excel.


Il est possible d'installer les driver 64-bits en téléchargeant Microsoft Access Database Engine 2010 Redistributable. Toutefois, puisque Office 32-bit est installé, il est important d'utiliser le paramètre /passive lors de l'installation:

AccessDatabaseEngine_X64.exe /passive




Suite à l'installation, vous allez remarquer que DIEF est maintenant fonctionnel. Toutefois, vous aller réaliser qu'Excel n'est plus dans son état normal, le message d'erreur suivant s'affiche lors de l'ouverture:

One of your object libraries (|) is missing or damaged. Please run Setup to install it.


En effet, l'installation de Microsoft Access Database Engine 64 bits n'est pas compatible avec Office 2012 32 bits comme indiquer dans ce lien.

La bonne nouvelle c'est qu'il existe un truc afin d'avoir Microsoft Access Database Engine 64-bits et Office 32 bits entièrement fonctionnels. Il suffit de supprimer la valeur mso dll dans la clef suivante: 
HKLM\SOFTWARE\Microsoft\Office\14.0\Common\FilesPaths


ATTENTION: avant de faire les modifications ci-haut, il est important de comprendre que les driver 64-bit sont nécessaire sur le serveur SSIS. Demandez-vous pourquoi vous avez besoin d'Office 2010 32 bits sur votre serveur SSIS? Comme dans ce cas-ci, c'est une machine de développement qui comprend tous les components AX ainsi que le client Excel. Toutefois, je conseillerais tout simplement d'utiliser un autre serveur SSIS pour DIXF au lieu de mettre en place une configuration non supporté.

Dynamics AX 2012 : AppFabric Server caching features

Lors de la configuration de mon cluster AppFabric pour Entreprise Portal, j'ai réalisé que tous les services distribution cache étaient éteints. Le journal d'événement me connaît le message d'erreur suivant:

The High Availability feature of AppFabric Server caching features requires all nodes in the cache cluster to be running Windows Server Enterprise Edition or higher.



J'ai effectué mon installation sur des serveurs Windows 2012 R2. La version Entreprise n'existe pas avec Windows 2012. 

Ce problème a ete corriger avec CU4 pour App Fabric 1.1.

Je vous conseille d'installer la plus récente version du CU pour App Fabric. À ce jour, la version Cu7 est disponible ici: https://support.microsoft.com/en-us/kb/3092423.




Dynamics AX 2012 : CU10 + Reporting Extensions

Le deployment des rapports s’interrompt après quelques minutes avec le message d’erreur suivant:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below

Dans mon cas, le problème est arrivé suite à l’installation de CU10 pour Dynamics AX 2012 R3. Il y a un hotfix pour corriger ce problème.



Management Reporter : Troubleshooting

Voici deux requêtes SQL qui vous aideront à diagnostiquer des problèmes avec Management Reporter. La première requête retourne le status des tâches et la deuxième requête retourne les logs.

Tâches

SELECT CIG.[Description] 
, T.Name
, CASE TS.StateType
WHEN 3 THEN 'PROCESSING'
WHEN 5 THEN 'COMPLETE'
WHEN 7 THEN 'ERROR'
ELSE Convert(varchar(max),TS.StateType)
END AS StateType
, TS.Progress
, TR.Id AS TriggerId
, CASE TR.IsEnabled
WHEN 1 THEN 'ENABLED'
WHEN 0 THEN 'DISABLED'
ELSE Convert(varchar(max),TR.IsEnabled)
END AS TriggerStatus
, TR.Interval
, CASE TR.UnitOfMeasure
WHEN 4 THEN 'DAYS'
WHEN 3 THEN 'HOURS'
WHEN 2 THEN 'MINUTES'
WHEN 1 THEN 'SECONDS'
ELSE Convert(varchar(max),TR.UnitOfMeasure)
END AS IntervalTiming
, DATEADD(minute, DATEDIFF(minute,GETUTCDATE(),GETDATE()), TS.[LastRunTime]) as LocalLastRunTime
, DATEADD(minute, DATEDIFF(minute,GETUTCDATE(),GETDATE()), TS.[NextRunTime]) as LocalNextRunTime
--, TS.[LastRunTime] as UTCLastRunTime
--, TS.[NextRunTime] as UTCNextRunTime
FROM Scheduling.Task T with (nolock)
JOIN Scheduling.TaskState TS with (nolock) ON T.Id = TS.TaskId 
JOIN Scheduling.[Trigger] TR with (nolock) ON TR.Id = T.TriggerId 
JOIN Connector.IntegrationGroup CIG with (nolock) on CIG.[IntegrationId] = T.CategoryId
WHERE T.TypeId in ('55D3F71A-2618-4EAE-9AA6-D48767B974D8', '6F6B935B-FC0A-46B9-8F53-27C6AF7437F0', 'D81C1197-D486-4FB7-AF8C-078C110893A0')
ORDER BY CIG.[Description], T.Name

Logs

SELECT CIG.[Description]
, ST.[Name]
, SM.[Text] 
, DATEADD(minute, DATEDIFF(minute,GETUTCDATE(),GETDATE()), SL.[StartTime]) as LocalStartTime
, DATEADD(minute, DATEDIFF(minute,GETUTCDATE(),GETDATE()), SL.[EndTime]) as LocalEndTime
, SL.[TotalRetryNumber]
, SL.[IsFailed]
, STT.[Name] as TaskType 
FROM [Scheduling].[Log] SL with (nolock)
inner join [Scheduling].[Task] ST with (nolock) on SL.TaskId = ST.Id 
inner join [Scheduling].[Message] SM with (nolock) on SL.Id = SM.LogId 
inner join [Scheduling].[TaskType] STT with (nolock) on ST.TypeId = STT.Id 
inner join [Connector].[IntegrationGroup] CIG with (nolock) on CIG.[IntegrationId] = ST.[CategoryId]
--where st.Name like 'AX 2012 Account Categories to Account Category'
--where st.Name like 'AX 2012 Accounts to Account'
--where st.Name like 'AX 2012 Companies to Company'
--where st.Name like 'AX 2012 Companies to Organization'
--where st.Name like 'AX 2012 Dimension Combinations to Dimension Combination'
--where st.Name like 'AX 2012 Dimension Values to Dimension Value'
--where st.Name like 'AX 2012 Exchange Rates to Exchange Rate'
--where st.Name like 'AX 2012 Fiscal Years to Fiscal Year'
--where st.Name like 'AX 2012 General Ledger Transactions to Fact'
--where st.Name like 'AX 2012 Organization Hierarchies to Tree'
--where st.Name like 'AX 2012 Scenarios to Scenario'
--where st.Name like 'AX 2012 Transaction Type Qualifiers to Fact Type Qualifier'
--where st.Name like 'Maintenance Task'
ORDER BY SL.[StartTime] desc

SSRS : The request failed with HTTP status 401: Unauthorized

Lors de la configuration de SSRS Scale-Out déploiement avec deux serveurs, le message d'erreur s'affichait lorsque je tentais de me connecter aux services. 




Une recherche google vous mène à différentes solutions. Tout d'abord, si vous obtenez ce message d'erreur à partir du serveur SSRS, vous devez utiliser la fonctionnalité Disable the Loopback Check ou configurer Back Connexion Host Names sur le serveur.

Dans mon cas, j'obtenais le message d'erreur alors à partir de serveur autre que SSRS. J'obtenais le message peu importe l'URL que j'utilisais:

http://node1/Reports
http://node2/Reports
http://virtualname/Reports

Toutefois, si l'erreur ne se produit pas lorsque je stop le service SSRS sur un serveur, peu importe lequel. 

La cause du problème est la suivante: l'authentification est envoyé au serveur SSRS. Ensuite, ce même serveur SSRS initie une connexion au service en utilisant le nom virtual, cette requête est redirigée au deuxième serveur SSRS.

Pour résoudre le problème, il faut modifier le fichier hosts sur les serveurs SSRS comme indiquer dans cet article: 


De cette façon, le serveur SSRS va résoudre le nom virtual avec son address IP local et ainsi la deuxième requête va toujours être retourné au même serveur.

Dynamics AX 2012 : Could not connect to the SharePoint document library.

Incapable de synchroniser les templates de ma la librairie SharePoint avec Dynamics AX:

Could not connect to the SharePoint document library. Ensure that the url is correct. If the error persists ensure the proper authentication mode is configured for this site.


Le problème était le nom de ma librairie, je l'avais nommée "AX Templates". J'ai été capable de faire la synchronisation après avoir créer une nouvelle librairie avec le nom "AXTemplates" sans espace dans le nom.

BizTalk Server : BAM Portal

J’ai rencontré plusieurs problèmes lors de la configuration de BAM Portal en cluster pour BizTalk 2013. J’ai décidé de documenter toute les erreurs dans ce billet.

Le premier serveur est facile à configurer puisque je pouvais utiliser BizTalk Server Configuration. Les serveurs subséquents représentent un défi puisqu’ils doivent être configurés manuellement. Il existe un article TechNet


Dans ce billet, je parle seulement de la section To configure each additional computer in the cluster.

The server encountered a critical failure while trying to access the list of Views.

Cette erreur survient lorsque vous n’avez pas fait l’étape 11.

aspnet_setreg.exe -k:"SOFTWARE\Microsoft\BizTalk Server\3.0\BAM\WebServices\identity" -u:BAMWebServiceAccount -p:Password


The EXECUTE permission was denied on the object 'bam_Metadata_GetConfigurationXml'

Cette erreur survient lorsque vous fait la configuration de l’étape 11 avec le mauvais utilisateur ! Assurez-vous d’utilisé le compte  BAM Management Web Service.


Error reading configuration information from the registry

La documentation TechNet est erronée. La clé mentionnée à l’étape 15 n’existe pas :

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\BizTalk Server\3.0\BAM\WebServices

En plus, l’exemple fourni n’est pas une commande non valide

subinacl.exe /keyreg "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\BizTalk Server\3.0" "/grant=

Et puis finalement, il ne faut pas attribuer les permissions au compte BAM WebService mais plutôt au compte BAM Application Pool

Il est plus simple de modifier la clé manuellement. Voici le chemin:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\BizTalk Server\3.0


Dynamics AX 2012 : Error executing code SysSecurityRecorder

Lors de la copie d'un environnement de PROD vers TEST, les utilisateurs obtenaient le message d'erreur suivant lors de l'ouverture d'un menu:

Error executing code: SysSecurityRecorder_1CC4B7A8D53 object does not have method 'MenuItemInvoked'


Le problème est causé par la raison suivante: les utilisateurs de mon environnement TEST utilisent Task Recorder, mais ils n'utilisent pas cette fonction dans l'environnement de production. Lors de la première exécution du Task Recorder dans TEST, une classe est créée dans l'AOT. C'est classe est ensuite utilisé par Security Developpement Tool et l'objet est mis dans la cache locale. Donc, je me retrouve avec un objet dans ma cache locale de mon environnement TEST qui n'existe pas dans mon environnement de Production. 

Suite à la copie des bases de données de production vers TEST, AX appelle la méthode qui se trouve dans sa cache locale, mais qui n'est pas dans la base de données, donc une erreur est lancée. 

Cette erreur peut se produire dans d'autres scénarios.

Pour corriger le problème, vous pouvez supprimer la cache locale sur chaque machine, ou encore mieux, changer le GUID de l'environnement en utilisant la requête suivante:

UPDATE SYSSQMSETTINGS SET GLOBALGUID = '{00000000-0000-0000-0000-000000000000}'

Azure : Directory has one or more subscription to Microsoft Online Services

Si vous êtes nouveau avec la plateforme Azure, il se peut que vous soyez un peu confus avec le composant Azure Active Directory. Tout simplement parce que Azure Active Directory est lié à votre compte et un abonnement est lié à Azure Active Directory. La confusion vient du fait que vous pouvez lié un abonnement avec Azure Active Directory qui n'est pas lié avec votre compte.  Confus ?

Moi aussi et c’est pour cette raison que j’ai décidé d’utiliser un seul compte et un seul Azure Active Directory pour gérer tous mes abonnements. Pour ce faire, j’ai créer un nouveau Azure Active Directory que j’ai nommé mtessier.



Ensuite, j’ai associé tous mes abonnements avec mon nouveau directory. Tout est parfait.



Mais, lorsque j’ai voulu supprimer mon vieux directory nommé « Default Directory », le message d’erreur suivant s’affichait :

Directory has one or more subscription to Microsoft Online Services


Effectivement, j’ai effectué des tests dans le passé avec Office 365, mais je ne l’utilise plus et impossible de supprimer l’API.



Pour me débarrasser de mon Default Directory, j’ai décidé d’en faire un directory orphelin. Pour ce faire, j’ai créé un utilisateur local deleteme avec le rôle Global Admin.




Lors de la création de l’utilisateur, un mot de passe temporaire est assigné. Je me suis connecté sur le portail avec l’utilisateur deleteme et son mot de passe temporaire. Azure m’a demandé de changer le mot de passe, ce que j’ai fait.

Ensuite, j'ai installé Azure AD PowerShell sur ma machine.


Ensuite, j'ai utilisé le compte deleteme pour me connecter à Azure Active Directory en utilisant les commandes suivant:

$msolcred = get-credential
connect-msolservice -credential $msolcred

Ensuite, j'ai vérifier tous les utilisateurs présent dans mon répertoire:

Get-MsolUser | ft UserPrincipalName

Je m'assure d'avoir seulement deux utilisateurs: le mien et deleteme. 


Ensuite, il suffit de supprimer mon utilisateur en utilisant la commande suivante:

Remove-MsolUser -UserPrincipalName username


C'est fait! le répertoire Azure Active Directory n'est plus associer à mon compte et sera automatiquement supprimer par Microsoft dans 90 jours.

Dynamics AX 2012 : Foundation Labels

Voici ce qui se passe lorsque Fondation Model n'est pas sélectionné lors du déploiement de la base de données:



Pour corriger le problème, vous pouvez redéployer une nouvelle base de données et sélectionner Fondation Model.



Sinon, vous pouvez importer le model dans une base de données existante en utilisant le fichier qui se trouve dans le DVD d'installation sous Model\Labels.


Dynamics AX 2012 : This form requires Office Add-ins for Dynamics AX 2012

Dans un client AX, il est possible de configurer des gabarits Excel via Budgeting - Setup - Budget Planning - Matrix fields for worksheet templates.

Lors de l'ouverture de la fenêtre, le client recevait le message d'erreur suivant:

This form requires Office Add-ins for Dynamics AX 2012




Le addin était évidemment installé. Donc, j'ai utilisé Processus Monitor pour capturer le processus ax32.exe et j'ai constaté que l'application lit la clé suivante:

HKCU\Software\Microsoft\Office\Excel\Addins\Microsoft.Dynamics.AX.Framework.OfficeAddin.Excel

Si cette clé n'existe pas, elle est sûrement dans:

HKLM\Software\Microsoft\Office\Excel\Addins\Microsoft.Dynamics.AX.Framework.OfficeAddin.Excel

Pour plus d'information: Registry Entries for VSTO Add-ins

Pour corriger le problème, il suffit d'activer le addin Dynamics AX pour Excel via l'interface graphique ou en modifiant la clé LoadBehavior avec la valeur 3:


Dynamics AX : Performance du système de stockage (3ème Partie)

Après 10 années d’expérience en implantation du système Dynamics AX, je trouve que la performance des disques est la composante la plus négligée lors du design de l’infrastructure. Il est facile de dire qu’un serveur AOS a besoin de 4 ou 8 cœurs avec 12 ou 16GB de mémoire RAM. Mais qu’est-ce qui en est de la performance des disques du serveur SQL ?

Maintenant que nous avons configuré une machine virtuelle dans Azure avec des disques haute performance et nous avons récolté les métriques. Qu’est ce qu’on fait ensuite ?

Il y a quatre scénarios qui me viennent à l’esprit.

Note: je mentionne souvent le nombre de IOPs. Quand je parle de IOPs, j’assume que la latence est très faible. Il faut savoir qu’il est possible d’avoir 25 000 IOPs avec 100ms de délai de latence, ce qui est très mauvais. Si vous n’êtes pas familier avec ce concept, je vous conseille d’aller lire les blogues suivants


Scénario #1 - Implantation d’un nouveau système AX sur un système de stockage existant

La majorité des entreprises ont déjà un système de stockage en place. Peu importe la configuration du système de stockage et des disques, le consultant va demander d’avoir les meilleures performances possible pour le serveur SQL. L’entreprise doit généralement vivre avec les performances offertes.

Toutefois, en tant que consultant, je vous conseille de faire des tests avec Diskspd sur votre serveur SQL avant de commencer l'implantation.

Scénario #2 - Implantation d’un environnement AX dans Azure

Il est maintenant possible de déployer Dynamics AX 2012 R3 dans le Cloud. Il y a un gros avantage dans le Cloud: l’entreprise paye en fonction des performances désirées. Voici des tableaux qui représente les coûts du stockage Premium dans Azure. Il coûte environ 850$ par mois pour 25 000 IOPs et je peux avoir environ 13 000 IOPs pour la moitié du prix.



Note: Les lignes en rouge représentent une restriction du dimensionnement de la machine virtuelle. Par exemple, DS12 possède une limitation de 12 800 IOPs. 


Est-ce que vous voyez le dilemme ? Ai-je besoin de 25 000 IOPs ou de 13 000 IOPs.

Scénario #3 -Implantation d’un nouveau système AX qui requiert une nouvelle unité de stockage

Le client doit acheter une nouvelle unité de stockage. Que ce soit un SAN, un NAS ou des disques locaux, le client veut savoir ce dont Dynamics AX a besoin en terme de performance de disques. La question est légitime lorsque le SSD coûte 8000$ l’unité ! C’est le scénario le plus difficile puisqu’on ne peut pas profiter de l’élasticité du Cloud.

Scénario #4 - Système existant avec un problème de performance de disques

De façon générale, le client va ajouter de la performance au système de stockage. Sois en ajoutant de nouveaux disques ou en déplaçant les données sur une unité de stockage plus performant. Si le client doit acheter un nouveau système de stockage, alors vous vous retrouvez avec le scénario numéro 3.

Donc, combien d’IOPs ai-je besoin ?

J’ai posé à Microsoft et j’ai aussi posé la question à plusieurs consultants: comment puis-je planifier correctement mon stockage pour mon serveur SQL Dynamics AX ? Je n’ai jamais reçu une réponse claire et précise. Tout simplement parce qu’il n’y a pas assez d’information à ce sujet et aucun outil pour nous aider. Les seuls donnés se trouvent dans le document Microsoft Dynamics AX 2012 Day in the Life Benchmark Detail

Microsoft a simulé une charge de travail et a récolté les métriques de performance des serveurs. Le test a été effectué avec différents types de transaction pour un total de 778 783 transactions AX par heure (12 979 transactions AX par seconde).


Pour répondre à la demande, le système de stockage a dû générer en moyenne 34 610 176 opérations par seconde en écriture et 830 575 opérations par seconde en lecture pour un total de 35 440 751 IOPS pour le disque de données seulement.


Ceci représente
  • 97% écriture et 3% lecture.
  • une transaction AX égale en moyenne 2 730 opérations SQL (35 440 751/12 979)
  • Attention, le test a été effectué avec le système AX 2012 RTM. Ceci veux dire que la base de données contient les données et le code.
La question est: qu'est ce qu'une opération AX ? Dans cet exemple, voici une Sales Order: 


Conclusion

Alors, on revient à la question. Combien d’IOPs ai-je besoin ? La réponse que vous allez lire sur internet est: ça dépend de l’utilisation du système. La vraie réponse est: c’est trop complexe à calculer, il n’y a pas d’outil mis à notre disposition pour calculer le nombre de IOPS en fonction de l’utilisation du système. 

Donc, le mieux qu'on peut faire est d'obtenir une estimation par heure du nombre de transactions effectué par les utilisateurs + les transactions effectuées par des intégrations externes + les transactions effectuées par le système de batch. Ensuite, diviser ce chiffre par 3600 afin d'avoir théoriquement le nombre de transactions AX par secondes. Ensuite, basé sur les calcul ci-haut, on peut dire qu'il faut environ 2500 IOPs par transaction AX si l’utilisation du système est similaire à celle testée par Microsoft. 

Finalement, la clé est de collecter le maximum d’information lors de vos implémentations et de vous assurer que la configuration des disques et de SQL est optimale en tenant compte qu’un délai de latence faible avec un maximum d’IOPs vous donnera les meilleurs performance. 

Azure : Tests de performance des disques (2ème Partie)

Il existe plusieurs utilitaires pour simuler une charge de travail sur les disques durs d'un serveur. Les plus connus sont Crystal Mark, IOmeter, SQLIO et mon préféré Diskspd

Je ne veux pas écrire un article afin d'expliquer comment utiliser l'outil puisqu'il en existe suffisamment sur le web. Je recommande Getting Started with Diskspd et Using Microsoft DiskSpd to Test Your Storage Subsystem.

Avant de commencer mon test, je veux expliquer mon but. En fait, j'ai deux objectifs. Le premier est de savoir si je peux obtenir 20 000 IOPS comme promis. Cependant, le nombre d'IOPs est non pertinent lorsqu'il n'est pas associé à un délai de latence. C'est pour cette raison que mon deuxième objectif est de savoir combien d'IOPs je peux obtenir avec un délai de latence très faible dans un contexte SQL.

Commençons les tests. Voici la commande que j'ai utilisée:

diskspd.exe -b64K -d60 -o32 -t8 -h -r -L -w0 -c20g E:\Temp\iotest.dat > C:\diskspd\iotest.txt

-b64K: Grosseur des blocs. J'ai formaté mon disque avec des blocs de 64K. SQL lit les données en bloc de 64k. Donc, je vais faire mon test avec des blocs de 64K :)

-d60: Durée du test, 60 secondes est suffisant.

-o32: Queue Lenght. SQL performe plusieurs petites opérations rapidement. Un Queue Lenght entre 8 et 32 est ce qui se rapproche le plus de SQL.

-t8: Nombre de thread. Je commence toujours avec un thread par coeur.

-h: Désactive la cache logicielle et matérielle en écriture

-r: Random. Oui pour le disque de données et tempdb. Non pour le disque de log.

-w0: Read/Write. 0% write, 100% read dans ce cas-ci. Ensuite je vais faire un test 25% write, 75% read. C'est selon vos besoins.

-c20g: Grosseur du fichier pour effectuer le test. 20GB est normalement suffisant. 

Résultat de mon premier test:


Wow, je suis très loin des 20 000 IOPs ! En plus, le délai de latence en moyenne de 62ms ! 

Perfmon me donne exactement le même résultat en terme de latence:



Je dois avouer que ma combinaison de 8 threads qui lit des blocs de 64K avec une queue lenght de 32 est une charge importante. En revanche, j'effectue seulement un test de lecture!

J'ai fait plusieurs tests avec différente combinaison. J'aurais aimé faire un beau tableau avec des barres et des couleurs, mais pour aujourd’hui ce sera seulement une image de ma feuille Excel :)


La première chose dont je constate est que les performances sont bien meilleures avec les blocs de 8K. Ce qui est bien normal.

Ensuite, les résultats sont très similaires entre les tests de lecture et d'écriture. C'est surprenant.

Ensuite, on remarque que le système atteint un maximum de 4082 IOPs lorsqu'il lit ou écrit des blocs de 64K. J'en retiens que si vous formatez vos disques avec des blocs de 64K, vous allez obtenir environ 25% des IOPs versus 8K. 

Le nombre de thread affecte beaucoup le délai de latence. La question est de savoir combien de thread SQL accèdent les disques simultanément. 

Le délai de latence n'est pas exceptionnel lorsque SQL lit ou écrit des blocs de 64K. Évidemment, plus la charge est élevée, plus le délai de latence augmente.


Conclusion:
  • Oui, je suis capable d'atteindre plus de 20 000 IOPs !
  • Selon mes tests, j'obtiens 5000 IOPs avec 8 millisecondes de délais si mon serveur SQL execute un seul thread. Ensuite, les performances se dégrade.
Okay, c'est bien amusant tout cela, mais qu’est-ce qu’on en fait avec Dynamics AX ?