2012-01-17 1 views
0

J'ai un problème avec mon grattoir html. Html-scraper est une application multithread écrite en Java en utilisant HtmlUnit, par défaut elle est exécutée avec 128 threads. En peu de temps, cela fonctionne comme suit: il prend un URL de site à partir d'un gros fichier texte, ping url et s'il est accessible - analyser le site, trouver des blocs html spécifiques, enregistrer toutes les URL et bloque les informations incluant le code html dans les tables correspondantes le prochain site. La base de données est mysql 5.1, il y a 4 tables InnoDb et 4 vues. Les tables ont des index numériques pour les champs utilisés dans la jointure de table. J'ai aussi une interface web pour naviguer et rechercher des données analysées (pour la recherche, j'utilise Sphinx avec des index delta), écrites sur CodeIgniter.Java-mysql crash de l'application haute charge

Configuration du serveur:

CPU: Type Xeon Quad Core X3440 2.53GHz 
RAM: 4 GB 
HDD: 1TB SATA 
OS: Ubuntu Server 10.04 

Quelques config mysql:

key_buffer = 256M 
max_allowed_packet = 16M 
thread_stack = 192K 
thread_cache_size = 128 
max_connections = 400 
table_cache = 64 
query_cache_limit = 2M 
query_cache_size = 128M 

Java fonctionnement de la machine avec les paramètres par défaut, à l'exception des options suivantes:

-Xms1024m -Xmx1536m -XX:-UseGCOverheadLimit -XX:NewSize=500m -XX:MaxNewSize=500m -XX:SurvivorRatio=6 -XX:PermSize=128M -XX:MaxPermSize=128m -XX:ErrorFile=/var/log/java/hs_err_pid_%p.log

Lorsque la base de données était vide, le processus de scrapper 18 urls dans deuxième et était assez stable. Mais après 2 faiblesses, quand la table des urls contient 384929 enregistrements (~ 25% de toutes les urls traitées) et prend 8.2Gb, l'application Java commence à fonctionner très lentement et se bloque toutes les 1-2 minutes. Je suppose que la raison est mysql, qui ne peut pas gérer le chargement croissant (parser, qui effectue 2+4*BLOCK_NUMBER requêtes toutes les url traitée, sphinx, qui met à jour les index delta toutes les 10 minutes, je ne considère pas l'interface web, car il est utilisé par une seule personne), peut-être reconstruire les index très lentement? Mais les journaux mysql et scraper (qui contiennent également toutes les exceptions non interceptées) sont vides. Qu'est-ce que tu en penses?

+1

Pouvez-vous donner plus de détails sur le crash? Est-ce un crash JVM, ou obtenez-vous une erreur comme OutOfMemoryError. Avez-vous essayé de profiler la mémoire de votre application ou d'augmenter la mémoire maximale? –

+0

ce n'est pas une exception OutOfMemoryError, l'application se ferme en quelques minutes silencieusement (peut-être à cause de mysql). Pour le moment, l'interface Web ne répond pas, les requêtes SQL sont très lentes (300 et plus). J'essaie d'augmenter la mémoire maximum, mais il ne permet pas – c1tru55

Répondre

0

Je vous recommande d'utiliser les éléments suivants juste pour vérifier quelques choses d'état .. puting ici que la production contribuerait ainsi:

  1. dmesg
  2. top Vérifiez le résident vs la mémoire virtuelle par processus
+0

** top ** 'CPU VIRT RES SHR% de% MEM commande' ' 823m 53m 2960 460 1.3 mysqld' '3094m 1.9g 10 m 329 49,1 java' – c1tru55

+0

wow oui , java est définitivement là-haut. Avez-vous trouvé quelque chose de concluant dans le dmesg? - Il devrait montrer quel fil est mort. Également - avez-vous remarqué une tendance dans l'utilisation de la mémoire pour l'un ou l'autre de ces programmes? Si vous lancez votre top comme ceci 'top -p [pid], [pid]' vous pourrez regarder ces deux exclusivement. Si l'application Java plante toutes les 1 ou 2 minutes et que son utilisation est de 1,9 g pendant la durée de 1-2 minutes, cela peut indiquer une fuite de mémoire. – technocrat

0

L'application ne répond donc plus? (Pas du tout comme un accident du tout) Je vérifierais que toutes vos ressources sont gratuites. par exemple. faites un jstack pour vérifier si des threads sont attachés.

Vérifiez dans MySQL que vous avez le nombre attendu de connexions. Si vous créez continuellement des connexions en Java et ne les nettoyez pas, la base de données s'exécutera de plus en plus lentement.

0

Merci à tous pour vos conseils, mysql était en fait la cause du problème. En activant le journal des requêtes lentes dans my.conf, je vois que l'une des requêtes, qui exécute chaque itération, effectue 300s (1 champ pour la recherche n'a pas été indexé).

Questions connexes