Qu’est-ce que posix_fadvise () args pour l’écriture de fichier séquentielle?

Je travaille sur une application qui écrit séquentiellement un fichier volumineux (et ne lit pas du tout), et j’aimerais utiliser posix_fadvise() pour optimiser le comportement du système de fichiers.

La description de la fonction dans la page de manuel suggère que la stratégie la plus appropriée serait POSIX_FADV_SEQUENTIAL . Cependant, la description de l’implémentation Linux doute que:

Sous Linux, POSIX_FADV_NORMAL définit la fenêtre de POSIX_FADV_NORMAL sur la taille par défaut du périphérique de sauvegarde. POSIX_FADV_SEQUENTIAL double cette taille et POSIX_FADV_RANDOM désactive POSIX_FADV_RANDOM fichier.

Comme je n’écris que des données (écrasant éventuellement des fichiers), je ne m’attends pas à une relecture. Devrais-je alors restr avec mon POSIX_FADV_SEQUENTIAL ou plutôt utiliser POSIX_FADV_RANDOM pour le désactiver?

Qu’en est-il des autres options, telles que POSIX_FADV_NOREUSE ? Ou peut-être que vous n’utilisez pas posix_fadvise() pour écrire?

Tout dépend de la localité temporelle de vos données. Si votre application n’a pas besoin des données peu de temps après leur écriture, vous pouvez utiliser POSIX_FADV_NOREUSE pour éviter l’écriture dans le cache (de la même manière que l’indicateur O_DIRECT de open() ).

La plupart des drapeaux posix_fadvise() (par exemple, POSIX_FADV_SEQUENTIAL et POSIX_FADV_RANDOM ) sont des indications sur le type “readahead” plutôt que sur l’écriture.

Linus nous a conseillé ici et ici d’obtenir de bonnes performances en écriture séquentielle. L’idée est de diviser le fichier en fenêtres de grande taille (8 Mo), puis de faire une boucle:

  • Ecrire la fenêtre N avec write() ;
  • Demander l’écriture asynchrone de la fenêtre N avec sync_file_range(..., SYNC_FILE_RANGE_WRITE)
  • Attendez la fin de l’écriture de la fenêtre N-1 avec sync_file_range(..., SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WRITE | SYNC_FILE_RANGE_WAIT_AFTER)
  • Supprime la fenêtre N-1 de la page de posix_fadvise(..., POSIX_FADV_DONTNEED) avec posix_fadvise(..., POSIX_FADV_DONTNEED)

De cette façon, vous ne disposez jamais de plus de deux fenêtres de données dans le cache de page, mais le kernel écrit toujours une partie du cache de la page sur le disque pendant que vous remplissez la partie suivante.

En ce qui concerne l’écriture, je pense que vous pouvez simplement compter sur le planificateur d’entrées / sorties sur disque des systèmes d’exploitation pour agir correctement.

Vous devriez garder à l’esprit que bien que posix_fadvise existe spécifiquement pour donner des indications au kernel sur les futurs modèles d’utilisation des fichiers, le kernel dispose également d’autres données pour l’aider.

Si vous n’ouvrez pas le fichier en lecture, il vous suffira de lire les blocs lorsqu’ils seront partiellement écrits. Si vous devez tronquer le fichier à 0, il n’est même pas obligé de le faire (vous avez dit que vous étiez en train d’écraser).