Lire un fichier sans mise en cache de disque sous Linux

J’ai un programme C qui ne s’exécute que chaque semaine et lit une grande quantité de fichiers une seule fois . Comme Linux met également en cache tout ce qui est lu, ils remplissent inutilement le cache, ce qui ralentit beaucoup le système à moins qu’il ne soit équipé d’un lecteur SSD.

Alors, comment puis-je ouvrir et lire à partir d’un fichier sans remplir le cache du disque?

Remarque:

Par cache de disque, je veux dire que lorsque vous lisez un fichier deux fois, la seconde fois, il est lu depuis la RAM, pas depuis le disque. C’est-à-dire que les données une fois lues sur le disque restnt dans la RAM, donc les lectures ultérieures du même fichier n’auront pas besoin de relire les données du disque.

Vous pouvez utiliser posix_fadvise() avec le conseil POSIX_FADV_DONTNEED pour demander au système de libérer les pages que vous avez déjà lues.

Je pense que passer O_DIRECT à open() devrait aider:

O_DIRECT (depuis Linux 2.4.10)

Essayez de minimiser les effets de cache des E / S sur ce fichier. En général, cela dégradera les performances, mais il est utile dans des situations spéciales, par exemple lorsque les applications effectuent leur propre mise en cache. Les E / S sur fichiers sont effectuées directement vers / depuis les tampons de l’espace utilisateur. L’indicateur O_DIRECT seul tente de transférer les données de manière synchrone, mais ne donne pas les garanties de O_SYNC que les données et les métadonnées nécessaires sont transférées. Pour garantir des E / S synchrones, O_SYNC doit être utilisé en plus de O_DIRECT.

Il y a d’autres notes détaillées sur O_DIRECT bas de la page de manuel , y compris une citation amusante de Linus.