2010-12-14 100 views
1

J'ai un serveur Tomcat avec 250 threads de connexion. Lorsque je simule le téléchargement de fichiers simultanés pour 30 fichiers (chacun 100 Mo), le processeur et la mémoire RAM de la machine serveur atteignent un pic, c'est-à-dire 95% d'utilisation. J'utilise le bloc de code suivant pour lire les données de fichier de HTTP Post.Tomcat Nombre maximal de téléchargements simultanés de fichiers

// request is instance of HTTPServletRequest 
int nDataLength = request.getContentLength(); 

byte dataBytes[] = new byte[nDataLength]; 

int bytesRead = 0; 
int totalBytesRead = 0; 
int bytesLimit = 1024; 

InputStream in = new InputStream(request.getInputStream()); 
try 
{ 
    while(totalBytesRead < nDataLength) 
    { 
     bytesRead = in.read(dataBytes, totalBytesRead, bytesLimit); 
     totalBytesRead += bytesRead; 
    } 
} 
catch(Exception ex) 
{ 
    throw ex; 
} 
finally 
{ 
    in.close(); 
} 

Mes doutes sont:

  • Quel pourrait être le nombre maximal de fichiers simultanés de Uploads (chaque fichier de 100 Mo) qu'un serveur Tomcat peut gérer?
  • Y at-il une optimisation requise dans mon code pour utiliser les 250 threads de connexion?
  • L'introduction de sleep peut entraîner de longs téléchargements. Comment écrire du code efficace?

Merci d'avance.

salutations, Kingsley Reuben J

NOTE: Je ne serai pas en mesure d'utiliser des applications tierces pour résoudre ce problème

+0

Il est difficile de donner une réponse définitive. Cela dépend de plusieurs facteurs: la puissance fournie par votre machine (CPU, RAM), la charge à côté de cette tâche, ce que vous voulez faire avec les fichiers téléchargés (stockage ou autre traitement), la bande passante disponible ... –

+0

La machine serveur n'a pas d'autre procédé que de recevoir des fichiers et de les stocker.En outre, la machine dispose de 8 Go de RAM avec processeur Dual Core –

+1

Ne pas faire à la main, utilisez une bibliothèque appropriée comme Commons FileUpload (http://commons.apache.org/fileupload/) Pas de bugs, et correctement dimensionnable – skaffman

Répondre

0

Vous manquez de mémoire avec la solution d'origine, la suggestion de l'empileur (stockage des données dans le fichier) devrait donc fonctionner. Le téléchargement de fichiers sur HTTP vers Tomcat n'est tout simplement pas idéal pour effectuer des téléchargements massifs en masse.

Vous pouvez essayer d'utiliser un serveur plus simple/protocole plus efficace (par exemple ftp) ou de profiler votre application Application Server & pour voir où est votre goulot d'étranglement. Une des choses qui vient à l'esprit est que les téléchargements HTTP doivent être décodés par MIME.

0

Vous devriez écrire les données reçues dans un fichier temporaire (dans des blocs plus petits, disons 8KB) depuis 30 * 100MB = 3GB et probablement votre machine commence à paginer la mémoire. Le débit est limité par votre adaptateur d'interface.

+0

Après avoir lu les données, j'ai essayé de stocker les données du morceau sur le disque.L'utilisation de la RAM a considérablement diminué.Mais l'utilisation du processeur reste élevée .. –

+1

@ Kingsley Reuben suit les conseils des skaffmans et utilise une bibliothèque évolutive, ou si vous voulez vous faire la main dans les mains, mettez-vous au courant du processus et découvrez qui est le malfaiteur. – stacker