SysadminNews

Linux 7.3 apporte RWF_DONTCACHE aux périphériques bloc

Sur cette page
  1. Le drapeau, en bref
  2. Pourquoi le bloc demandait un travail séparé
  3. D'où viennent les 65 pour cent
  4. Le reste de la fusion
  5. Ce que nous ferions
  6. Sources et pour aller plus loin

Les changements bloc et io_uring fusionnés pour Linux 7.3 contiennent une nouveauté que toute personne exploitant une base de données sur un périphérique brut devrait noter : RWF_DONTCACHE fonctionne désormais sur les périphériques bloc. Ce drapeau donne des entrées sorties tamponnées qui purgent leurs pages du cache de pages dès la fin de l'opération, ce qui offre la simplicité des lectures et écritures tamponnées sans laisser derrière soi un cache rempli de données que personne ne relira. Tal Zussman a activé le chemin périphérique bloc et rapporte des gains en lecture comme en écriture sur un disque unique en machine virtuelle. La même fusion apporte l'allocation dynamique des zones pour la réception sans copie d'io_uring.

The short answer

Linux 7.3 étend RWF_DONTCACHE, le drapeau d'entrées sorties tamponnées sans cache, aux périphériques bloc bruts. Le drapeau exécute des entrées sorties tamponnées ordinaires mais purge les pages touchées dès la fin de l'opération, de sorte que les charges lourdes cessent de remplir le cache de pages avec des données que personne ne relira. Tal Zussman a activé le chemin périphérique bloc et rapporte des gains en lecture et en écriture sur un disque unique en machine virtuelle. Le public évident : les bases de données qui s'adressent directement à un disque.

Linux 6.14l'arrivée initiale de RWF_DONTCACHE
Linux 7.3la version qui étend le drapeau au bloc
65 %de débit gagné dans le travail initial
Carte réponse résumant les changements de la couche bloc de Linux 7.3 : prise en charge de RWF_DONTCACHE, entrées sorties tamponnées sans cache, sur les périphériques bloc grâce à Tal Zussman, ce qui convient aux bases de données sur périphérique brut, avec l'allocation dynamique des zones pour la réception sans copie d'io_uring et la parallélisation de la mise en service des files NVMe RDMA.
Ce qui arrive dans la couche bloc de Linux 7.3. PNG

Il existe une frustration particulière à exploiter une base de données qui gère son propre cache, puis à regarder le noyau bâtir consciencieusement une seconde copie de tout dans le cache de pages. Linux 7.3 supprime l'une des dernières raisons de recourir à O_DIRECT pour y échapper.

Le drapeau, en bref

RWF_DONTCACHE, ce sont des entrées sorties tamponnées qui font le ménage derrière elles. L'opération passe par le cache de pages exactement comme d'habitude, et les plages touchées sont purgées dès qu'elle se termine.

Cela paraît mineur et ne l'est pas. Le coût des entrées sorties tamponnées sur du stockage rapide n'est presque jamais la copie, c'est ce que les pages résiduelles font subir à la récupération mémoire ensuite. Remplissez assez de mémoire vive avec des pages que personne ne relira et kswapd se met au travail : vos temps d'entrée sortie prévisibles cessent alors de l'être. Purger à la complétion supprime la cause au lieu de régler le symptôme.

Cela se pose par opération, avec preadv2 ou pwritev2, ou dans io_uring en plaçant le drapeau dans sqe->rw_flags. Aucune option de montage, aucun interrupteur global, et c'est la bonne conception : l'application sait quelles lectures seront réutilisées, le noyau non.

Pourquoi le bloc demandait un travail séparé

L'implémentation d'origine était bâtie autour des entrées sorties de systèmes de fichiers. La couche iomap fournit l'essentiel de la machinerie, si bien que les systèmes de fichiers qui l'utilisent pleinement ont récupéré le drapeau presque gratuitement, tandis que ceux qui font davantage de travail propre, ext4 compris, ont demandé un effort supplémentaire.

L'accès à un périphérique bloc brut ne passe par aucun système de fichiers : il n'était donc jamais couvert. Tal Zussman a comblé ce trou pour Linux 7.3, avec des bénéfices en lecture et en écriture mesurés sur un périphérique bloc unique en machine virtuelle.

Le public est étroit et se reconnaîtra. Si vous exploitez PostgreSQL ou une autre base sur un système de fichiers, ce changement ne vous concerne pas. Si vous exploitez quelque chose qui adresse un disque directement, si.

Carte de contrôle pour la fusion bloc et io_uring de Linux 7.3 : RWF_DONTCACHE fonctionne désormais sur les périphériques bloc bruts, le drapeau se pose par opération via preadv2, pwritev2 ou io_uring plutôt que globalement, la réception sans copie d'io_uring gagne l'allocation dynamique des zones, l'allocation et le démarrage des files NVMe RDMA sont parallélisés, et un avertissement rappelle que les 65 pour cent proviennent du travail initial sur les systèmes de fichiers.
Ce qu'il faut retenir de cette fusion, et ce qu'il ne faut pas supposer. PNG

D'où viennent les 65 pour cent

Autant être précis, car le chiffre circule sans son contexte.

Jens Axboe avait proposé un mode tamponné sans cache sous le nom RWF_UNCACHED en 2019, sans suite. Il l'a relancé en novembre 2024, et RWF_DONTCACHE est arrivé dans Linux 6.14. Dans ce travail, il rapportait environ 65 pour cent de débit en plus en lecture comme en écriture, des temps d'entrée sortie parfaitement prévisibles, et une baisse substantielle du processeur sans aucune activité de récupération par kswapd.

Ces chiffres décrivent son montage de test sur le chemin système de fichiers, début 2025. Ils ne mesurent pas la nouvelle prise en charge des périphériques bloc, et ne promettent rien sur votre stockage. Voyez y la preuve que le mécanisme fonctionne, puis mesurez votre charge.

Le reste de la fusion

Côté io_uring, l'attention porte sur la réception sans copie, avec pour changement notable l'allocation dynamique des zones. Les zones mémoire peuvent désormais être allouées et fournies à la demande au lieu d'être préallouées statiquement, ce qui aide ceux qui devaient choisir entre gaspiller de la mémoire et plafonner le débit au moment du dimensionnement.

Côté bloc, on trouve la prise en charge de l'analyse de contexte de Clang pour le pilote hôte NVMe, la parallélisation de l'allocation et du démarrage des files d'entrée sortie NVMe RDMA, qui raccourcit la mise en service d'une cible attachée au tissu, des correctifs pour le matériel NVMe d'Apple, et un ensemble d'améliorations MD RAID.

Le stockage a connu un cycle solide dans 7.3 en général, avec notamment le travail sur les entrées sorties directes et fsync dans Btrfs, la prise en charge DAX de la mémoire attachée au tissu et l'interopérabilité Time Machine dans ksmbd.

Ce que nous ferions

Si vous maintenez une application qui lit ou écrit de gros volumes qu'elle ne touchera plus jamais, ingestion de journaux, sauvegarde, passes de somme de contrôle, restaurations massives, ce drapeau vaut une journée de travail, que vous soyez sur un périphérique bloc ou sur un système de fichiers. Comme il se pose par opération, vous pouvez l'appliquer aux chemins que vous savez être du flux continu et laisser le reste tranquille.

Si vous utilisiez O_DIRECT uniquement pour garder le cache de pages propre, c'est le moment de réexaminer ce choix. Vous portez peut être une gestion d'alignement et une complexité applicative qu'un drapeau supprime désormais.

Et si vous exploitez une base sur un périphérique brut, attendez que le noyau atteigne votre distribution, puis mesurez sérieusement, sur votre stockage et votre profil d'accès. Le mécanisme est sain. L'ampleur du gain, c'est à vous de la découvrir.

Sources et pour aller plus loin

Questions fréquentes

Que fait exactement RWF_DONTCACHE ?

Il fournit des entrées sorties tamponnées qui font le ménage derrière elles. Une lecture ou une écriture tamponnée ordinaire passe par le cache de pages et y laisse ses pages, ce qui est exactement souhaitable quand la donnée sera relue et exactement indésirable quand elle ne le sera pas. RWF_DONTCACHE effectue la même entrée sortie via le cache de pages mais purge les plages touchées dès la fin de l'opération, si bien que le cache ne se remplit pas de données sans valeur future. L'effet pratique est que la récupération mémoire a bien moins de travail, et c'est de là que vient le gain. On le pose par opération avec preadv2 ou pwritev2, ou dans io_uring en plaçant le drapeau dans sqe->rw_flags.

En quoi est ce différent d'O_DIRECT ?

O_DIRECT contourne entièrement le cache de pages, et cela se paie par des contraintes d'alignement sur les décalages, les longueurs et les tampons, des interactions délicates avec un accès tamponné au même fichier, et une bonne dose de complexité applicative. RWF_DONTCACHE garde le chemin tamponné, le noyau assurant la synchronisation comme d'habitude, et se contente de libérer les pages ensuite. Vous obtenez donc le principal bénéfice recherché avec O_DIRECT, l'absence de pollution du cache de pages, sans hériter des contraintes. Ce n'est pas un remplaçant d'O_DIRECT dans tous les cas, notamment quand une application veut gérer son propre cache avec un contrôle strict, mais cela supprime une raison courante de l'employer.

Pourquoi la prise en charge des périphériques bloc demandait elle un travail séparé ?

Parce que l'implémentation d'origine était bâtie autour des chemins d'entrée sortie des systèmes de fichiers. La couche iomap fournit l'essentiel de la mécanique, si bien que les systèmes de fichiers qui l'utilisent pleinement ont récupéré le drapeau presque gratuitement à son arrivée, tandis que ceux qui font davantage de travail propre, dont ext4, ont demandé un effort supplémentaire. L'accès à un périphérique bloc brut ne passe par aucun système de fichiers : il n'était donc tout simplement pas couvert. Le travail de Tal Zussman dans Linux 7.3 comble ce trou, et le public visé est précis : les bases de données et autres applications qui s'adressent directement à un disque.

D'où vient ce drapeau et quelles performances montrait il à l'origine ?

Jens Axboe a d'abord proposé un mode tamponné sans cache sous le nom RWF_UNCACHED en 2019, tentative restée sans suite. Il l'a relancé en novembre 2024 avec la série uncached buffered IO, et RWF_DONTCACHE est arrivé dans Linux 6.14. Dans ce travail initial, il rapportait environ 65 pour cent de débit en plus en lecture comme en écriture, des temps d'entrée sortie parfaitement prévisibles, et une réduction substantielle du processeur sans aucune activité de récupération par kswapd. Ces chiffres décrivent le chemin système de fichiers dans son montage de test, pas la nouvelle prise en charge des périphériques bloc : ne les transposez pas à votre cas sans mesurer.

Qu'y a t il d'autre dans la fusion bloc et io_uring de Linux 7.3 ?

Côté io_uring, l'attention porte sur la réception sans copie, et l'ajout notable est l'allocation dynamique des zones, qui permet d'allouer et de fournir les zones mémoire à la demande plutôt que de les préallouer statiquement. Cela compte pour qui dimensionne un service où l'allocation statique était soit du gaspillage, soit un plafond. Côté bloc, on trouve la prise en charge de l'analyse de contexte de Clang pour le pilote hôte NVMe, la parallélisation de l'allocation et du démarrage des files d'entrée sortie NVMe RDMA, ce qui raccourcit la mise en service d'une cible attachée au tissu, des correctifs pour le matériel NVMe d'Apple, et un ensemble d'améliorations pour MD RAID.