web-dev-qa-db-fra.com

Utilisation de O_Direct sur Linux

Si cette question est trop orientée programmée, faites le moi savoir. Je me demande s'il y a des gens familiers avec le drapeau O_Direct pour l'appel du système Open () sur Linux 2.6? Linus disparaît son utilisation, mais l'écriture de fichiers de performance élevée semble indiquer son utilisation. J'aimerais connaître toute expérience et recommandations du monde réel.

Plus d'infos: L'application que j'utilise DO maintienne son propre cache et, dans le cas, obtient une moyenne de 5x ou plus. Lorsque vous écrivez dans le fichier, le contenu du cache doit être écrit dans le cache du système de fichiers, qui semble redondant et une préoccupation de performance.

24
casualunixer

Ok, vous demandez des expériences, cela rend la question un peu subjective et argumentative, mais passable.

Linus a déclaré que faire référence aux utilisations que les gens attribuent généralement O_Direct et pour ces utilisations, IMO Linus est principalement correcte. Même si vous dirigez directement des E/S, vous ne pouvez pas transférer des données sur/à partir de périphériques directement sur vos relevés de programme, vous avez besoin d'un tampon rempli (par le programme ou du périphérique) et transféré par un appel système à l'autre extrémité. De plus, pour rendre cela efficace, vous ne voudrez pas relire quelque chose que vous venez de lire déjà, au cas où vous en auriez besoin. Vous avez donc besoin d'une sorte de cache ... et il est exactement que le noyau fournit sans O_Direct, un cache de page! Pourquoi ne pas utiliser ça? Il vient également avec des avantages si plus de processus souhaitent accéder simultanément au même fichier, ce serait une catastrophe avec O_Direct.

Cela dit, O_Direct a ses utilisations: si pour une raison quelconque, vous devez obtenir des données directement à partir du périphérique de bloc. Cela n'a rien à voir avec la performance.

Les personnes utilisant O_Direct pour la performance proviennent généralement de systèmes avec des algorithmes de cache de page Bad page, ou sans mécanismes de conseil POSIX, ni même des personnes qui ont répété de manière influe ce que les autres ont dit. Pour éviter ces problèmes, O_Direct était une solution. Linux, OTOH, a la philosophie que vous devriez résoudre le problème réel sous-jacent et le problème sous-jacent était OSS qui a fait un mauvais travail avec la mise en cache de page.

J'ai utilisé O_Direct pour une simple implication du chat pour trouver une erreur de mémoire dans ma machine. Ceci est une utilisation valide pour O_Direct. Cela n'avait rien à voir avec la performance.

17
Juliano

Réellement, O_DIRECTest nécessaire pour éviter l'un des

  • Pollution cache - Parfois, vous savez qu'il n'y a aucun sens dans les frais généraux avec la mise en cache, pour e. g. Lorsque vous traitez avec des fichiers vraiment volumineux, disons 64 GiB quand il n'y a que 2 GiB de RAM. Fichier torrent de 32 GiB= Lequel un utilisateur a décidé de vérifier ne semble pas être un bon candidat à la mise en cache. C'est juste une activité supplémentaire avec ses propres frais généraux. Et cela peut entraîner une élaboration de données vraiment utiles de cache.
  • double mise en cache - pour e. g. Certains RDBMSES (MySQL à mentionner) permet de définir son propre cache. Les bases de données cosurellement savoir mieux comment mettre en cache et quoi, que la mémoire virtuelle de la noyau qui ne connaît rien à propos de la planification SQL et ainsi de suite.

- Ce qui n'est pas bon, comme il semble. Et O_DIRECT ne signifie pas être plus rapide, souvent ce n'est pas .

14
poige

Notez que l'utilisation O_DIRECT est susceptible d'échouer dans les nouveaux noyaux avec de nouveaux systèmes de fichiers. Voir Ce rapport de bogue par exemple. Donc, non seulement l'utilisation est souvent douteuse, elle ne fonctionnera probablement pas du tout dans la génération à venir de distributions Linux. Donc, je ne parierais pas la performance de mon code, même si vous étiez en mesure de prouver que cela pourrait avoir un avantage.

6
Peter Eisentraut

Relatif à ce que @juliano a déjà dit.

Vérifier posix_fadvise Si le problème réel est une mauvaise conduite d'algorithme de cache de fichiers sous-jacents, vous pouvez essayer de lui donner des conseils, comment allez-vous utiliser le système de fichiers. Pour les FS joliment mis en œuvre, il devrait donner une augmentation de la performance. (Voici un lien vers un autre sujet touchant des considérations similaires https://stackoverflow.com/a/3755818/544721 )

3