Dans la pratique, les données mises en cache sont généralement stockées sur du matériel à accès rapide, comme la mémoire vive, et peuvent également être utilisées en corrélation avec un composant logiciel. L'objectif principal d'un cache est d'augmenter les performances de récupération des données en réduisant le besoin d'accès à la couche de stockage sous-jacente plus lente. En laissant la capacité au profit de la vitesse, un cache stocke généralement un sous-ensemble de données transitoires, contrairement aux bases de données où celles-ci sont généralement complètes et durables.
Dans la plupart des cas, le noyau Linux fait référence au « page cache » lors de la lecture ou de l'écriture sur le disque. De nouvelles pages sont ajoutées pour répondre aux demandes de lecture des processus en mode utilisateur. Si la page ne se trouve pas déjà dans le cache, une nouvelle entrée est ajoutée au cache et remplie avec les données lues sur le disque. Si la mémoire disponible est suffisante, la page est conservée dans le cache pendant une durée indéterminée et peut ensuite être réutilisée par d'autres processus sans accéder au disque.
Les concepteurs du noyau Linux ont implémenté le « page cache » pour répondre à deux exigences principales. Premièrement, cela va permettre au système de localiser rapidement une page spécifique contenant des données relatives à un propriétaire donné. Pour tirer le meilleur parti du cache de Linux, la recherche doit être une opération très rapide. Ensuite, le noyau doit être en mesure de sélectionner l'opération appropriée en fonction du propriétaire de la page. L'unité d'information conservée dans le cache de pages est, bien sûr, une page entière de données. Une page ne contient pas nécessairement des blocs de disque physiquement adjacents, elle ne peut donc pas être identifiée par un numéro de périphérique et un numéro de bloc.
Au lieu de cela, une page du cache de pages est identifiée par un propriétaire et par un index dans les données du propriétaire, généralement un inode et un décalage dans le fichier correspondant. Cependant, dans certains cas, comme celui des bases de données, où le volume de données à mettre en cache est trop important, les développeurs préfèrent utiliser une solution de contournement. Plusieurs applications de base de données utilisent les transferts E/S directs pour pouvoir utiliser leur propre algorithme de mise en cache de disque. La plupart d’entre eux implémentent leurs propres mécanismes de mise en cache qui exploitent la nature particulière des requêtes adressées à la base de données.
En effet, les développeurs estiment que pour ces types de programmes, le cache de pages du noyau n’aide pas. Au contraire, il est préjudiciable pour de nombreuses raisons. D’abord, expliquent-ils, beaucoup de caches de pages sont gaspillés pour dupliquer des données de disque déjà dans la RAM (dans le cache de disque de niveau utilisateur). Deuxièmement, les appels read() et write() seraient ralentis par les instructions redondantes qui gèrent le cache de page et la lecture anticipée. Idem pour les opérations de pagination liées aux mappages de mémoire de fichiers. Ces derniers citent également une troisième raison liée au fait que le cache de pages serait préjudiciable pour les serveurs de bases de données.
D'après eux, plutôt que de transférer les données directement entre le disque et la mémoire utilisateur, les appels read() et write() effectuent deux transferts : entre le disque et une mémoire tampon du noyau et entre la mémoire tampon du noyau et la mémoire utilisateur. Pour ces raisons, Linux offre un moyen simple de contourner le cache pages : les transferts E/S directs. Dans un transfert direct d'E/S, le noyau programme le contrôleur de disque pour transférer les données directement vers les pages appartenant à l'espace d'adressage en mode utilisateur d'une application à mise en cache automatique.
Le sujet a toujours été débattu dans la communauté Linux et vient de faire l’objet d’un litige entre Linus Torvalds et un contributeur du noyau Linux. En effet, dans un message publié sur la liste de diffusion du noyau Linux, Dave Chinner, un programmeur australien qui gère le système de fichiers XFS créé par Silicon Graphics (SGI) et pris en charge par de nombreuses distributions Linux, a indiqué que le cache de page est toujours beaucoup plus lent que les transferts E/S directs. « Pour une application hautement concurrente qui traite des données en vrac sur des fichiers volumineux stockés sur un stockage à haut débit, le cache de pages est toujours beaucoup plus lent que les transferts E/S directs », a-t-il écrit dans son message.
Dave Chinner
Sa déclaration rejoint celle citée un peu plus haut, selon laquelle, dans certains cas, comme celui des bases de données, où le volume de données à mettre en cache est trop important, il serait préférable d’utiliser une solution de contournement : les transferts E/S directs. Cela dit, Linus Torvalds, l’architecte principal du noyau Linux n’a pas apprécié le commentaire de son collaborateur sur la question de la mise en cache de données sur son système d’exploitation. Ce dernier a qualifié les propos de Dave Chinner de « pures conneries » avant de s’attaquer à lui dans un long message. « Vous avez déjà fait cette demande, et c'était déjà une connerie complète, et je vous ai appelé à ce sujet aussi », lui a-t-il lancé.
Il lui a fait remarquer que le mot clé dans "cache de pages" est « cache » et que cela marche très bien. « Les caches fonctionnent, Dave. Quiconque pense que les caches ne fonctionnent pas est un incompétent. Environ 99 % de tous les accès au système de fichiers sont mis en cache, et ils ne font jamais aucun transfert E/S direct. Le cache de page les gère parfaitement. Lorsque vous dites que le cache de page est plus lent que le transfert E/S direct, c'est parce que vous ne voyez même pas ou ne vous souciez pas de la rapidité des opérations. Cela se comprend puisque vous n'intervenez qu'une fois que des opérations d'information sont réellement effectuées », déclare Linus Torvalds sur la liste de diffusion.
Pour lui, toute personne opposée à cette idée n’y connaît absolument rien et Dave Chinner en fait partie. « Vous faites cette déclaration sans prendre en compte tous les cas que vous ne voyez pas et qui ne vous intéressent pas, car le cache de pages les a déjà traités pour vous. Il est bien mieux que les transferts E/S directs. À quelle fréquence utilisez-vous des magasins non temporels lorsque vous effectuez une programmation non IO ? À peu près jamais, peut-être ? Parce que les caches fonctionnent. Alors arrêtez-vous déjà avec votre argument stupide et malhonnête, où vous ignorez les effets de la mise en cache », a poursuivi Torvalds.
Quelque part dans son message, Dave Chinner a expliqué que les limites du cache de pages deviennent de plus en plus perceptibles au fur et à mesure que les disques SSD deviennent plus performants. Une chose avec laquelle Torvalds n’est toujours pas d’accord. « Et non, les disques SSD n'ont pas rendu les caches inutiles », a-t-il déclaré. Cependant, en réponse au long texte de Torvalds, Chinner a expliqué qu’il reste persuadé que le problème qu’il souligne est bel et bien réel. Pour Chinner, il est bien vrai qu’il existe beaucoup de cas où le cache de pages fonctionne normalement, car il est toujours plus rapide que la plupart des systèmes de stockage.
« En effet, vous n'avez même pas pris la peine de me demander de clarifier ce à quoi je faisais référence dans la déclaration que vous avez citée. Linus, personne ne peut parler d’E/S direct sans que vous criiez et jetiez tous vos jouets hors du berceau. Si vous ne pouvez pas être civilisé ou si vous ne pouvez pas écrire une explication condescendante de “mise en cache 101” à quelqu'un qui a passé plus de 15 ans à travailler avec des systèmes de fichiers et de caches, vous feriez bien mieux de ne rien dire », a lancé Chinner en réponse à Torvalds. Pour finir son message, Chinner a pris le soin de redonner à Linus Torvalds un nouvel exemple sur le cas qu’il aborde et qui selon lui met en évidence les limites du cache de pages.
« Le monde dans lequel je travaille compte une proportion importante d'applications dans lesquelles le jeu de données est trop volumineux pour être mis en cache efficacement ou est mieux mis en cache par l'application que le noyau. La mise en cache efficace des données par le cache de pages constitue l'exception plutôt que la règle. Par conséquent, les programmeurs utilisent les transferts E/S directs, car il est plus rapide que le cache de pages. C’est courant dans des applications telles que les grandes bases de données d’entreprise, les applications HPC, les applications d’exploration ou d’analyse de données, etc. Il y a énormément de monde qui utilise ces applications », a-t-il conclu dans son message.
Sources : Dave Chinner, Linus Torvalds
Et vous ?
Que pensez-vous des arguments avancés par Linus Torvalds et Dave Chinner ?
Le système de cache du noyau Linux vous semble-t-il optimal pour la mise en cache de volumes de données importants ? Pourquoi ?
Comment gérez-vous la mise en cache de volumes de données importants dans vos applications ?
Voir aussi
Linus Torvalds : « Je ne serai jamais doux, mais je serai plus poli » ! Le père de Linux indique qu'il va le simuler jusqu'à ce que cela arrive
Pour Linus Torvalds, ARM ne gagnera pas la concurrence sur le marché des serveurs à cause du niveau de fragmentation élevé et d'autres raisons
La version 5.1 du noyau Linux est disponible, optimise les E/S asynchrones et apporte d'autres nouvelles fonctionnalités