Quelques pistes pour améliorer les performances I/O de DRBD dans le but d’augmenter le débit ou  diminuer la latence.

Optimisation du débit

  • Désactiver les protections d’intégrité

Dans le cas où un contrôleur disque avec BBU est utilisé, les protections d’intégrité internes de DRBD peuvent directement être désactivées. Ne pas le faire autrement !

resource data {
  disk {
    no-disk-barrier;
    no-disk-flushes;
    no-md-flushes;
    ...
 }
 ...
}

Pour les systèmes de fichiers ext3/4, les barrières d’écriture seront aussi à désactiver dans /etc/fstab.

  • Augmenter la taille des buffers d’émission réseau

C’est une optimisation réseau basique. Depuis la version 8.2.7, l’auto-tuning est possible en fixant cette valeur à 0 mais son impact peut être négatif selon la charge I/O.

resource data {
  net {
    sndbuf-size 512k;
    ...
  }
  ...
}
  • Augmenter le nombre de buffers d’écriture disque

Cela permet d’optimiser les écritures disque effectuées sur le nœud secondaire. Les deux valeurs doivent être identiques.

resource data {
  net {
    max-buffers 8000;
    max-epoch-size 8000;
    ...
  }
  ...
}
  • Augmenter la taille de l’activity log

Une taille faible implique un grand nombre de mises à jour des méta-données. Dans le cas d’un environnement intensif en écriture, il vaut mieux l’augmenter pour ne pas pénaliser les performances d’écriture. Attention, le temps de resynchronisation sera impacté suite à un crash étant donné que plus de données seront à synchroniser. La valeur max possible est de 3833 pour la branche 8.3 et 6433 pour la 8.4.

resource data {
  syncer {
    al-extents 3833;
    ...
  }
  ...
}
  • Limiter / forcer le traitement des opérations I/O en attente

Selon le controleur disque utilisé, il convient de forcer le traitement des requêtes disque au plus tôt (peu de requêtes en attente) pour assurer les meilleures performances. Il convient donc de limiter cette valeur (valeur mini 16), ou l’augmenter (valeur max égale à max-buffers) si le contrôleur est plus performant avec un nombre de requêtes en attente plus important.

resource data {
  net {
    unplug-watermark 16;
    ...
  }
  ...
}

Optimisation de la latence

  • Utilisation du scheduler I/O deadline

Le scheduler deadline garantit le temps d’exécution des requêtes disque en imposant une durée d’échéance à chaque opération.

# echo deadline > /sys/block/sdc/queue/scheduler
# echo 0 > /sys/block/sdc/queue/iosched/front_merges
# echo 150 > /sys/block/sdc/queue/iosched/read_expire
# echo 1500 > /sys/block/sdc/queue/iosched/write_expire
  • Augmentation du MTU réseau

Augmenter le MTU permet de transférer de plus grosse trames réseaux (jumbo frames) et éviter ainsi la fragmentation des données.

# ip link set eth1 mtu 9000
  • Sélection de l’affinité CPU

Il est possible de dédier un ou plusieurs CPU pour l’utilisation de DRBD. Il faut veiller par la suite à ne pas les utiliser par un autre programme.

resource data {
  syncer {
    cpu-mask 1;
    ...
  }
  ...
}

Une fois les modifications effectuées, l’application peut-être effectuée à chaud :

# drbdadm adjust data