{"id":20540,"date":"2026-08-11T11:56:13","date_gmt":"2026-08-11T09:56:13","guid":{"rendered":"https:\/\/webhosting.de\/linux-page-cache-performance-booster\/"},"modified":"2026-08-11T11:56:13","modified_gmt":"2026-08-11T09:56:13","slug":"optimisation-des-performances-du-cache-de-pages-sous-linux","status":"publish","type":"post","link":"https:\/\/webhosting.de\/fr\/linux-page-cache-performance-booster\/","title":{"rendered":"Comprendre le cache de pages sous Linux : des performances accrues gr\u00e2ce au cache"},"content":{"rendered":"<p><strong>Page Linux<\/strong> Je consid\u00e8re le cache comme un levier direct permettant d'acc\u00e9l\u00e9rer l'acc\u00e8s aux fichiers, car il effectue les lectures r\u00e9p\u00e9t\u00e9es \u00e0 partir de la m\u00e9moire vive (RAM) plut\u00f4t qu'\u00e0 partir d'un support de stockage plus lent. Je vais vous montrer concr\u00e8tement comment le noyau r\u00e9duit ainsi les latences, acc\u00e9l\u00e8re les charges de travail telles que les serveurs web, les bases de donn\u00e9es et WordPress, et comment j'exploite cet effet \u00e0 l'aide de moyens simples.<\/p>\n\n<h2>Points centraux<\/h2>\n\n<p>Les id\u00e9es cl\u00e9s suivantes m'aident \u00e0 <strong>Cache de la page<\/strong> les \u00e9valuer et les exploiter de mani\u00e8re cibl\u00e9e.<\/p>\n<ul>\n  <li><strong>m\u00e9moire cache RAM<\/strong>: Les donn\u00e9es des fichiers sont stock\u00e9es en m\u00e9moire, ce qui acc\u00e9l\u00e8re les acc\u00e8s.<\/li>\n  <li><strong>R\u00e9\u00e9valuation \u00e0 la hausse<\/strong>: Les op\u00e9rations d'\u00e9criture sont regroup\u00e9es de mani\u00e8re plus efficace sous forme de \u201e pages sales \u201c.<\/li>\n  <li><strong>Transparence<\/strong>: Les applications en b\u00e9n\u00e9ficient sans modification du code.<\/li>\n  <li><strong>Dynamique<\/strong>: Le cache lib\u00e8re de la m\u00e9moire lorsque cela est n\u00e9cessaire.<\/li>\n  <li><strong>Charges de travail<\/strong>: Le Web, les bases de donn\u00e9es, le CI\/CD et les journaux enregistrent une progression notable.<\/li>\n<\/ul>\n\n<h2>Qu'est-ce que le cache de page Linux ?<\/h2>\n\n<p>Je comprends le <strong>Cache de la page<\/strong> en tant qu'espace m\u00e9moire dans la RAM o\u00f9 le noyau stocke des blocs de fichiers d\u00e8s que des processus utilisent <code>read()<\/code>, <code>write()<\/code> ou <code>mmap()<\/code> acc\u00e9der aux fichiers. \u00c0 chaque acc\u00e8s, le noyau v\u00e9rifie d\u2019abord le cache et fournit imm\u00e9diatement les donn\u00e9es depuis la m\u00e9moire si elles y sont d\u00e9j\u00e0 pr\u00e9sentes, ce qui r\u00e9duit sensiblement le temps de r\u00e9ponse. Si les donn\u00e9es ne se trouvent pas dans le cache, le noyau les charge depuis le support de stockage, les y stocke et les met \u00e0 la disposition du processus, ce qui permet un acc\u00e8s rapide lors de la prochaine requ\u00eate. Ce m\u00e9canisme est \u00e9troitement li\u00e9 au syst\u00e8me de fichiers virtuel (Virtual File System) et s'ex\u00e9cute de mani\u00e8re transparente pour les applications, ce qui rend son utilisation universelle. De ce mode de fonctionnement d\u00e9coule un principe simple : j'utilise la m\u00e9moire RAM libre comme <strong>Surface du cache<\/strong> au lieu de le laisser inutilis\u00e9.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/linux-page-cache-performance-5830.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Pourquoi le cache de pages acc\u00e9l\u00e8re sensiblement le chargement<\/h2>\n\n<p>L'effet le plus marqu\u00e9 s'explique par le fait que je <strong>E\/S disque<\/strong> r\u00e9duit consid\u00e9rablement d\u00e8s que les donn\u00e9es r\u00e9currentes se trouvent dans le cache et n'ont plus besoin d'\u00eatre relues \u00e0 partir du support de stockage. Les acc\u00e8s en lecture s'effectuent alors \u00e0 partir de la m\u00e9moire vive (RAM), ce qui r\u00e9duit consid\u00e9rablement les latences et les files d'attente au niveau des contr\u00f4leurs. Les op\u00e9rations d\u2019\u00e9criture en b\u00e9n\u00e9ficient \u00e9galement, car le noyau marque les modifications comme des \u201e pages sales \u201c, les regroupe dans le temps et les \u00e9crit ensuite efficacement sur le support. Ainsi, de nombreux petits acc\u00e8s individuels, qui solliciteraient le stockage, disparaissent au profit d\u2019un nombre r\u00e9duit d\u2019op\u00e9rations plus importantes. Au final, apr\u00e8s une br\u00e8ve phase de pr\u00e9chauffage, le syst\u00e8me donne l\u2019impression d\u2019\u00eatre plus rapide, car davantage de donn\u00e9es de travail se trouvent dans le <strong>M\u00e9moire<\/strong> restent.<\/p>\n\n<h2>Lecture, \u00e9criture, \u00ab Dirty Pages \u00bb : voici comment \u00e7a fonctionne<\/h2>\n\n<p>Un acc\u00e8s en lecture commence toujours par une v\u00e9rification du cache, ce qui me permet d'obtenir des \u201e hits \u201c sans temps d'attente et de ne payer qu'une seule fois pour les \u00ab misses \u00bb. Lors d'une \u00e9criture, le contenu modifi\u00e9 est d'abord stock\u00e9 dans la RAM et mis en attente en tant que \u00ab dirty \u00bb jusqu'\u00e0 ce que le noyau le transf\u00e8re de mani\u00e8re group\u00e9e vers le support de stockage. Si je le souhaite, je peux forcer l\u2019enregistrement d\u00e9finitif avec <code>fsync()<\/code>, ce qui reste important lorsque les donn\u00e9es <strong>Consistance<\/strong> dont j'ai besoin imm\u00e9diatement. Ce chemin de r\u00e9\u00e9criture am\u00e9liore l'efficacit\u00e9 des applications qui manipulent de nombreux petits fichiers, comme le code PHP, les fichiers de configuration ou les ressources. En m\u00eame temps, je garde \u00e0 l'esprit que la r\u00e9\u00e9criture am\u00e9liore les performances, mais qu'il existe un court laps de temps pendant lequel tout n'est pas encore physiquement sauvegard\u00e9.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/Linux_Page_Cache_3892.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>La m\u00e9moire vive libre correspond au cache \u2013 ce n'est pas une perte<\/h2>\n\n<p>Beaucoup consid\u00e8rent la m\u00e9moire \u201e occup\u00e9e \u201c avec scepticisme, mais j'interpr\u00e8te correctement cette valeur en consid\u00e9rant la part \u201e buff\/cache \u201c comme un indicateur pertinent <strong>m\u00e9moire tampon<\/strong> valeurs. Le noyau utilise activement la m\u00e9moire RAM inutilis\u00e9e, la restitue aux processus en un clin d'\u0153il si n\u00e9cessaire et g\u00e8re l'\u00e9quilibre gr\u00e2ce \u00e0 des m\u00e9canismes de r\u00e9cup\u00e9ration. Cette dynamique garantit la r\u00e9activit\u00e9 de mon syst\u00e8me tant qu'il y a suffisamment de donn\u00e9es actives dans le cache. Si les besoins d\u2019une application augmentent, le noyau \u00e9vince les anciennes pages du cache et lib\u00e8re de l\u2019espace sans que j\u2019aie \u00e0 intervenir manuellement. Lorsque j\u2019entre dans des phases de forte charge, j\u2019observe cela en me concentrant sur <a href=\"https:\/\/webhosting.de\/fr\/pression-memoire-noyau-linux-optimisation-des-systemes-dhebergement-ram\/\">Pression du r\u00e9servoir<\/a>, afin d'\u00e9valuer correctement la situation et de cerner les goulots d'\u00e9tranglement.<\/p>\n\n<h2>Les charges de travail qui en tirent un grand b\u00e9n\u00e9fice<\/h2>\n\n<p>Je vois les principaux avantages dans tous les cas o\u00f9 les donn\u00e9es reviennent souvent et o\u00f9 il y a de nombreuses petites consultations, ce qui <strong>Cache<\/strong> simplifi\u00e9e. Les exemples classiques sont les serveurs Web contenant des fichiers PHP et HTML fr\u00e9quemment utilis\u00e9s, ainsi que les installations WordPress comportant des th\u00e8mes, des plugins, des m\u00e9dias et des configurations r\u00e9currents. Les bases de donn\u00e9es tirent profit des requ\u00eates r\u00e9p\u00e9t\u00e9es au niveau du syst\u00e8me de fichiers, \u00e0 condition qu\u2019elles ne contournent pas d\u00e9lib\u00e9r\u00e9ment le cache de page. Les syst\u00e8mes CI\/CD avec des artefacts de build, ainsi que les outils qui traitent de nombreux petits fichiers, gagnent \u00e9galement en vitesse de mani\u00e8re notable. M\u00eame les analyses de journaux, qui effectuent une lecture s\u00e9quentielle, b\u00e9n\u00e9ficient d\u2019un avantage gr\u00e2ce aux tampons RAM, car le noyau m\u00e9morise les mod\u00e8les d\u2019acc\u00e8s et les fournit plus rapidement.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/linux-page-cache-performance-3829.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Suivi et mesure : voici comment j'\u00e9value les effets de cache<\/h2>\n\n<p>Je commence par v\u00e9rifier avec <code>free -h<\/code>, quelle est la taille de \u201e buff\/cache \u201c et comment <strong>occup\u00e9<\/strong> La m\u00e9moire s'est d\u00e9velopp\u00e9e au fil du temps. Un aper\u00e7u de <code>\/proc\/meminfo<\/code> me montre des indicateurs tels que <code>En cache<\/code>, <code>Sale<\/code> et <code>Writeback<\/code>, qui fournissent des informations sur les lectures en cours et les op\u00e9rations d'\u00e9criture en attente. Avec <code>iostat -x 1<\/code> ou <code>pidstat -d 1<\/code> Je constate si la charge d'E\/S physique diminue d\u00e8s que mon cache est \u00ab r\u00e9chauff\u00e9 \u00bb. Des outils tels que <code>parfait<\/code> ou <code>bcc<\/code>Les scripts bas\u00e9s sur [...], bien qu'ils permettent d'approfondir l'analyse, sont rarement n\u00e9cessaires au quotidien lorsque des sch\u00e9mas clairs se d\u00e9gagent. De plus, je v\u00e9rifie, en effectuant plusieurs acc\u00e8s au fichier, si la deuxi\u00e8me ex\u00e9cution est nettement plus rapide, ce qui met en \u00e9vidence l'effet du <strong>Caches<\/strong> confirm\u00e9.<\/p>\n\n<h2>R\u00e9glages : param\u00e8tres et valeurs par d\u00e9faut recommand\u00e9es<\/h2>\n\n<p>Je ne modifie que ce que je comprends, et je commence l'optimisation du cache par quelques r\u00e9glages simples et faciles \u00e0 comprendre <strong>Vis de r\u00e9glage<\/strong>. Les param\u00e8tres vm.dirty d\u00e9terminent \u00e0 partir de quel moment les op\u00e9rations d'\u00e9criture sont transf\u00e9r\u00e9es de la m\u00e9moire vive vers le support de stockage, ainsi que l'intensit\u00e9 avec laquelle ce processus s'effectue. <code>vm.vfs_cache_pressure<\/code> D\u00e9termine l'intensit\u00e9 avec laquelle le noyau remplace les caches Dentry et Inode, ce qui influe directement sur les op\u00e9rations du syst\u00e8me de fichiers. Les valeurs de pr\u00e9lecture au niveau des p\u00e9riph\u00e9riques bloc peuvent am\u00e9liorer les performances de lecture s\u00e9quentielle lorsque les charges de travail en tirent profit. Je documente chaque \u00e9tape, effectue des tests sous charge et, si n\u00e9cessaire, je reviens aux valeurs par d\u00e9faut si aucun gain n'est constat\u00e9.<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th><strong>Param\u00e8tres<\/strong><\/th>\n      <th><strong>Standard<\/strong><\/th>\n      <th><strong>Effet<\/strong><\/th>\n      <th><strong>Quand modifier<\/strong><\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>vm.dirty_background_ratio<\/td>\n      <td>10%<\/td>\n      <td>D\u00e9but de la phase de r\u00e9\u00e9criture asynchrone<\/td>\n      <td>En cas de nombreuses petites \u00e9critures, d\u00e9clencher le flush plus t\u00f4t<\/td>\n    <\/tr>\n    <tr>\n      <td>vm.dirty_ratio<\/td>\n      <td>20%<\/td>\n      <td>Pourcentage maximal de \u201e dirty \u201c dans la m\u00e9moire vive (RAM)<\/td>\n      <td>En cas de charge en rafale, augmenter la marge de s\u00e9curit\u00e9<\/td>\n    <\/tr>\n    <tr>\n      <td>vm.dirty_expire_centisecs<\/td>\n      <td>3000<\/td>\n      <td>Temps de \u201e dirty \u201c jusqu'au flush (en 1\/100 s)<\/td>\n      <td>Pour les cibles de latence, r\u00e9gler sur une valeur plus faible<\/td>\n    <\/tr>\n    <tr>\n      <td>vm.dirty_writeback_centisec<\/td>\n      <td>500<\/td>\n      <td>Intervalle pour la r\u00e9\u00e9criture en arri\u00e8re-plan<\/td>\n      <td>Si le stockage est lent, augmenter l\u00e9g\u00e8rement la charge<\/td>\n    <\/tr>\n    <tr>\n      <td>vm.vfs_cache_pressure<\/td>\n      <td>100<\/td>\n      <td>Besoin de lib\u00e9rer des dentries\/inodes<\/td>\n      <td>R\u00e9duire lors de nombreuses op\u00e9rations sur les fichiers<\/td>\n    <\/tr>\n    <tr>\n      <td>Lecture anticip\u00e9e par blocs<\/td>\n      <td>selon l'appareil<\/td>\n      <td>Aper\u00e7u s\u00e9quentiel<\/td>\n      <td>Augmenter lors des lectures en continu<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n<p>Pour mieux comprendre les processus de r\u00e9cup\u00e9ration et de transfert, il est int\u00e9ressant de se pencher sur <a href=\"https:\/\/webhosting.de\/fr\/serveur-page-cache-eviction-linux-memory-impression-optimisation-insight\/\">\u00c9viction du cache de pages<\/a>, afin d'\u00e9valuer de mani\u00e8re approfondie sa propre configuration. J'apporte toujours les modifications par \u00e9tapes, j'effectue des mesures et je documente clairement les effets, afin que chaque <strong>Adaptation<\/strong> reste compr\u00e9hensible.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/LinuxCachePerformance5678.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Cache de page et bases de donn\u00e9es : quand est-il judicieux de les contourner ?<\/h2>\n\n<p>Certaines bases de donn\u00e9es utilisent d\u00e9lib\u00e9r\u00e9ment <strong>E\/S directes<\/strong> afin d'\u00e9viter la mise en m\u00e9moire tampon double et d'utiliser leurs propres caches. Dans de tels sc\u00e9narios, je travaille avec les param\u00e8tres internes de la base de donn\u00e9es et je compte moins sur le cache de pages Linux. Si un moteur acc\u00e8de fr\u00e9quemment \u00e0 de nouvelles donn\u00e9es ou \u00e0 des volumes de travail tr\u00e8s importants, le mod\u00e8le de contournement est int\u00e9ressant pour mieux ma\u00eetriser la consommation de m\u00e9moire. En revanche, si l\u2019accent est mis sur des lectures r\u00e9p\u00e9t\u00e9es de fichiers provenant des m\u00eames tables ou index, le cache du syst\u00e8me de fichiers reste utile. Je prends ma d\u00e9cision en fonction du profil d\u2019acc\u00e8s r\u00e9el, et non sur la base d\u2019une r\u00e8gle g\u00e9n\u00e9rale, afin que la <strong>Performance<\/strong> augmente r\u00e9ellement.<\/p>\n\n<h2>\u00c9viction, r\u00e9cup\u00e9ration et pression de m\u00e9moire<\/h2>\n\n<p>En cas de charge \u00e9lev\u00e9e, le noyau classe les pages en deux cat\u00e9gories : actives et inactives <strong>Listes LRU<\/strong> et supprime progressivement les candidats du cache. Ce processus de r\u00e9cup\u00e9ration r\u00e9agit \u00e0 la pression r\u00e9sultant d'une demande croissante des processus, des limites impos\u00e9es par les cgroups ou des temps d'attente d'E\/S. Si mon syst\u00e8me de surveillance d\u00e9tecte une augmentation des \u00e9victions parall\u00e8lement \u00e0 une hausse de la charge d\u2019E\/S, j\u2019en conclus que l\u2019ensemble de donn\u00e9es de travail est plus volumineux que la m\u00e9moire vive disponible. Dans de telles situations, j\u2019\u00e9value s\u2019il convient d\u2019isoler certaines charges de travail, de modifier les strat\u00e9gies de mise en cache ou d\u2019augmenter la capacit\u00e9 de m\u00e9moire. Pour mieux comprendre les r\u00e8gles de lib\u00e9ration de m\u00e9moire, je m'appuie sur un guide structur\u00e9 traitant des <a href=\"https:\/\/webhosting.de\/fr\/pression-memoire-noyau-linux-optimisation-des-systemes-dhebergement-ram\/\">Pression du r\u00e9servoir<\/a>, afin d'interpr\u00e9ter correctement les sympt\u00f4mes et de pr\u00e9voir les mesures \u00e0 prendre.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/linux_cache_performance_8372.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>En pratique : v\u00e9rifications rapides et commandes<\/h2>\n\n<p>Pour donner une premi\u00e8re impression, je commence par <code>free -h<\/code> et lis la partie <strong>m\u00e9moire tampon\/cache<\/strong>, avant d'aller plus loin. Ensuite, je compare deux ex\u00e9cutions d'une analyse de fichier, par exemple avec <code>trouver<\/code> ou un benchmark, et observe la diff\u00e9rence de temps entre le d\u00e9marrage \u00e0 froid et le d\u00e9marrage \u00e0 chaud. <code>grep -E \"Cached|Dirty|Writeback\" \/proc\/meminfo<\/code> me montre la quantit\u00e9 de donn\u00e9es stock\u00e9es dans le cache et ce qui reste \u00e0 \u00e9crire. <code>iostat -xz 1<\/code> r\u00e9v\u00e8le le niveau d'utilisation des appareils et indique si la file d'attente diminue d\u00e8s que la mise en cache entre en action. Si vous souhaitez en savoir plus sur les principes de base de la mise en cache, vous trouverez un aper\u00e7u dans <a href=\"https:\/\/webhosting.de\/fr\/systeme-de-fichiers-mise-en-cache-linux-cache-de-page-cacheboost\/\">Mise en cache du syst\u00e8me de fichiers<\/a> une introduction accessible qui explique l'interaction entre le VFS et la m\u00e9moire tampon RAM.<\/p>\n\n<h2>Dissiper les malentendus courants<\/h2>\n\n<p>\u201e La m\u00e9moire RAM est pleine, le serveur a un probl\u00e8me \u201c, j'entends souvent cela, mais le <strong>Cache<\/strong> C'est l\u00e0 la r\u00e9ponse, pas la cause. Linux lib\u00e8re la m\u00e9moire de mani\u00e8re flexible lorsque les applications l'utilisent, et la r\u00e9utilise d\u00e8s que de nouvelles donn\u00e9es y sont mises en cache. Le vidage manuel via <code>echo 3 &gt; \/proc\/sys\/vm\/drop_caches<\/code> apporte rarement un b\u00e9n\u00e9fice durable et fausse les mesures. Il est plus judicieux d\u2019identifier les v\u00e9ritables goulots d\u2019\u00e9tranglement et d\u2019all\u00e9ger la charge sur les chemins d\u2019E\/S \u00e0 ces endroits. Je fais \u00e9galement la distinction entre le cache de pages et les caches \u00ab slab \u00bb pour les dentries\/inodes, afin de ne pas avoir deux <strong>M\u00e9canismes<\/strong> je les mets dans une casserole.<\/p>\n\n<h2>Options de montage et subtilit\u00e9s du syst\u00e8me de fichiers<\/h2>\n\n<p>Je tiens compte du fait que les options du syst\u00e8me de fichiers et de montage ont une forte incidence sur l'efficacit\u00e9 du cache de pages. <strong>atime<\/strong>- Les mises \u00e0 jour g\u00e9n\u00e8rent des \u00e9critures suppl\u00e9mentaires ; avec <em>relatime<\/em> (ce qui est aujourd'hui la norme), je les r\u00e9duis, <em>noatime<\/em> Je fais encore plus d'\u00e9conomies si je ne suis jamais tributaire des horaires d'acc\u00e8s. <strong>sync<\/strong> et <strong>dirsync<\/strong> Ils imposent une persistance imm\u00e9diate et annulent les avantages du \u00ab write-back \u00bb \u2013 ce qui est justifi\u00e9 pour les m\u00e9tadonn\u00e9es pour lesquelles la latence est critique, mais sinon, je les \u00e9vite. Modes de journalisation (par exemple avec ext4 <em>data=ordonn\u00e9<\/em> vs. <em>writeback<\/em>) d\u00e9terminent si les donn\u00e9es utiles sont stock\u00e9es sur le support avant ou apr\u00e8s les m\u00e9tadonn\u00e9es ; je privil\u00e9gie la s\u00e9curit\u00e9 \u00e0 une performance illusoire. XFS et btrfs se comportent diff\u00e9remment en mati\u00e8re de m\u00e9tadonn\u00e9es et de CoW : le CoW, la compression ou la d\u00e9duplication permettent d'\u00e9conomiser des E\/S, mais peuvent solliciter le processeur. Je mesure donc les charges de travail de mani\u00e8re r\u00e9aliste et je d\u00e9cide si les options de montage correspondent au profil d'acc\u00e8s.<\/p>\n\n<h2>Conteneurs, machines virtuelles et caches dupliqu\u00e9s<\/h2>\n\n<p>Dans les conteneurs, tous les processus partagent le m\u00eame noyau \u2013 et donc \u00e9galement le m\u00eame cache de pages. Cela facilite le partage des fichiers fr\u00e9quemment utilis\u00e9s (par exemple, les biblioth\u00e8ques), mais des limites strictes impos\u00e9es par les cgroups (<em>memory.max<\/em>) peuvent \u00e9vincer pr\u00e9matur\u00e9ment les pages mises en cache. Je pr\u00e9vois une marge par service et j'utilise <em>memory.low<\/em>, afin d'offrir une certaine protection aux caches importants. Dans les machines virtuelles, il existe <strong>deux<\/strong> Caches : dans le client et, le cas \u00e9ch\u00e9ant, chez l\u2019h\u00f4te (pour les sauvegardes de fichiers). Cela entra\u00eene une mise en m\u00e9moire tampon double. Si j\u2019utilise des p\u00e9riph\u00e9riques bruts ou le stockage direct, j\u2019\u00e9vite le cache de l\u2019h\u00f4te, mais je perds ses avantages. Le ballooning et l\u2019overcommit influencent la r\u00e9cup\u00e9ration de m\u00e9moire dans l\u2019invit\u00e9 : je surveille si un ballooning constant entra\u00eene un cache thrashing, et j\u2019ajuste les ressources ou le dimensionnement en cons\u00e9quence. Avec le stockage en conteneurs (OverlayFS), je pr\u00e9chauffe de mani\u00e8re cibl\u00e9e les couches fr\u00e9quemment utilis\u00e9es afin que les d\u00e9ploiements ne d\u00e9marrent pas \u00e0 froid.<\/p>\n\n<h2>NUMA, cgroups et isolation<\/h2>\n\n<p>Sur les syst\u00e8mes NUMA, le noyau g\u00e8re des listes LRU par n\u0153ud. Si les threads effectuent principalement des acc\u00e8s locaux, les coups de cache de page <strong>numa-nah<\/strong> et r\u00e9duisons la latence. Gr\u00e2ce \u00e0 l'affinit\u00e9 CPU et m\u00e9moire, je veille \u00e0 ce qu'une application et ses donn\u00e9es soient proches les unes des autres. Via <strong>memcg<\/strong> (cgroups v2), le cache de pages est attribu\u00e9 \u00e0 un groupe ; avec <em>memory.high<\/em> je d\u00e9clenche une r\u00e9cup\u00e9ration contr\u00f4l\u00e9e, avec <em>memory.max<\/em> je fixe des limites strictes et avec <em>memory.low<\/em> Je donne la priorit\u00e9 aux services importants. Ces outils permettent d'\u00e9viter qu'une t\u00e2che batch bruyante ne vide le cache d'un service web sensible \u00e0 la latence. L'isolation facilite la planification, mais je veille \u00e0 trouver un \u00e9quilibre afin d'\u00e9viter la cr\u00e9ation d'un trop grand nombre de petits caches qui, pris individuellement, n'enregistrent pas suffisamment de succ\u00e8s.<\/p>\n\n<h2>SSD, HDD et la lecture anticip\u00e9e en pratique<\/h2>\n\n<p>Le readahead est un atout pour les acc\u00e8s s\u00e9quentiels, mais souvent un simple frein pour les acc\u00e8s al\u00e9atoires. Sur les disques durs (HDD), j\u2019augmente g\u00e9n\u00e9ralement le readahead afin d\u2019acc\u00e9l\u00e9rer les balayages lin\u00e9aires. Sur les SSD NVMe rapides, l\u2019avantage est moindre ; un readahead trop important gaspille de la m\u00e9moire vive (RAM) et r\u00e9duit le taux de r\u00e9ussite du cache, car les pages inutilis\u00e9es \u00e9vincent les autres. J\u2019ajuste la pr\u00e9lecture pour chaque p\u00e9riph\u00e9rique et je v\u00e9rifie, \u00e0 l\u2019aide de tests r\u00e9p\u00e9t\u00e9s, si le d\u00e9bit ou les latences s\u2019en trouvent am\u00e9lior\u00e9s. Je tiens \u00e9galement compte du planificateur d\u2019E\/S : pour les disques NVMe, \u201e none \u201c\/\u201e mq-deadline \u201c est courant, tandis que les disques durs peuvent b\u00e9n\u00e9ficier d\u2019un planificateur de type \u00ab deadline \u00bb. Le cache de pages lisse les profils d\u2019E\/S, mais la couche de blocs doit s\u2019y adapter. L\u2019objectif reste que le cache contienne principalement des donn\u00e9es utiles et r\u00e9utilis\u00e9es \u2013 et non pas simplement des octets pr\u00e9charg\u00e9s.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/linux-page-cache-performance-4827.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>D\u00e9marrages \u00e0 froid, pr\u00e9chauffage et d\u00e9ploiements<\/h2>\n\n<p>Chaque cache a besoin d'une phase de pr\u00e9chauffage. Apr\u00e8s un red\u00e9marrage ou un d\u00e9ploiement, je lis de mani\u00e8re cibl\u00e9e les hotsets, par exemple en parcourant une fois de mani\u00e8re s\u00e9quentielle les r\u00e9pertoires importants. Cela r\u00e9duit sensiblement le \u201e temps de d\u00e9marrage \u201c apr\u00e8s les d\u00e9ploiements. Dans le cadre de strat\u00e9gies de d\u00e9ploiement progressif, je maintiens au moins une instance \u00ab chaude \u00bb en ligne afin que le service global r\u00e9ponde rapidement pendant que les nouvelles instances remplissent leur cache. J\u2019\u00e9vite les modifications massives de l\u2019arborescence des fichiers (par exemple, les changements de chemins d\u2019acc\u00e8s), car cela \u00ab refroidit \u00bb les dentries\/inodes. Je pr\u00e9f\u00e8re utiliser des changements de liens symboliques atomiques ou des strat\u00e9gies de \u00ab copy-on-write \u00bb, dans lesquelles le contenu des fichiers et les chemins d\u2019acc\u00e8s restent largement stables. Ainsi, non seulement le cache de pages reste efficace, mais les caches de m\u00e9tadonn\u00e9es conservent \u00e9galement leur efficacit\u00e9.<\/p>\n\n<h2>Param\u00e8tres de mesure en profondeur<\/h2>\n\n<p>En plus de <code>\/proc\/meminfo<\/code> pour \u00e9tablir un diagnostic pr\u00e9cis, je jette un \u0153il \u00e0 <code>\/proc\/vmstat<\/code>: des compteurs tels que <em>pgfault<\/em> et <em>pgmajfault<\/em> distinguent les \u00ab page faults \u00bb l\u00e9g\u00e8res des \u00ab page faults \u00bb graves, <em>nr_active_file<\/em>\/<em>nr_inactive_file<\/em> indiquent la taille du jeu de travail bas\u00e9 sur les fichiers, et <em>workingset_refault<\/em> permet de d\u00e9tecter le \u00ab thrashing \u00bb. Si le nombre de \u00ab refaults \u00bb augmente alors que le d\u00e9bit d'E\/S de l'appareil reste \u00e9lev\u00e9, cela signifie que le bloc de travail ne tient pas dans la RAM. Je r\u00e9alise mes tests en effectuant deux ex\u00e9cutions de la m\u00eame charge de travail : la deuxi\u00e8me ex\u00e9cution devrait \u00eatre nettement plus rapide si le cache est efficace. Pour garantir la reproductibilit\u00e9 des tests de d\u00e9marrage \u00e0 froid, je vide les caches exclusivement en environnement de laboratoire et je documente soigneusement cette op\u00e9ration afin de ne pas fausser les mesures en production. Il est important pour moi de ne pas surinterpr\u00e9ter un indicateur isol\u00e9, mais plut\u00f4t d\u2019identifier des tendances \u00e0 travers des s\u00e9ries chronologiques.<\/p>\n\n<h2>\u00c9viter le swap, le \u00ab swappiness \u00bb et le \u00ab thrashing \u00bb<\/h2>\n\n<p>Sous pression, Linux vide d'abord le cache de pages avant de se tourner vers les pages anonymes \u2013 tant que cela reste judicieux. Lorsque la m\u00e9moire vive vient \u00e0 manquer pour les processus et que les pages anonymes ne sont pas suffisamment disponibles, le syst\u00e8me commence \u00e0 utiliser la m\u00e9moire de pagination. Une <strong>trop faible<\/strong> Le \u00ab swappiness \u00bb peut entra\u00eener une gestion trop agressive de la m\u00e9moire anonyme importante (heaps\/stacks) et, par cons\u00e9quent, l'\u00e9viction de pages de cache utiles, ce qui augmente les op\u00e9rations d'E\/S. Une <strong>trop \u00e9lev\u00e9e<\/strong> \u00c0 l'inverse, une valeur trop \u00e9lev\u00e9e de \u00ab Swappiness \u00bb entra\u00eene un transfert plus pr\u00e9coce vers le disque et des pics de latence. Je choisis des valeurs mod\u00e9r\u00e9es, je mesure et j'observe : l'objectif est que mon \u00ab hotset \u00bb reste en m\u00e9moire vive et que seules les donn\u00e9es \u00ab froides \u00bb, rarement utilis\u00e9es, soient transf\u00e9r\u00e9es vers le disque au d\u00e9triment de la m\u00e9moire swap \u2013 jamais les donn\u00e9es \u00ab chaudes \u00bb.<\/p>\n\n<h2>S\u00e9curit\u00e9 et p\u00e9rennit\u00e9 : les donn\u00e9es sur le support<\/h2>\n\n<p>La r\u00e9\u00e9criture en m\u00e9moire vive am\u00e9liore les performances, mais cr\u00e9e une br\u00e8ve p\u00e9riode pendant laquelle les modifications ne sont stock\u00e9es qu'en m\u00e9moire vive. Pour les donn\u00e9es qui doivent \u00eatre conserv\u00e9es imm\u00e9diatement, j'utilise <code>fsync()<\/code> ou <code>fdatasync()<\/code>. Je m'en tiens \u00e9galement \u00e0 des param\u00e8tres par d\u00e9faut s\u00fbrs, tels que les barri\u00e8res d'\u00e9criture et la journalisation ; j'\u00e9vite les options risqu\u00e9es qui d\u00e9sactivent ces barri\u00e8res. Au niveau du stockage, je pr\u00eate attention aux caches des contr\u00f4leurs : les politiques de r\u00e9\u00e9criture diff\u00e9r\u00e9e (write-back) avec batterie de secours ou condensateur sont rapides et s\u00fbres, tandis que les caches non s\u00e9curis\u00e9s sans protection sont risqu\u00e9s. \u00c0 l'\u00e9chelle du syst\u00e8me, je force <code>sync<\/code> le vidage de toutes les donn\u00e9es \u2013 un outil rudimentaire que j'utilise \u00e0 bon escient et rarement. Je combine ainsi la rapidit\u00e9 offerte par le cache de page avec une persistance propre l\u00e0 o\u00f9 elle est essentielle \u00e0 l'activit\u00e9.<\/p>\n\n<h2>WordPress et les piles web : astuces pratiques<\/h2>\n\n<p>Dans la pile Web, les caches s'additionnent : le cache de pages Linux acc\u00e9l\u00e8re les ressources statiques, les fichiers PHP et les configurations, tandis qu'un cache OpCode PHP conserve le chemin d'ex\u00e9cution et le bytecode en m\u00e9moire. Je veille \u00e0 ce que les d\u00e9ploiements ne modifient pas constamment le chemin d'acc\u00e8s au code et je r\u00e9duis les acc\u00e8s aux fichiers en regroupant les ressources. Une couche de cache d'objets persistante r\u00e9duit les E\/S de la base de donn\u00e9es, ce qui permet au cache du syst\u00e8me de fichiers de g\u00e9rer encore plus efficacement les fichiers \u00ab chauds \u00bb restants. Dans la mesure du possible, je ne stocke pas les sessions et les donn\u00e9es transitoires sur le disque local, mais dans des caches en m\u00e9moire ou en r\u00e9seau, afin que le cache de page puisse exploiter pleinement ses atouts pour les autres fichiers fr\u00e9quemment consult\u00e9s. R\u00e9sultat : moins d\u2019E\/S physiques, des r\u00e9ponses plus rapides et des latences plus stables.<\/p>\n\n<h2>En bref<\/h2>\n\n<p>Le cache de pages Linux me fournit des r\u00e9ponses rapides concernant les fichiers <strong>RAM<\/strong> et r\u00e9duit consid\u00e9rablement les acc\u00e8s co\u00fbteux au support de donn\u00e9es. Les \u00ab Lesehits \u00bb acc\u00e9l\u00e8rent les applications, tandis que le \u00ab Write-back \u00bb regroupe de nombreuses \u00e9critures individuelles et am\u00e9liore l'efficacit\u00e9. La m\u00e9moire libre n'est pas laiss\u00e9e inoccup\u00e9e, mais sert de cache pour une plateforme r\u00e9active. Avec des indicateurs tels que <code>free -h<\/code>, <code>\/proc\/meminfo<\/code> et <code>iostat<\/code> je per\u00e7ois l'effet avant m\u00eame de prendre en compte des param\u00e8tres tels que <code>vm.dirty_ratio<\/code> ou <code>vm.vfs_cache_pressure<\/code> allez-y. Ceux qui connaissent bien les charges de travail, testent les modifications de mani\u00e8re contr\u00f4l\u00e9e et utilisent le cache de fa\u00e7on cibl\u00e9e obtiennent une am\u00e9lioration sensible <strong>Performance<\/strong> sans modification du code.<\/p>","protected":false},"excerpt":{"rendered":"<p>Le cache de pages Linux utilise la m\u00e9moire vive (RAM) comme cache, ce qui am\u00e9liore les performances du serveur en mati\u00e8re d'h\u00e9bergement web, de WordPress et d'acc\u00e8s aux fichiers.<\/p>","protected":false},"author":1,"featured_media":20533,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[676],"tags":[],"class_list":["post-20540","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-server_vm"],"acf":[],"_wp_attached_file":null,"_wp_attachment_metadata":null,"litespeed-optimize-size":null,"litespeed-optimize-set":null,"_elementor_source_image_hash":null,"_wp_attachment_image_alt":null,"stockpack_author_name":null,"stockpack_author_url":null,"stockpack_provider":null,"stockpack_image_url":null,"stockpack_license":null,"stockpack_license_url":null,"stockpack_modification":null,"color":null,"original_id":null,"original_url":null,"original_link":null,"unsplash_location":null,"unsplash_sponsor":null,"unsplash_exif":null,"unsplash_attachment_metadata":null,"_elementor_is_screenshot":null,"surfer_file_name":null,"surfer_file_original_url":null,"envato_tk_source_kit":null,"envato_tk_source_index":null,"envato_tk_manifest":null,"envato_tk_folder_name":null,"envato_tk_builder":null,"envato_elements_download_event":null,"_menu_item_type":null,"_menu_item_menu_item_parent":null,"_menu_item_object_id":null,"_menu_item_object":null,"_menu_item_target":null,"_menu_item_classes":null,"_menu_item_xfn":null,"_menu_item_url":null,"_trp_menu_languages":null,"rank_math_primary_category":null,"rank_math_title":null,"inline_featured_image":null,"_yoast_wpseo_primary_category":null,"rank_math_schema_blogposting":null,"rank_math_schema_videoobject":null,"_oembed_049c719bc4a9f89deaead66a7da9fddc":null,"_oembed_time_049c719bc4a9f89deaead66a7da9fddc":null,"_yoast_wpseo_focuskw":null,"_yoast_wpseo_linkdex":null,"_oembed_27e3473bf8bec795fbeb3a9d38489348":null,"_oembed_c3b0f6959478faf92a1f343d8f96b19e":null,"_trp_translated_slug_en_us":null,"_wp_desired_post_slug":null,"_yoast_wpseo_title":null,"tldname":null,"tldpreis":null,"tldrubrik":null,"tldpolicylink":null,"tldsize":null,"tldregistrierungsdauer":null,"tldtransfer":null,"tldwhoisprivacy":null,"tldregistrarchange":null,"tldregistrantchange":null,"tldwhoisupdate":null,"tldnameserverupdate":null,"tlddeletesofort":null,"tlddeleteexpire":null,"tldumlaute":null,"tldrestore":null,"tldsubcategory":null,"tldbildname":null,"tldbildurl":null,"tldclean":null,"tldcategory":null,"tldpolicy":null,"tldbesonderheiten":null,"tld_bedeutung":null,"_oembed_d167040d816d8f94c072940c8009f5f8":null,"_oembed_b0a0fa59ef14f8870da2c63f2027d064":null,"_oembed_4792fa4dfb2a8f09ab950a73b7f313ba":null,"_oembed_33ceb1fe54a8ab775d9410abf699878d":null,"_oembed_fd7014d14d919b45ec004937c0db9335":null,"_oembed_21a029d076783ec3e8042698c351bd7e":null,"_oembed_be5ea8a0c7b18e658f08cc571a909452":null,"_oembed_a9ca7a298b19f9b48ec5914e010294d2":null,"_oembed_f8db6b27d08a2bb1f920e7647808899a":null,"_oembed_168ebde5096e77d8a89326519af9e022":null,"_oembed_cdb76f1b345b42743edfe25481b6f98f":null,"_oembed_87b0613611ae54e86e8864265404b0a1":null,"_oembed_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_oembed_time_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_tldname":null,"_tldclean":null,"_tldpreis":null,"_tldcategory":null,"_tldsubcategory":null,"_tldpolicy":null,"_tldpolicylink":null,"_tldsize":null,"_tldregistrierungsdauer":null,"_tldtransfer":null,"_tldwhoisprivacy":null,"_tldregistrarchange":null,"_tldregistrantchange":null,"_tldwhoisupdate":null,"_tldnameserverupdate":null,"_tlddeletesofort":null,"_tlddeleteexpire":null,"_tldumlaute":null,"_tldrestore":null,"_tldbildname":null,"_tldbildurl":null,"_tld_bedeutung":null,"_tldbesonderheiten":null,"_oembed_ad96e4112edb9f8ffa35731d4098bc6b":null,"_oembed_8357e2b8a2575c74ed5978f262a10126":null,"_oembed_3d5fea5103dd0d22ec5d6a33eff7f863":null,"_eael_widget_elements":null,"_oembed_0d8a206f09633e3d62b95a15a4dd0487":null,"_oembed_time_0d8a206f09633e3d62b95a15a4dd0487":null,"_aioseo_description":null,"_eb_attr":null,"_eb_data_table":null,"_oembed_819a879e7da16dd629cfd15a97334c8a":null,"_oembed_time_819a879e7da16dd629cfd15a97334c8a":null,"_acf_changed":null,"_wpcode_auto_insert":null,"_edit_last":null,"_edit_lock":null,"_oembed_e7b913c6c84084ed9702cb4feb012ddd":null,"_oembed_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_time_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_03514b67990db061d7c4672de26dc514":null,"_oembed_time_03514b67990db061d7c4672de26dc514":null,"rank_math_news_sitemap_robots":null,"rank_math_robots":null,"_eael_post_view_count":"151","_trp_automatically_translated_slug_ru_ru":null,"_trp_automatically_translated_slug_et":null,"_trp_automatically_translated_slug_lv":null,"_trp_automatically_translated_slug_fr_fr":null,"_trp_automatically_translated_slug_en_us":null,"_wp_old_slug":null,"_trp_automatically_translated_slug_da_dk":null,"_trp_automatically_translated_slug_pl_pl":null,"_trp_automatically_translated_slug_es_es":null,"_trp_automatically_translated_slug_hu_hu":null,"_trp_automatically_translated_slug_fi":null,"_trp_automatically_translated_slug_ja":null,"_trp_automatically_translated_slug_lt_lt":null,"_elementor_edit_mode":null,"_elementor_template_type":null,"_elementor_version":null,"_elementor_pro_version":null,"_wp_page_template":null,"_elementor_page_settings":null,"_elementor_data":null,"_elementor_css":null,"_elementor_conditions":null,"_happyaddons_elements_cache":null,"_oembed_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_time_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_time_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_59808117857ddf57e478a31d79f76e4d":null,"_oembed_time_59808117857ddf57e478a31d79f76e4d":null,"_oembed_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_time_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_81002f7ee3604f645db4ebcfd1912acf":null,"_oembed_time_81002f7ee3604f645db4ebcfd1912acf":null,"_elementor_screenshot":null,"_oembed_7ea3429961cf98fa85da9747683af827":null,"_oembed_time_7ea3429961cf98fa85da9747683af827":null,"_elementor_controls_usage":null,"_elementor_page_assets":null,"_elementor_screenshot_failed":null,"theplus_transient_widgets":null,"_eael_custom_js":null,"_wp_old_date":null,"_trp_automatically_translated_slug_it_it":null,"_trp_automatically_translated_slug_pt_pt":null,"_trp_automatically_translated_slug_zh_cn":null,"_trp_automatically_translated_slug_nl_nl":null,"_trp_automatically_translated_slug_pt_br":null,"_trp_automatically_translated_slug_sv_se":null,"rank_math_analytic_object_id":null,"rank_math_internal_links_processed":"1","_trp_automatically_translated_slug_ro_ro":null,"_trp_automatically_translated_slug_sk_sk":null,"_trp_automatically_translated_slug_bg_bg":null,"_trp_automatically_translated_slug_sl_si":null,"litespeed_vpi_list":null,"litespeed_vpi_list_mobile":null,"rank_math_seo_score":null,"rank_math_contentai_score":null,"ilj_limitincominglinks":null,"ilj_maxincominglinks":null,"ilj_limitoutgoinglinks":null,"ilj_maxoutgoinglinks":null,"ilj_limitlinksperparagraph":null,"ilj_linksperparagraph":null,"ilj_blacklistdefinition":null,"ilj_linkdefinition":null,"_eb_reusable_block_ids":null,"rank_math_focus_keyword":"Linux Page","rank_math_og_content_image":null,"_yoast_wpseo_metadesc":null,"_yoast_wpseo_content_score":null,"_yoast_wpseo_focuskeywords":null,"_yoast_wpseo_keywordsynonyms":null,"_yoast_wpseo_estimated-reading-time-minutes":null,"rank_math_description":null,"surfer_last_post_update":null,"surfer_last_post_update_direction":null,"surfer_keywords":null,"surfer_location":null,"surfer_draft_id":null,"surfer_permalink_hash":null,"surfer_scrape_ready":null,"_thumbnail_id":"20533","footnotes":null,"_links":{"self":[{"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/posts\/20540","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/comments?post=20540"}],"version-history":[{"count":0,"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/posts\/20540\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/media\/20533"}],"wp:attachment":[{"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/media?parent=20540"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/categories?post=20540"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/tags?post=20540"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}