J'ai eu des problèmes occasionnels avec un serveur que j'ai écrit. C'est dans le clojure, mais je ne pense pas que cela compte, et nous pouvons prétendre que c'est en Java. Quoi qu'il en soit, cela fonctionne bien pendant des heures à la fois, mais passe dans des fits où il se comporte très mal: toute activité s'arrête, pendant environ quinze secondes, puis cela fonctionne normalement pendant quelques secondes, puis s'arrête pendant quinze secondes ... et donc sur (généralement) environ dix minutes environ, après quoi elle remonte à se comporter normalement.
J'ai fait beaucoup de profilage avec votrekit et j'ai exclu un certain nombre de suspects plausibles: p>
Ce n'est pas un problème de collecte des ordures: je l'utilise avec Je ne pense pas que ce soit une question de verrouillage / de synchronisation, mais je ne suis pas sûr à 100% à ce sujet. Le profileur Yourkit affiche des threads en attente parfois, par exemple en compétition sur la serrure de System.out pour produire des messages de journalisation, mais les seules longues attentes sont pour les threads de travailleur dans ThreadPools lorsqu'il n'y a rien à faire. Et bien sûr, votrekit dit que cela n'a jamais détecté aucune impasse. P> li>
Ce n'est pas quelque chose causé par le profileur attaché, car il se produit toujours même si je démarre le serveur, puis laissez-le seul sans jamais attacher le profileur. P> LI>
Ce n'est pas un autre processus sur le système qui prend tout le temps de la CPU: Mon plus gros problème est que je ne vois pas ce que le serveur est faire em> pendant ces funks étranges, car le profileur cesse de recevoir des échantillons. Voici un graphique du diagramme d'utilisation de la CPU: p> Le côté gauche du graphique est un fonctionnement normal, au cours desquels nous obtenons des échantillons de profileur chaque seconde ou plus. Le côté droit est "cassé" et est très épineux car le profileur ne fait que recevoir des échantillons toutes les dix secondes environ. Dans les échantillons, cela obtient, le serveur semble faire son activité habituelle: répondre aux demandes et ainsi de suite; et les journaux confirment qu'il fait des choses normales, mais uniquement à l'époque que le profileur a des échantillons pour: pendant les "lignes droites" en pente ascendante sur le graphique, pour laquelle le profileur n'a pas d'échantillons, le serveur ne fait rien du tout . P> Alors, ce graphique a-t-il l'air familier à quelqu'un? Avez-vous déjà eu ce problème avant et résolu? Ou pouvez-vous me signaler dans la direction d'un outil capable de comprendre ce que fait mon serveur pendant le moment où votrekit ne peut pas? Dans le cas où il importe, la machine serveur exécute Ubuntu 10.04 et p> -xx: + Useconcmarksweepgc Code>, et j'ai vérifié que le serveur continue de fonctionner à la fois mineur et majeur Collections, en raison de la nature concurrente de ce collecteur de déchets. Et nous ne battrons pas alors que nous manquons de mémoire totale ou de quelque chose: la taille du tas actuelle est bien en dessous de son max. P> li>
haut code> montre une utilisation du processeur à 100% pour mon processus Java et de 0% pour tout le reste. p> li>
ul>
P >
3 Réponses :
D'accord, des commentaires, il me semble clair que nous ne pourrons pas comprendre cela avec les informations que vous avez données jusqu'à présent. Le mieux que nous puissions faire est de donner des suggestions sur la façon de le déboguer ... p>
Je vais essayer d'utiliser Jstack pendant l'une des pointes et voir si vous pouvez l'utiliser pour déterminer où il se bloque. P>
Je n'ai pas utilisé Jstack avant - cela vous indique-t-il plus qu'une simple dépotoir de thread?
@ALEX Oui, ça fait. Lire la documentation
Eh bien, il demandait spécifiquement des suggestions sur le débogage.
Si vous n'avez aucune chance de mesurer ou de déboguer en code, essayez de regarder l'extérieur. P>
Je voudrais au début essayer de reproduire le problème. En d'autres termes, existe-t-il un événement externe qui produisit le comportement. Essayez de changer la charge sur le serveur. Basculez tout ce que vous pouvez pour reproduire le problème. P>
Peut-être que c'est aussi une bonne idée de renifler le trafic réseau (TCPDump) pour trouver quelque chose d'intéressant au moment où votre serveur est suspendu. P>
Vous pouvez également l'exécuter sur un autre système d'exploitation pour vérifier si cela dépend de votre environnement d'installation. P>
Si vous ne pouvez pas reproduire une situation dans laquelle le problème se produit, essayez de trouver des situations où vous n'avez pas le problème. Par exemple, supprimez le serveur de net. Arrêtez tous les autres services. P>
Si vous ne trouvez pas avec ce changement de comportement de votre programme, essayez de réduire la complexité de votre code de travail et de voir si vous pouvez trouver un module interne qui semble être lié au problème. p>
Avez-vous déjà eu ce problème avant et résolu? Ou pouvez-vous me signaler dans la direction d'un outil capable de comprendre ce que fait mon serveur Pendant le moment où votrekit ne peut pas? p> blockQuote>
Si vous avez un accès au shell sur le serveur et que vous pouvez voir STDOUT, essayez de prendre un dépotoir de thread lorsque le serveur devient insensible. Je ne sais pas si cela vous donnera quelque chose de différent de ce que Jstack (mentionné dans l'autre réponse) vous donnerait ou non. P>
sur Ubuntu:
Kill -Quit
code> (ne tuera pas réellement le processus Java). P> http://www.crazysquirrel.com/computing/ Java / Basics / Java-thread-hunk.jspx P>
Cela pourrait être une douleur gigantesque dans le cul, mais vous pouvez mais déboguer de vous connecter tout au long de votre code, puis voir ce qui est écrit dans le journal. Une autre possibilité est que le problème n'est pas votre programme Java, mais en fait un autre travail sur le serveur qui mange toutes les ressources pendant 10 minutes.
Ce dont vous avez besoin pour obtenir est un b> (1) échantillon de pile i> Quand il est accroché, puis examinez-le et comprenez-le. Cela ne concerne pas la mesure - c'est à propos de "pourquoi est-il accroché?" Bien sûr, comme Durron597 a déclaré, il pourrait ne pas être votre code en erreur, vous pourriez donc avoir besoin d'un échantillon de tous les threads.
C'est un bon point, @duron, mais rien d'autre intéressant ne fonctionne sur cette machine et
haut code> montre le processus Java en utilisant 100% de processeur pendant ses "temps tristes". Je vais éditer cela dans la question. Et j'ai déjà un peu de journalisation, comme je l'ai mentionné: Aucun de cela ne se produit lorsque le serveur est bloqué.
Même en utilisant CMS, STOP-the-World Full GC peut parfois frapper parfois. Avez-vous activé / coché des journaux de GC unis?
@fglez Oui, ainsi que surveillé, via le profileur, comment l'application se comporte pendant la GC. Je suis plutôt confiant que ce n'est pas un problème associé au GC.