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