Archives pour la catégorie ‘DRBD’

DRBD : optimisation des performances I/O

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

DRBD : configuration master/master + cluster filesystem OCFS2

Réplication DRBD

root@node1#:~# apt-get install drbd8-utils
root@node1#:~# cat /etc/drbd.d/global_common.conf
global {
	usage-count no;
}

common {
	protocol C;

	handlers {
		pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
		pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
		local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";
	}

	startup {
		wfc-timeout 0;
		degr-wfc-timeout 120;
		become-primary-on both;
	}

	disk {
		on-io-error detach;
	}

	net {
		cram-hmac-alg "sha1";
		shared-secret "blablablaaaaaaaaaaa";
		max-buffers 2048;
		ko-count 4;
		allow-two-primaries;
		after-sb-0pri discard-zero-changes;
		after-sb-1pri discard-secondary;
		after-sb-2pri disconnect;
	}

	syncer {
		rate 40M;
		verify-alg "crc32c";
	}
}
root@node1:~# cat /etc/drbd.d/r0.res
resource r0 {
        on drbd1 {
                device /dev/drbd0;
                disk /dev/vg/data;
                address 192.168.1.211:7788;
                meta-disk internal;
        }

        on drbd2 {
                device /dev/drbd0;
                disk /dev/vg/data;
                address 192.168.1.212:7788;
                meta-disk internal;
        }
}
root@node1:~# drbdadm create-md r0
root@node1:~# /etc/init.d/drbd start
root@node1:~# drbdadm syncer r0
root@node1:~# drbdadm connect r0
root@node2:~# apt-get install drbd8-utils
root@node2:~# scp root@node1:/etc/drbd.d/* /etc/drbd.d/
root@node2:~# drbdadm create-md r0
root@node2:~# /etc/init.d/drbd start
root@node2:~# drbdadm syncer r0
root@node2:~# drbdadm connect r0
root@node1:~# drbdadm -- --overwrite-data-of-peer primary r0
root@node1:~# drbdadm primary r0
root@node1:~# cat /proc/drbd
version: 8.3.7 (api:88/proto:86-91)
srcversion: EE47D8BF18AC166BE219757
0: cs:Connected ro:Primary/Primary ds:UpToDate/UpToDate C r----
ns:4300921 nr:3429 dw:110206 dr:8403592 al:39 bm:260 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
root@node2:~# drbdadm primary r0
root@node2:~# cat /proc/drbd
version: 8.3.7 (api:88/proto:86-91)
srcversion: EE47D8BF18AC166BE219757
0: cs:Connected ro:Primary/Primary ds:UpToDate/UpToDate C r----
ns:756 nr:825 dw:1581 dr:3131 al:2 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

Mise en place du filesystem OCFS2

root@node1:~# apt-get install ocfs2-tools
root@node1:~# cat /etc/ocfs2/cluster.conf
cluster:
    name = ocfs2
    node_count = 2

node:
    number = 1
    name = node1
    ip_address = 192.168.1.211
    ip_port = 7777
    number = 1
    cluster = ocfs2

node:
    number = 2
    name = node2
    ip_address = 192.168.1.212
    ip_port = 7777
    cluster = ocfs2
root@node1:~# /etc/init.d/ocfs2 start
root@node1:~# /etc/init.d/o2cb start
root@node1:~# mkfs.ocfs2 /dev/drbd0
root@node1:~# mount.ocfs2 /dev/drbd0 /mnt/
root@node2:~# apt-get install ocfs2-tools
root@node2:~# scp root@node1:/etc/ocfs2/* /etc/ocfs2/
root@node2:~# /etc/init.d/ocfs2 start
root@node2:~# /etc/init.d/o2cb start
root@node2:~# mount.ocfs2 /dev/drbd0 /mnt/
Haut de page