Comment le cache d'écriture fonctionne-t-il avec un système de fichiers couvrant des disques à différentes vitesses?

9

Sur un système Linux moderne avec plusieurs disques et un RAID logiciel couvrant à la fois les disques lents (HDD) et rapides (SSD), comment les écritures sur le système de fichiers sont-elles mises en cache?

Pour md-raid RAID1, la baie peut être configurée avec des disques au fur --write-mostlyet à mesure , --write-behindce qui suggère que les lectures sont effectuées à partir du disque le plus rapide et que les écritures sur le disque le plus lent peuvent être en retard. Mais comment est-ce mis en cache au niveau du noyau? Le noyau met-il en cache le disque écrit avant ou après la couche md-raid? À la fin d'un appel write (), les données sont-elles garanties d'être écrites sur l'un des non- --write-behinddisques?

Pour un btrfsRAID1, comment se déroulerait la même situation? Il n'y a pas de --write-behindfonctionnalité, donc les pages sales sont-elles comptées au niveau de l'appareil ou du système de fichiers? À quel moment un write () retournerait-il?

Comment les vm.dirty_*ratioparamètres ajustables affectent-ils ces configurations?

Steven Davies
la source

Réponses:

7

Le --write-mostly, --write-behindest géré par le mdconducteur en interne. mdconserve les métadonnées, comme le bitmap à intention d'écriture (qui est obligatoire pour la fonction d'écriture différée) qui enregistre essentiellement les données qui ont été écrites et celles qui manquent encore. Cela est nécessaire en cas d'événement de coupure de courant, lorsque les données n'ont pas encore atteint les périphériques d'écriture. Dans ce cas, la zone de données affectée sera resynchronisée (dans votre cas, lisez à partir du SSD, écrivez sur le disque dur).

Mais comment est-ce mis en cache au niveau du noyau?

Pour le cas d'écriture différée, le pilote md duplique essentiellement la demande d'écriture en interne. La demande d'écriture principale va au (x) lecteur (s) principal (aux) et indique aux couches supérieures "OK, je l'ai déjà fait"; la demande d'écriture copiée reste alors pour le côté d'écriture le plus souvent en arrière du RAID et peut prendre plus de temps pour se terminer, sans que personne ne s'en aperçoive.

Ensuite, la couche de raid prend beaucoup de mesures pour s'assurer qu'aucune donnée ne sera lue à partir du périphérique d'écriture principalement pendant qu'il y a encore des demandes d'écriture en attente dans la file d'attente. Pourquoi les données seraient-elles lues à partir d'un périphérique d'écriture principalement? Eh bien, le SSD a peut-être échoué, c'est donc tout ce qu'il reste. C'est compliqué, et l'écriture différée introduit quelques cas d'angle.

C'est probablement aussi pourquoi il n'est pris en charge que pour le niveau RAID-1, pas pour les autres. Bien qu'il puisse être logique en théorie d'avoir des SSD essentiellement en RAID-0 et deux disques durs à parité en mode écriture différée, il n'y a pas de support pour un RAID-6 écriture différée comme ça. C'est RAID-1 uniquement et rarement utilisé même là-bas.

Les autres paramètres de cache restent inchangés, le mécanisme global de mise en cache ne se soucie pas du tout de la façon dont le mdpilote a implémenté les choses en interne. Le cache fait son truc et md fait son truc. Ainsi, un cache de système de fichiers fonctionne de la même manière pour un système de fichiers au-dessus de md par rapport à un système de fichiers au-dessus d'un lecteur nu. (La réalité est un peu plus compliquée que cela, mais vous pouvez y penser de cette façon.)

frostschutz
la source
3

Pour md-raid RAID1, la baie peut être configurée avec des disques au fur --write-mostlyet à mesure , --write-behindce qui suggère que les lectures sont effectuées à partir du disque le plus rapide et que les écritures sur le disque le plus lent peuvent être en retard. Mais comment est-ce mis en cache au niveau du noyau? Le noyau met-il en cache le disque écrit avant ou après la couche md-raid?

Après, puisque cette fonctionnalité est spécifique à md-raid.

Vous devez considérer cette fonctionnalité md-raid comme une mise en mémoire tampon et non comme une mise en cache. Il est délimité par l' mdadmoption suivante :

--write-behind =

Spécifiez que le mode d'écriture différée doit être activé (valable pour RAID1 uniquement). Si un argument est spécifié, il définira le nombre maximal d'écritures en attente autorisées. La valeur par défaut est 256.

Je peux seulement penser qu'il est également limité par la mise en mémoire tampon normale du noyau et du matériel (c'est-à-dire si c'est plus petit). La mise en mémoire tampon normale du noyau est délimitée par nr_requestset max_hw_sectors_kb. Tu vois /sys/class/block/$write_behind_device/queue/. Par mise en mémoire tampon matérielle, je veux dire le cache d'écriture sur le lecteur.

À la fin d'un appel write (), les données sont-elles garanties d'être écrites sur l'un des non- --write-behinddisques?

Bien sûr, en supposant que vous voulez dire que write () était sur un fichier ouvert avec O_SYNC / O_DSYNC, ou que vous vouliez en fait écrire () + fsync (). Sinon, aucune garantie ne s'applique.

sourcejedi
la source
Merci, mais cela pose une autre question: si le fichier a été ouvert avec O_SYNC, est-ce que write () revient après l'écriture du premier disque ou tous les disques dans ce cas?
Steven Davies
3
les sous-écritures sur les disques sans écriture doivent être terminées en premier
sourcejedi