Lors de l'analyse des performances sur un code source, j'ai remarqué que CreateFile et fopen prenaient énormément de temps à terminer sur les fichiers distants. J'ai creusé plus loin avec wireshark, j'ai découvert que lorsque l'une des deux fonctions sont utilisées pour ouvrir un fichier à lire, tout le contenu du fichier (jusqu'à environ 4 Mo) sont en cours de lecture. Permettez-moi également de noter qu'aucune des deux fonctions ne revient tant que les opérations de lecture SMB2 ne sont pas terminées (ce qui représente environ 99% du temps d'appel écoulé).Fonctions C++ CreateFile et fopen permettant de lire de manière préemptive le fichier distant entier
Est-il possible d'empêcher ce comportement? Quelqu'un peut-il expliquer ce qui se passe ici?
.. ..
Exemple:
HANDLE h = ::CreateFile("\\\\Server1\\Data0\\CRUISE_DATA.bin", GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
De Wireshark:
SMB2 426 Créer une demande de fichier: Jim \ Data0 \ CRUISE_DATA.bin
SMB2 386 Créer réponse Fichier: Jim \ Data0 \ CRUISE_DATA.bin
SMB2 171 Lire Len Demande: 65536 Off: 0 Fichier: Jim \ Data0 \ CRUISE_DATA.bin
SMB2 1434 Réponse Lire
...
...
SMB2 171 Lire demande Len: 65536 Off: 3735552 fichier: Jim \ Data0 \ CRUISE_DATA.bin
SMB2 1434 Réponse Lire
Cela peut aussi valoir la peine d'essayer 'FILE_FLAG_OVERLAPPED' (mais sachez que cela change considérablement la sémantique des E/S). –
Merci pour vos suggestions! J'ai essayé toutes ces options et j'ai toujours le même comportement. Intéressant à noter ..... D'abord, les paquets SMB2 montrent qu'il lit le premier bloc de données 64k du fichier, procédé par le * dernier * bloc 64k, puis revient au bloc de données 2 * 64k et progresse jusqu'à 4MB. C'est presque comme si elle cherchait quelque chose. Deuxièmement, après l'appel CreateFile, j'ai effectué un appel ReadFile pour le premier bloc de données 1k dans le fichier. Devine quoi? Lance toujours une commande de lecture SMB2. En d'autres termes, si c'était en train de lire dans une cache, pourquoi est-ce que ça a recommencé? –