IQ 12.7 et les chargements massifs : influence de la taille des blocs des systèmes ZFS Solaris 10

Introduction

Cet article propose un benchmark pour étudier l'influence de la taille des blocs des systèmes de fichiers ZFS Solaris 10 sur les chargements massifs dans un serveur IQ 12.7. L'objectif est de déterminer la taille optimale du bloc du système de fichiers ZFS par rapport à la taille du bloc définie dans IQ.

L'influence de la taille du bloc IQ et de la taille de page IQ sur les chargements a déjà été réalisée dans un précédent article : "IQ 12.7 et les chargements massifs : influence de la taille des pages et des blocs". Cette étude a montré que le couple par défaut IQ PAGE SIZE/IQ BLOCK SIZE devait être respecté pour obtenir les meilleurs temps de chargement et taux de compression : ces couples par défaut sont 64K/4K, 128K/8K, 256K/16K et 512K/32K. Pour les plateformes 64 bits, les couples optimaux sont 128K/8K (meilleur taux de compression) et 256K/16K (meilleur temps de chargement).

Le contexte des tests de chargement est rigoureusement identique.

Caractéristiques

Caractéristiques du serveur Solaris

Les benchs sont réalisés sur une machine Solaris SPARC 10 (V445), machine qui dispose de 2 CPU à 1,5 GHz. Les disques sont locaux, aucune baie n'est impliquée dans les tests d'écriture.

Caractéristiques du serveur IQ 12.7

Le serveur IQ est une version 12.7 ESD 5 64 bits. Les espaces de stockage IQ Main Store et IQ Temp Store sont respectivement de 10Gb et 2Gb.

Les configurations du serveur IQ dans les jeux de tests restent toujours identiques (caches etc...) : l'iso-configuration est respectée. Les couples par défaut IQ PAGE SIZE/IQ BLOCK SIZE sont toujours respectés, aussi les seules configurations mises en oeuvre sont les suivantes durant les tests :

Caractéristiques de la table à charger

Les chargements massifs sont réalisés sur une table d'environ 71 millions de lignes (INVESTMENT_POSITION) et ces 71 millions de lignes sont réparties sur 8 fichiers correspondant aux 8 trimestres (ou quarter) 2007 et 2008. La commande LOAD TABLE est utilisée pour le chargement massif des trimestres. Voici la répartition du nombre de lignes par trimestre :

Trimestre Nombre de lignes
Q1 2006 7 354 139
Q2 2006 7 602 069
Q3 2006 8 222 181
Q4 2006 8 694 465
Q1 2007 9 145 929
Q2 2007 9 432 082
Q3 2007 10 026 387
Q4 2007 10 533 146

La structure de la table INVESTMENT_POSITION est la suivante, elle possède un index unique sur 3 colonnes (index HG unique) :

CREATE TABLE IDW.INVESTMENT_POSITION (
  PORTFOLIO_ID             int           NOT NULL IQ UNIQUE(5000),
  INSTRUMENT_ID            int           NOT NULL IQ UNIQUE(500000),
  [DATE]                   date          NOT NULL,
  TECH_QUANTITY            float         NOT NULL,
  PHYSICAL_QUANTITY        float         NOT NULL,
  STATUS                   char(2)       NOT NULL IQ UNIQUE(50),
  LAST_RECORD_DATE         datetime          NULL,
  VALUATION                float             NULL,
  LAST_VALUATION_DATE      datetime          NULL,
  CREATED_BY               varchar(20)   NOT NULL,
  CREATED_ON               datetime      NOT NULL,
  UPDATED_BY               varchar(20)       NULL,
  UPDATED_ON               datetime          NULL,

  PRIMARY KEY(PORTFOLIO_ID,INSTRUMENT_ID,[DATE])
  
);

L'option de création des indexes FP est activée lors de ces chargements. Aussi les chargements massifs sont réalisés sur une table présentant :

  • un index HG unique
  • 13 indexes FP

Les trimestres sont toujours montés dans le même ordre et 3 chargements sont réalisés pour une configuration données (IQ PAGE SIZE/BLOCK SIZE) afin d'obtenir une moyenne représentative sur les temps de chargement (phase 1 et 2) et sur les taux de compression.

Les systèmes de fichiers Solaris ZFS

Les systèmes de fichiers ZFS Solaris sont une nouveauté Solaris 10 offrant une souplesse et une productivité accrues dans la gestion des espaces de stockage : parmi les grandes nouveautés de ce type de système de fichiers, la gestion de l'espace est dynamique (diminution, augmentation d'espace...).

Quelques commandes très utiles autour des systèmes de fichiers ZFS et utilisées durant ces benchmarks sont données ici. Les commandes pour la gestion des systèmes ZFS sont très garnies et truffées d'options, seules les commandes qui ont été utiles et nécessaires pour la réalisation de ces tests de performances sont présentées ici.

Pour plus d'informations sur la prise en main de Solaris 10 et ZFS : "Solaris 10 et ZFS, guide pratique. Préparation d'un environnement pour Oracle 10gR2" »

Retrouver la taille de bloc d'un système de fichiers ZFS (zfs list)

Pour retrouver la taille de bloc d'un système de fichier ZFS : utiliser la commande zfs list pour la propriété recordsize ou recsize (volblocksize lorsqu'il s'agit d'un volume) :

zfs list -o name,recordsize 
NAME                                RECSIZE
...
DATADEVICES/DBA_T1_ASE/DATADEVICES       2K
...
LOG-EXPORTS/DBA_T1_ASE/LOGDEVICES        4K
...

Modifier la taille de bloc d'un système de fichiers ZFS (zfs set recsize)

La commande zfs set permet de modifier la taille de bloc d'un système de fichier ZFS.

zfs set recsize=<block size> <ZFS FileSystem> 
  • La valeur par défaut est de 128K.
  • La taille spécifiée doit être une puissance de 2 supérieure ou égale à 512 octets et inférieure ou égale à 128K.

Cette propriété s'utilise uniquement pour les charges de travail de base de données accédant à des fichiers. La définition de la propriété recsize (ou recordsize) sur une valeur supérieure ou égale à la taille d'enregistrement de la base de données peut améliorer les performances du système de manière significative.

Dans les tests de cet article, la propriété recsize est modifiée avec l'utilisateur root (de 2k à 64k) pour le système de fichiers ZFS LOG-EXPORTS/DBA_T1_ASE/LOGDEVICES, voici des exemples de modification de la taille de bloc de ce système de fichiers :

root% zfs set recsize=2k LOG-EXPORTS/DBA_T1_ASE/LOGDEVICES
root% zfs set recsize=4k LOG-EXPORTS/DBA_T1_ASE/LOGDEVICES
root% zfs set recsize=8k LOG-EXPORTS/DBA_T1_ASE/LOGDEVICES
root% zfs set recsize=16k LOG-EXPORTS/DBA_T1_ASE/LOGDEVICES
root% zfs set recsize=32k LOG-EXPORTS/DBA_T1_ASE/LOGDEVICES
root% zfs set recsize=64k LOG-EXPORTS/DBA_T1_ASE/LOGDEVICES
La modification de la taille de bloc d'un système de fichiers ZFS n'affecte pas les fichiers existants mais uniquement les nouveaux fichiers, c'est pourquoi la base de données IQ est systèmatiquement recréée à l'issue de la modification de la propriété recsize.

Retrouver les disques, les niveaux de RAID et le mirroring d'un système de fichiers ZFS (zpool status)

La commande zpool status permet de retrouver les disques associés aux systèmes de fichiers ZFS, les niveaux de RAID et éventuellement le mirroring mis en place :

zpool status <ZFS FileSystem> 

Dans l'exemple ci-dessous : la commande zpool status pour le système de fichiers ZFS LOG-EXPORTS/DBA_T1_ASE/LOGDEVICES indique qu'il s'agit du disque c0t3d0. Aucun niveau de RAID et aucun mirroring ne sont mis en oeuvre.

root% zpool status LOG-EXPORTS/DBA_T1_ASE/LOGDEVICES
  pool: LOGS-EXPORTS
 state: ONLINE
status: The pool is formatted using an older on-disk format.  The pool can
        still be used, but some features are unavailable.
        action: Upgrade the pool using 'zpool upgrade'.  Once this is done, the
        pool will no longer be accessible on older software versions.
 scrub: none requested
 config:
        NAME        STATE     READ WRITE CKSUM
        LOGS-EXPORTS  ONLINE       0     0     0
          c0t3d0    ONLINE       0     0     0
errors: No known data errors

Les systèmes de fichiers ZFS ont été introduits avec Solaris 10, toutefois, comme toutes les versions majeures de produits, toutes les nouveautés ZFS n'ont pas été mises à disposition à la première version de Solaris 10, certaines nouveautés ZFS sont introduites progressivement avec des niveaux de patch de Solaris 10 : c'est pourquoi il n'est pas rare de voir dans la résultat de la commande zpool status le message "Upgrade the pool using zpool upgrade".

Dans l'exemple ci-dessous, du mirroring est en place :

root% zpool status SYSTEM
  pool: SYSTEM
 state: ONLINE
status: The pool is formatted using an older on-disk format.  The pool can
        still be used, but some features are unavailable.
action: Upgrade the pool using 'zpool upgrade'.  Once this is done, the
        pool will no longer be accessible on older software versions.
 scrub: none requested
config:

        NAME          STATE     READ WRITE CKSUM
        SYSTEM        ONLINE       0     0     0
          mirror      ONLINE       0     0     0
            c0t0d0s5  ONLINE       0     0     0
            c0t1d0s5  ONLINE       0     0     0

errors: No known data errors

La commande zpool status permet de retrouver les niveaux de RAID, mais cette configuration n'est pas envisagée dans ce document.

iostat -Dnmpx

L'étude est complétée sur les statistiques I/O par les résultats de la commande iostat utilisée avec l'option Dnmpx pour le disque supportant la base IQ. La fréquence appliquée est de 2 secondes.

root% iostat -Dnmpx 2 | grep 'c0t3d0s0'

L'option Dnmpx permet d'obtenir en entête les statistiques r/s (reads per second), w/s (writes per second), kr/s (kilobytes read per second), kw/s (kilobytes written per second).

                    extended device statistics              
    r/s    w/s   kr/s   kw/s wait actv wsvc_t asvc_t  %w  %b device

   11.0   18.0  896.4  852.4  0.0  0.2    0.0    7.0   0   6 c0t3d0s0

Rappels sur la compression et les chargements (phases 1 & 2)

Compression des données

La documentation est très pauvre au sujet de l'optimisation de la compression des données avec les paramètres IQ PAGE SIZE et BLOCK SIZE, même dans le manuel "Performance & Tuning guide". Tout ce que l'on peut lire est l'information suivante : Sybase IQ compresse les données lors du stockage sur disque; la compression des données réduit l'espace disque consommé et contribue aux performances; le taux de compression est déterminé automatiquement par le moteur IQ et dépend de la taille de page.

Le taux de compression est fortement lié au couple IQ PAGE SIZE / BLOCK SIZE, les préconisations des valeurs par défaut du paramètre BLOCK SIZE par rapport au paramètre IQ PAGE SIZE vont vers l'optimisation par le moteur IQ de la compression des données lors du stockage sur disque.

Chargements massifs (phases 1 & 2)

Les chargements massifs par la commande LOAD TABLE notifient dans le fichier de message du serveur IQ 2 phases (Insert Pass 1 et Insert Pass 2), exemple :

I. 12/30 16:19:11. 0000000054 [20895]: Insert Pass 1 completed in 109 seconds.
I. 12/30 16:21:36. 0000000054 [20895]: Insert Pass 2 completed in 145 seconds.
  • La phase 1 correspond au chargement des données dans les indexes FP.
  • La phase 2 correspond au chargement des nouvelles données dans les indexes HG, HNG, LF etc....

Lorsqu'une table ne contient aucun index autre que les indexes systématiques FP par colonne, la phase 2 est de 0 seconde.

Influence de la taille du bloc ZFS sur la compression des données IQ

Les résultats montrent à nouveau que le meilleur taux de compression de la table INVESTMENT_POSITION est obtenu pour le couple IQ 128K/8K. Dans tous les cas de figure, l'influence de la taille des blocs ZFS est nulle sur le taux de compression.

Quelles conclusions en tirer ?

L'influence de la taille du bloc d'un système de fichiers ZFS est infinitésimale sur la compression, voire quasi nulle. Ce n'est pas un critère de choix pour influer sur les taux de compression. Le meilleur taux de compression est toujours obtenu avec le couple IQ Page Size/IQ Block Size défini à 128K/8K.

Influence de la taille du bloc ZFS sur les temps de chargement

Le couple 512K/32K ayant le pire taux de compression, ce dernier est écarté des études.

Étude globale comparative des temps de chargement (phase 1 et phase 2)

La même tendance est toujours observée :

Avant que la taille des blocs ZFS ne soit égale à 8 fois la taille des blocs IQ, le meilleur temps de chargement est obtenu lorsque la taille des blocs ZFS est égale à la taille des blocs IQ.

Lorsque la taille des blocs ZFS est à la fois supérieure à la taille des blocs IQ et inférieure à 8 fois la taille des blocs IQ, les dégradations de performances des chargements varient de 1,6% à 8,72%. La dégradation de performance des chargements est la moins forte pour le couple IQ Page Size/Block Size défini à 128K/8K avec la taille des blocs ZFS définie à 16K et 32K (1,6% de dégradation). La dégradation est la plus forte pour le couple 256K/16K avec des tailles de blocs ZFS définies à 32K et 64K (8,72% de dégradation).

Dès que la taille de bloc ZFS est au moins égale ou supérieure à 8 fois la taille des blocs IQ, des gains de 16 à 4% sont encore observés sur les chargements pour aboutir à des temps de chargement quasi identiques quel que soit le couple IQ Page Size/IQ Block Size (environ 18 minutes). Le couple IQ 128K/8K a une très légère avance sur le temps de chargement avec une taille de bloc ZFS définie à 128K.

Étude des phases 1 et 2

Le seul exemple donné ici est le couple IQ Page Size/IQ Block Size 128K/8K, tous les autres couples montrent rigoureusement la même tendance pour les phases 1 et 2.

Les gains observés précédemment concernent uniquement la phase 2 des chargements (mise à jour des indexes LF, HG etc...). Les temps de la phase 1 sont très peu influencés par la taille des blocs des systèmes ZFS.

Résultats iostat

Les résultats des commandes iostat confirment les constats précédents. Tous les couples IQ Page Size/IQ Block Size montrent la même tendance en fonction de la taille des blocs ZFS.

La moyenne kr/s (Kilobytes read per second) augmente en continu lorsque la taille du bloc ZFS augmente.

Avant que la taille des blocs ZFS ne soit égale à 8 fois la taille des blocs IQ, la moyenne kw/s (Kilobytes written per second) est la meilleure lorsque la taille des blocs IQ est égale à la taille des blocs ZFS.

Lorsque la taille des blocs ZFS est à la fois supérieure à la taille des blocs IQ et inférieure à 8 fois la taille des blocs IQ, la moyenne kw/s subit une dégradation.

Dès que la taille des blocs ZFS est supérieure ou égale à 8 fois la taille des blocs IQ, la moyenne kw/s augmente de manière très importante et les chargements sont encore optimisés.

Conclusion

Les temps de chargement sont améliorés sur la phase 2 dès que la taille des blocs ZFS est au moins égale ou supérieure à 8 fois la taille des blocs IQ. A partir de cette conclusion, il faut donc envisager la taille minimale suivante des blocs ZFS en fonction du couple IQ Page Size/IQ Block Size :

Couple IQ Page Size/IQ Block Size Taille minimale des blocs ZFS
64K/4K 32K
128K/8K 64K
256K/16K 128K
512K/32K 128K

Pour le dernier couple 512K/32K, il est impossible d'aller au delà de la limite système de 128K pour la taille des blocs ZFS.

Les tailles de blocs ZFS qui sont à la fois supérieures à la taille des blocs IQ et inférieures à 8 fois la taille des blocs IQ doivent être éliminées.

En prenant en considération le taux de compression qui est toujours le meilleur pour le couple IQ Page Size /IQ Block Size défini à 128K/8K. La configuration idéale est donc une taille de blocs ZFS définie à 128K avec un couple IQ Page Size /IQ Block Size défini à 128K/8K.