Maison >Opération et maintenance >exploitation et maintenance Linux >Comment garantir un transfert de données sécurisé sous Linux
Dans de nombreux scénarios d'E/S, nous devons souvent nous assurer que les données ont été écrites en toute sécurité sur le disque afin qu'elles puissent être lues après la fermeture du système. vers le bas et redémarré les données. Mais nous savons tous que le chemin des E/S du système Linux est encore très compliqué et est divisé en plusieurs couches. Chaque couche peut avoir des tampons pour accélérer la lecture et l'écriture des E/S. Dans le même temps, les applications en mode utilisateur et les fonctions de bibliothèque peuvent également avoir leurs propres tampons, ce qui ajoute une certaine complexité au chemin d'E/S. On peut voir que si vous voulez vous assurer que les données sont écrites sur le disque en toute sécurité, il ne s'agit pas simplement d'ajuster l'écriture/l'écriture.
Alors que faire ? Beaucoup de gens penseront à plusieurs façons, telles que : fflush(), fsync(), fdatasync(), sync(), open() en utilisant l'indicateur O_DIRECT ou O_SYNC, etc. Eh bien, ces moyens (ou une combinaison) peuvent en effet garantir la persistance sûre des données, alors quelle est la différence entre eux ? Quelle est la différence entre fflush() et fsync() ? Que signifie O_DIRECT ? Peut-il garantir une persistance sûre des données ? Quelle est la différence entre O_DIRECT et O_SYNC ? Qu'en est-il de O_SYNC et de fsync() ? Fsync peut-il compléter les fonctions de msync ? Cet article tentera de comprendre et d'expliquer les fonctions et les différences de ces concepts.
On dit qu'une image vaut mille mots Afin d'analyser clairement la différence entre ces concepts, je. a dessiné une image. Regardez attentivement, il devrait être possible de voir clairement leurs fonctions et leurs différences.
Nous nous concentrons ici sur O_DIRECT et O_SYNC La première chose à préciser est que O_DIRECT signifie uniquement que les données ne passeront pas par le cache des pages (généralement utilisé en mode utilisateur). pour gérer le tampon) mais soumettre directement à la couche de périphérique bloc, mais n'attendra pas de manière synchrone que les données soient écrites en toute sécurité sur le disque avant de les renvoyer (par exemple, les données peuvent toujours être mises en file d'attente au niveau de la couche bloc ou dans le propre disque). cache). En ce qui concerne l'indicateur O_SYNC, bien que les données soient toujours écrites dans le cache de pages, la stratégie d'écriture directe sera adoptée à ce moment-là et les données seront renvoyées de manière synchrone jusqu'à ce qu'elles soient écrites en toute sécurité sur le disque. Par conséquent, si O_DIRECT et O_SYNC sont utilisés en même temps, cela signifie que les données ne passeront pas par le cache de pages et attendront que les données soient écrites en toute sécurité sur le disque avant de revenir. Bien sûr, les performances d'E/S seront très bonnes. faible.
Étant donné que O_DIRECT contournera le cache des pages, si un autre processus utilise la méthode normale pour lire le fichier, une incohérence des données peut survenir.
Afin de fournir quelques explications auxiliaires, je publierai ici quelques informations que j'ai lues au cours de la discussion. La première est de citer l'appel système ouvert : http://man7.org/linux/man-pages/man2/open.2.html Description des paramètres associés :
Et les documents liés à innodb : https://lwn.net/Articles/457667/
La différence entre fsync et fdatasync : http://man7.org/linux/man-pages/man2/fsync.2.html
msync :http://man7.org/linux/man-pages/man2/msync.2.html
En fait, il existe un autre mode IO, qui est DAX (Direct Access). Ressemble-t-il à O_DIRECT ? Ce mode nécessite la prise en charge à la fois du système de fichiers et du pilote de bloc. Il est généralement utilisé sur la mémoire non volatile. Essentiellement, il contourne le cache des pages et fait fonctionner directement le périphérique. Cet article ne discutera pas de DAX en profondeur.Plus tard, j'écrirai un pilote de périphérique de bloc de disque virtuel qui prend en charge le mode DAX, puis je le formaterai dans un système de fichiers ext4 et je le monterai en mode -o dax, puis j'étudierai le chemin d'E/S de DAX dans détail.
Pour plus d'articles sur Linux, veuillez visiter la colonne Tutoriel Linux pour apprendre !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!