2017-06-15 3 views
0

Je travaille sur une servlet qui reçoit des pièces jointes dans un message en plusieurs parties HTTP POST. Ces fichiers doivent être stockés dans un système de fichiers monté. Tout cela fonctionne bien, seule la performance n'est pas ce que je m'attendais sur la base des tests d'E/S, j'ai couru sur le système de fichiers.Comment améliorer org.apache.commons.io.FileUtils copyInputStreamToFile dans le servlet

Sur ma machine j'ai 2 systèmes de fichiers, un système de fichiers FSA local et un système de fichiers CIFS FSB hébergé sur un autre hôte. Le FSB doit être utilisé lors de la mise en ligne, FSA utilisé pour comparer la performance de FSB. Lorsque je teste le débit et la latence du système de fichiers avec les commandes suivantes:

throughput dd if=/dev/zero of=$FS/test.img bs=1G count=1 oflag=dsync latence dd if=/dev/zero of=$FS/test.img bs=512 count=1000 oflag=dsync

je reçois les lectures suivantes;

  • FSA throughput 844MB/s, temps d'attente 590MB/s
  • FSB throughput 50,4MB/s, la latence 116Ko/s

Pour enregistrer le fichier sur le disque que je fais utiliser la méthode de copInputStreamToFile org.apache.commons.io.FileUtils. Il n'y a aucune possibilité d'utiliser JDK7 et supérieur et donc java.nio n'est pas une option.

// Register starttime of FileIO 
startTime = System.currentTimeMillis(); 

// Fastest way to write stream to file 
FileUtils.copyInputStreamToFile(formFieldStream, newFile); 
LOG.info(String.format("[Session: %s] [Operation: maakaan io] [File: %s] [%s ms]", 
    sessionID, fileNaam, 
    (System.currentTimeMillis() - startTime))); 

Lorsque vous enregistrez un fichier 110MB avec ce servlet FSA prend environ 10 secondes, le FSB environ 13 secondes. Le système de fichiers de votre choix fait donc la différence, mais la différence de vitesse d'écriture ne correspond pas aux différences de débit mesurées. Lors de l'utilisation du système de fichiers désigné FSB, l'écriture d'un fichier à partir du code Java est encore plus lente avec environ 10 Mo/s que lors de l'écriture directe à l'aide de dd. Comme j'utilise un gros fichier dans le test, j'ai choisi d'utiliser le througput mesuré des systèmes de fichiers.

Y at-il des options pour améliorer la vitesse d'écriture de cette servlet ou la façon de déterminer ce qui est à l'origine des «sluggishnes de

Cheers, Peter

Mise à jour == 1 ==

Il semble qu'il y ait un tampon de 4K dans l'implémentation de FileUtils.copyInputStreamToFile et org.apache.commons.fileupload. Je peux aussi le voir en faisant l'analyse du flightrecording (JRockit). J'ai été capable d'augmenter le tampon d'écriture. Je travaille maintenant pour voir si je peux contourner le tampon dans fileUploader.

Répondre

0

Les tests d'E/S exécutés sur le système de fichiers à l'aide d'une source virtuelle ne sont pas pertinents. Le facteur limitant est ici le réseau, qui est plus lent que le système de fichiers, ou le processeur, ou Java, ou IOUtils.

+0

Je ne suis pas d'accord. Lorsque vous utilisez scp pour copier le même 110 Mo sur le même système de fichiers cible sur le réseau, j'obtiens 50 à 200 Mo/s – pcvnes