Réglage du comportement de mise en cache du disque Linux pour un débit maximal

12

Je rencontre un problème de débit maximum ici et j'ai besoin de conseils sur la façon de régler mes boutons. Nous exécutons un serveur de fichiers 10 Gbit pour la distribution de sauvegarde. Il s'agit d'une configuration S-ATA2 à deux disques sur un contrôleur LSI MegaRAID. Le serveur a également obtenu 24 Go de mémoire.

Nous devons refléter notre dernière sauvegarde téléchargée avec un débit maximal.

Le RAID0 pour nos sauvegardes "à chaud" nous donne environ 260 Mo / sec en écriture et 275 Mo / sec en lecture. Un tmpfs testé avec une taille de 20 Go nous donne environ 1 Go / sec. Ce type de débit est ce dont nous avons besoin.

Maintenant, comment puis-je régler le sous-système de mémoire virtuelle de Linux pour mettre en cache les derniers fichiers téléchargés aussi longtemps que possible en mémoire sans les écrire sur le disque (ou encore mieux: écrire sur le disque ET les conserver en mémoire)?

J'ai installé les sysctls suivants, mais ils ne nous donnent pas le débit que nous attendons:

# VM pressure fixes
vm.swappiness = 20
vm.dirty_ratio = 70
vm.dirty_background_ratio = 30
vm.dirty_writeback_centisecs = 60000

Cela devrait en théorie nous donner 16 Go pour la mise en cache des E / S et attendre quelques minutes jusqu'à son écriture sur le disque. Pourtant, lorsque je teste le serveur, je ne vois aucun effet sur l'écriture, le débit n'augmente pas.

Besoin d'aide ou de conseils.

Peter Meyer
la source
Ne serait-il pas plus logique de commencer à écrire dès que possible? Sinon, il atteint la taille maximale du tampon et s'arrête soudainement. Si elle écrivait tout au long, cela vous donne plus de temps.
Zan Lynx
J'ai 20 Go de mémoire uniquement pour les tampons, car mes applications (base linux + vsftpd) utilisent moins de 4 Go (24 Go au total). Mes sauvegardes sont inférieures à 20 Go. Si je peux les faire écrire dans le tampon puis les écrire sur le disque séquentiellement après l'exécution de la sauvegarde, cela réduirait considérablement le temps d'arrêt de ma source de sauvegarde (serveurs virtuels). PS: Le serveur peut s'arrêter par la suite, pas de problème. Il a fallu 30 minutes pour récupérer :)
Peter Meyer
Il semble que l'application que vous utilisez pour transférer les données sur le réseau les synchronise sur le disque. Vous voudrez faire en sorte que cela ne soit pas fait pour que les données puissent simplement rester dans le cache, bien que je me demande pourquoi vous voulez pouvoir faire exploser beaucoup de données comme ça plus rapidement que les disques ne peuvent le faire. Cela indique un défaut de conception quelque part.
psusi
Cela ressemble à une faille: votre solution de sauvegarde ne devrait pas nécessiter l'arrêt complet du serveur.
psusi
1
@PeterMeyer: Même si vous avez beaucoup de RAM, c'est toujours une erreur d'attendre que les écritures commencent. La seule fois qui a un sens est de savoir si vous allez éditer ou supprimer des fichiers (comme un fichier temporaire) avant qu'ils n'arrivent sur le disque. Une sauvegarde ne fait pas ça. Vous souhaitez démarrer les écritures en arrière-plan dès que possible. Réglez votre background_ratio sur 1 ou 2.
Zan Lynx

Réponses:

6

En regardant les variables que vous avez définies, il semble que vous soyez principalement préoccupé par les performances d'écriture et que vous ne vous souciez pas des pertes de données possibles dues à des pannes de courant.

Vous n'aurez que l'option pour les écritures paresseuses et l'utilisation d'un cache d'écriture différée avec des opérations d'écriture asynchrones. Les opérations d'écriture synchrone nécessitent une validation sur disque et ne seront jamais écrites paresseusement. Votre système de fichiers peut provoquer des vidages de page fréquents et des écritures synchrones (généralement en raison de la journalisation, en particulier avec ext3 en mode données = journal). De plus, même les vidages de page "d'arrière-plan" interféreront avec les lectures non mises en cache et les écritures synchrones , les ralentissant ainsi.

En général, vous devriez prendre quelques mesures pour voir ce qui se passe - voyez-vous votre processus de copie mis dans l'état "D" en attendant que le travail d'E / S soit effectué par pdflush? Voyez-vous une forte activité d'écriture synchrone sur vos disques?

Si tout le reste échoue, vous pouvez choisir de configurer un système de fichiers tmpfs explicite où vous copiez vos sauvegardes et synchronisez les données avec vos disques après coup - même en utilisant automatiquement inotify

Pour la mise en cache de lecture, les choses sont beaucoup plus simples - il y a l' fadviseutilitaire fcoretools qui a le --willneedparamètre pour conseiller au noyau de charger le contenu du fichier dans le cache de tampon.

Éditer:

vm.dirty_ratio = 70

Cela devrait en théorie nous donner 16 Go pour la mise en cache des E / S et attendre quelques minutes jusqu'à son écriture sur le disque.

Cela n'aurait pas grandement influencé votre scénario de test, mais votre compréhension est fausse. Le paramètre dirty_ratio n'est pas un pourcentage de la mémoire totale de votre système mais plutôt de la mémoire libre de votre système .

Il y a un article sur le réglage des charges lourdes en écriture avec des informations plus détaillées.

le-wabbit
la source
Oui, je suis après la performance d'écriture. Le temps qu'il faut pour déployer la sauvegarde vers les esclaves de sauvegarde ne me préoccupe pas. J'ai également un script en place pour la retransmission, si le serveur de sauvegarde principal tombe en panne et que les sauvegardes ne parviennent pas aux esclaves de sauvegarde. PS J'ai déjà lu le lien et réglé en conséquence. Désolé pour l'erreur entre free vs buffered vs total.
Peter Meyer
3

Ou obtenez simplement plus de disques ... La configuration de la baie de disques que vous avez ne prend pas en charge tout au long de votre configuration. Il s'agit d'un cas où la solution doit être repensée pour répondre à vos besoins réels. Je comprends que ce n'est qu'une sauvegarde, mais il est logique d'éviter une correction kludgy.

ewwhite
la source
D'accord. Il n'y a aucun moyen qu'un couple de disques SATA ( SATA ? Sérieusement?) Supporte 275 Mo / s, et nous ne parlons même pas des IOP abyssaux que vous obtiendrez d'eux.
adaptr
1
Je peux voir où il se dirige - puisqu'il ne s'agit que d'une destination de sauvegarde de données, il ne se soucie pas de la possibilité de perte de données occasionnelle en raison de pannes de courant. Et il veut minimiser le temps nécessaire à une fenêtre de sauvegarde en fournissant le débit maximal disponible - 20 Go de données pourraient être écrits en moins de 30 secondes de cette façon. Si les sauvegardes impliquent un temps d'arrêt ou un impact sur le service pour une raison quelconque, 30 secondes sont sûrement plus faciles à obtenir que 20 minutes.
the-wabbit
TOTALEMENT à droite. Je synchronise des images de machines virtuelles (très petites pour les nœuds de calcul) qui sont en panne pendant la synchronisation. L'application fonctionne comme tar | ssh mais en utilisant ftp. Et bien, les simulations doivent être exécutées ... :)
Peter Meyer
1
Peu importe de quelle race SATA ils sont. Les disques non d'entreprise à 7 200 tr / min ne peuvent tout simplement pas garantir le débit ou la latence.
adaptr
1
@adaptr, une sauvegarde va être des écritures séquentielles.
psusi
1

L'utilisation du cache de mémoire peut impliquer une perte de données car si quelque chose ne va pas, les données qui sont en mémoire et qui ne sont pas enregistrées sur les disques seront perdues.

Cela dit, il y a des réglages à faire au niveau du système de fichiers.

Par exemple, si vous utilisiez ext4, vous pouvez essayer l'option de montage:

barrière = 0

Cela: "désactive l'utilisation des barrières d'écriture dans le code jbd. Les barrières d'écriture imposent un bon ordre sur le disque des validations de journal, ce qui rend les caches d'écriture de disque volatiles sûrs à utiliser, avec une certaine pénalité de performance. Si vos disques sont sauvegardés par batterie dans un sens ou une autre, la désactivation des barrières peut améliorer les performances en toute sécurité. Les options de montage "barrière" et "nobarrier" peuvent également être utilisées pour activer ou désactiver les barrières, par souci de cohérence avec les autres options de montage ext4. "

Plus à: http://www.mjmwired.net/kernel/Documentation/filesystems/ext4.txt

Peter Senna
la source
J'utilise un XFS fortement réglé. Plus d'informations à ce sujet dans le commentaire ci-dessus :)
Peter Meyer
Le système de fichiers a été créé avec mkfs.xfs -l lazy-count = 1, version = 2, size = 256m -i attr = 2 -d sunit = 512, swidth = 1024 et est monté avec: rw, noatime, logbufs = 8, logbsize = 256k, osyncisdsync, delaylog, attr2, nobarrier, allocsize = 256k
Peter Meyer