2017-07-17 5 views
2

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

Répondre

0

Vous pouvez essayer certains des CreateFile options de fanion: FILE_FLAG_RANDOM_ACCESS et/ou FILE_FLAG_OPEN_NO_RECALL. FILE_FLAG_NO_BUFFERING peut également aider mais nécessite des E/S alignées sur le secteur.

Les versions les plus récentes de Visual Studio mappent R dans la chaîne de mode fopen à FILE_FLAG_RANDOM_ACCESS.

+0

Cela peut aussi valoir la peine d'essayer 'FILE_FLAG_OVERLAPPED' (mais sachez que cela change considérablement la sémantique des E/S). –

+0

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é? –

1

Il était définitivement à la recherche de quelque chose ... d'un balayage de virus en fait. Une fois que j'ai éteint mon scanner de virus et répété le test, le comportement est parti. Apparemment, la protection en temps réel analyse chaque fichier lorsqu'il est ouvert dans un processus donné. Le moins qu'il aurait pu faire est mis à jour le cache local;)

Ce problème nous a bloqué pendant un moment maintenant. Il se trouve que le lendemain de la publication de la question, la réponse tombe sur nos genoux. Quoi qu'il en soit, j'espère que cela aidera quelqu'un d'autre.