Translate

samedi 18 août 2012

[TECH]: Compter le nombre de boîtes aux lettres dans une Mailbox Database en seulement quelques millisecondes

Hier, je cherchais je-ne-sais-plus-quoi et je suis tombé sur le blog d'un collègue norvégien, nommé Jan: http://blog.powershell.no/2010/11/21/retrieve-number-of-mailboxes-per-database-in-exchange-server-2010/

Bref, je me suis mis à lire l'article et il s'avère simplement que l'auteur cherchait à savoir comment compter le nombre de BàL par Mailbox Database le plus rapidement possible...

En effet, il y a des techniques plus ou moins rapide, et plus ou moins gourmandes en mémoire. Une technique "simple" est de faire un Get-Mailbox -Database <IdentifiantDB> -ResultSize:Unlimited. Cela retourne une collection ou $null si rien n'a été trouvé.

Au demeurant, le problème majeur de cette technique est qu'elle pourrait être rapide (c'est en fait la plus rapide en utilisant juste la cmdlet Get-Mailbox) mais elle a le gros désavantage de retourner une collection d'objets: c'est lent et cela consomme de la mémoire.

Typiquement, on ferait:
([Object[]] $Mailboxes = Get-Mailbox -Database <IdentifiantDB> -ResultSize:Unlimited).Count

Et si l'on voulait compter toutes les BàL Exchange 2010 (en utilisant la même technique):
([Object[]] (Get-MailboxDatabase | Get-Mailbox -ResultSize:Unlimited)).Count

On obtiendait alors des temps pas terribles (on mesure avec Measure-Command): 35 secondes et quelques pouillemes, mon lab a 8 Databases et environ 1200 BàL. Pis: dans de gros environnments, ce type de commandes échoue systématiquement ou finit par consommer une mémoire infernale (j'ai vu des sessions Powershell à plus de 8GB parfois :p).
Alors la technique de notre ami norvégien 'Jan Egil Ring' est d'utiliser une requête LDAP et de compter le nombre d'objets ayant le 'homeMDB' égal au DistinguishedName de la Database où l'on souhaite compter. Une peu à la Exchange 2000/2003 au fond...

Cela fonctionne très bien et c'est finalement ce que fait la commande Get-Mailbox (en construisant un filtre LDAP et en requêtant l'Active Directory), mais cela prends encore "quelques" secondes (le "quelques" étant variable). D'ailleurs j'utilisais cette technique moi-même avec des résultats que je jugeais alors optimums (j'ai de bons souvenirs d'optimisations de requêtes LDAP dans une grosse forêt multi-domaines avec plus de 200 mille objets...).

Je me suis dit qu'il faisait trop chaud (36°C à l'ombre :p) pour sortir gratter dans le jardin, et me suis lancé un mini-le défit: d'optimiser encore. J'ai finalement trouvé la réponse rapidement (c'est ballot car le soleil n'a pas décliné, et il fait encore 36°C :p).

Parmi les nombreux attributs présent sur un objet Mailbox Database (msExchPrivateMDB), il en est un qui s'appelle le 'homeMDBBL'... 'BL' pour Back Link. Il s'agit donc d'un attribut construit par AD lorsque l'attribut backlinké est modifié. Ici, l'attribut backlinké est le 'homeMDB'. Tiens donc... ? Cela signifie alors que le homeMDBBL contient les DistinguishedNames des BàL de cette Database. Pratique non ? S'agissant d'un attribut multi-valué, il suffit de récupérer l'attribut 'Count' via les interfaces ADSI.

On s'apperçoit que dans la liste il y a toujours une SystemMailbox{<} car à sa création, chaque DB se voit attribuer un GUID et une BàL (rien de nouveau sous le soleil quoi, c'est comme ça depuis Exchange 2000). Bref, on constate donc que le nombre de BàL dans une Mailbox Database est donc égal à 'compte d'entrées dans homeMDBBL moins 1'.

Un petit script que l'on nommera ici Get-MailboxCount.ps1, et voici ce que cela donne (en utilisant 'Measure-Object -Sum' afin de faire la somme:
Soit 50 millisecondes !!!
  • Pas de requête LDAP
  • Interrogation de l'objet AD correspondant à la DB depuis la partition Configuration, donc disponible sur tous les Contrôleurs de Domaine
  • Attribut disponible dans le Global Catalog
  • Si l'objet (ou les objets) Database est déjà stocké dans une variable, on gagne encore quelques millisecondes puisque l'on évite le Get-MailboxDatabase...
Gros handicap toutefois, il devient compliqué d'ajouter des filtres additionels. Mais cela permet d'jà de répondre au besoin initial de compter le nombre de BàL par Mailbox Database. Et vite!

Epatant, non? :)

Vous trouverez le script en question, ainsi que bien d'autres ici: http://sdrv.ms/PtoxZo

Aucun commentaire:

Enregistrer un commentaire