La colonne suivante présentera et résumera les connaissances pertinentes sur le cache disque Linux de la colonne Tutoriel du système Linux J'espère qu'elle sera utile aux amis dans le besoin !
Avant-propos
J'ai récemment rencontré une panne en ligne liée au disque, j'aimerais donc résumer les connaissances sur le cache disque Linux que je ne connaissais pas grand-chose auparavant.
En général, il y a probablement deux raisons à l'émergence du cache disque : la première est que la vitesse d'accès au disque est beaucoup plus lente que la vitesse d'accès à la mémoire. La vitesse d'accès peut être améliorée en mettant en cache le contenu du disque. la mémoire ; la seconde est que la vitesse d'accès est basée sur la partie locale du programme. Le principe du sexe, une fois les données accédées, il est probable qu'elles soient réutilisées dans un court laps de temps, donc mise en cache du contenu du disque. en mémoire peut améliorer la vitesse d’exécution du programme.
Principe de localité
Principe de localité du programme : Un programme présente une localité lorsqu'il est exécuté, c'est-à-dire que pendant une période de temps, l'exécution de l'ensemble du programme est limitée à une certaine partie du programme. De manière correspondante, l'espace de stockage accessible par l'exécution est également limité à une certaine zone mémoire. Plus précisément, la localité a généralement deux formes : la localité temporelle et la localité spatiale.
Localité temporelle : un emplacement mémoire référencé une fois sera référencé plusieurs fois dans le futur.
Localité spatiale : si un emplacement mémoire est référencé, alors ses emplacements à proximité seront également référencés à l'avenir.
Page Cache
Afin de réduire les opérations d'E/S sur le disque, le système Linux mettra en cache le contenu du disque ouvert, et l'emplacement du cache est la mémoire physique, convertissant ainsi l'accès au disque en un accès à la mémoire. Améliore efficacement la vitesse du programme. La méthode de mise en cache de Linux utilise la mémoire physique pour mettre en cache le contenu du disque, appelée cache de pages.
Le cache de pages est composé de pages physiques en mémoire, et son contenu correspond à des blocs physiques sur disque. La taille du cache de pages sera ajustée dynamiquement en fonction de la taille de la mémoire libre du système. Elle peut augmenter la taille en occupant la mémoire, et peut également se réduire pour soulager la pression d'utilisation de la mémoire.
Avant l'émergence du mécanisme de mémoire virtuelle, le système d'exploitation utilisait la série de cache de blocs. Cependant, après l'émergence de la mémoire virtuelle, le système d'exploitation gérait les E/S avec une plus grande granularité, le mécanisme de cache de page a donc été adopté. un mécanisme de cache basé sur des pages et orienté vers les fichiers.
Lecture du cache de pages
Lorsque le système Linux lit un fichier, il lira d'abord le contenu du fichier à partir du cache de pages. Si le cache de pages n'existe pas, le système lira d'abord le contenu du fichier à partir du disque et. mettez-le à jour dans le cache de pages, puis lisez le contenu du fichier à partir du cache de pages et revenez.
Le processus général est le suivant :
Le processus appelle la fonction de lecture de la bibliothèque pour lancer une demande de lecture de fichier
Le noyau vérifie la liste des fichiers ouverts, appelle l'interface de lecture fournie par le système de fichiers
pour trouver l'inode correspondant au fichier, puis calculer la page spécifique à lire
Trouver le cache de page correspondant via l'inode 1) Si le nœud de cache de page atteint, le contenu du fichier sera renvoyé directement ; 2) S'il n'y a pas de cache de page correspondant, une erreur de page sera générée. À ce stade, le système créera un nouveau cache de pages vides et lira le contenu du fichier à partir du disque, mettra à jour le cache de pages, puis répétera l'étape 4
Lire le fichier et revenir
Donc, tout le contenu du fichier est lu Que le cache de pages soit initialement atteint ou non, il provient finalement directement du cache de pages.
Écriture dans le cache de pages
En raison de l'existence du cache de pages, lorsqu'un processus appelle l'écriture, la mise à jour du fichier est uniquement écrite dans le cache de pages du fichier, puis la page correspondante est marquée comme sale. Le processus est terminé. Le noyau Linux réécrira périodiquement les pages sales sur le disque, puis effacera l'indicateur sale.
Étant donné que l'opération d'écriture n'écrira que les modifications dans le cache des pages, le processus ne se bloquera pas jusqu'à ce que l'E/S du disque se produise. Si l'ordinateur tombe en panne à ce moment-là, les modifications de l'opération d'écriture peuvent ne pas se produire sur le disque. Par conséquent, pour certaines opérations d'écriture ayant des exigences strictes, telles que les systèmes de données, il est nécessaire d'appeler activement fsync et d'autres opérations pour synchroniser les modifications apportées au disque en temps opportun. L'opération de lecture est différente. La lecture se bloque généralement jusqu'à ce que le processus lise les données. Afin de réduire le délai de l'opération de lecture, le système Linux utilise toujours la technologie de « pré-lecture », c'est-à-dire lors de la lecture des données du disque. le noyau lira plus de pages dans le cache de pages.
Thread de réécriture
La réécriture du cache de page est complétée par un thread séparé dans le noyau. Le fil de réécriture réécrira dans les 3 situations suivantes :
Lorsque la mémoire libre est inférieure au seuil . Lorsque la mémoire libre est insuffisante, une partie du cache doit être libérée. Puisque seules les pages non sales peuvent être libérées, toutes les pages sales doivent être réécrites sur le disque pour les transformer en pages propres pouvant être recyclées.
Lorsque le temps de traitement des pages sales en mémoire dépasse le seuil. Cela permet de garantir que les pages sales ne restent pas indéfiniment en mémoire, réduisant ainsi le risque de perte de données.
Lorsqu'un processus utilisateur appelle les appels système sync et fsync. Il s'agit de fournir aux processus utilisateur une méthode de réécriture forcée pour répondre à des scénarios d'utilisation avec des exigences de réécriture strictes.
Mise en place du fil de réécriture
Nom | Version | Description |
---|---|---|
bdflush | Avant la version 2.6 | le thread du noyau bdflush s'exécute en arrière-plan et il n'y a qu'un seul thread bdflush dans le système lorsque la consommation de mémoire est inférieure. un certain seuil, bdflush Le fil est réveillé. kupdated s'exécute périodiquement et réécrit les pages sales. Cependant, il n'y a qu'un seul thread bdflush dans l'ensemble du système. Lorsque la tâche de réécriture du système est lourde, le thread bdflush peut être bloqué sur les E/S d'un certain disque, empêchant les opérations de réécriture d'E/S des autres disques. exécuté à temps. |
pdflush | Introduit dans la version 2.6 | pdflush Le nombre de threads est dynamique et dépend de la charge d'E/S du système. Il s'agit d'une tâche globale pour tous les disques du système. Cependant, étant donné que pdflush est orienté vers tous les disques, il est possible que plusieurs threads pdflush soient tous bloqués sur un disque encombré, ce qui empêche également l'exécution à temps de l'écriture des E/S des autres disques. |
flusher thread | Introduit après la version 2.6.32 | Le nombre de threads de rinçage n'est pas unique, et le thread de rinçage n'est pas pour tous les disques, mais chaque thread de rinçage correspond à un disque |
Page cache Le recyclage
La logique de remplacement du cache de pages sous Linux est une implémentation LRU modifiée, également connue sous le nom de stratégie à double chaîne. Contrairement à avant, Linux ne gère plus une seule liste chaînée LRU, mais gère deux listes chaînées : une liste chaînée active et une liste chaînée inactive. Les pages de la liste active sont considérées comme « hot » et ne seront pas remplacées, tandis que les pages de la liste inactive peuvent être remplacées. Les pages de la liste active doivent être dans la liste inactive lors de leur accès. Les deux listes chaînées sont maintenues par des règles pseudo-LRU : les pages sont ajoutées depuis la fin et supprimées depuis la tête, tout comme une file d'attente. Les deux listes chaînées doivent être équilibrées - si la liste chaînée active devient trop grande et dépasse la liste chaînée inactive, alors la page d'en-tête de la liste chaînée active sera déplacée vers la liste chaînée inactive, où elle pourra être recyclée à nouveau. La stratégie de double liste chaînée résout le dilemme d’un seul accès dans l’algorithme LRU traditionnel. Et il est plus facile d’implémenter la sémantique pseudo-LRU. Cette méthode de double liste chaînée est également appelée LRU/2. La plus courante est la liste n chaînée, elle est donc appelée LRU/n.
[Étude recommandée : "Tutoriel vidéo Linux"]
Résumé
Dans l'échec en ligne rencontré cette fois, la cause première est qu'un fichier temporaire est utilisé pour la mise en cache dans la logique métier, et un fichier temporaire est créé S'il est supprimé dans un court laps de temps, les opérations sur ce fichier à ce moment seront effectuées dans le cache des pages et ne seront pas réellement réécrites sur le disque. Lorsqu'un programme rencontre un problème et ralentit sa réponse, la durée de survie du fichier temporaire s'allonge, ce qui peut entraîner sa réécriture sur le disque, provoquant une pression excessive sur le disque et affectant l'ensemble du système.
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!