2016-09-09 1 views
0

Nous avons récemment décidé d'activer la journalisation GC pour les travailleurs Apache Storm sur un certain nombre de clusters. la mémoire liée à la topologie et les problèmes de récupération de place. Nous voulons le faire pour les travailleurs, mais nous voulons aussi éviter deux problèmes que nous connaissons pourrait arriver:Comment activer la journalisation GC pour les employés Apache Storm, tout en évitant les remplacements de fichiers journaux et limiter l'utilisation de l'espace disque

  • écrasement du fichier journal lorsqu'un travailleur redémarre pour une raison quelconque
  • les journaux en utilisant l'espace disque trop, conduisant à des disques se remplir (si vous gardez le cluster en cours d'exécution assez longtemps, les fichiers journaux combleront disque à moins géré)

Lorsque la journalisation Java gc démarre un processus, il semble remplacer le contenu de tout fichier a le même nom. Cela signifie qu'à moins d'être prudent, vous perdrez la journalisation GC, peut-être lorsque vous en aurez le plus besoin.

Répondre

1

Vous pouvez définir des options JVM pour les travailleurs Storm via la propriété worker.childopts dans storm.yaml (si vous gérez Storm via Apache Ambari, regardez sous Storm service> configs> advanced storm-site> worker.childopts). Vous allez ajouter des propriétés JVM supplémentaires à cela.

Pour activer la journalisation GC dans un fichier, vous devez ajouter -verbose:gc -Xloggc:<log-file-location>.

Vous devez accorder une attention particulière au nom du fichier journal pour éviter les écrasements. Il semble que vous ayez besoin d'un nom unique pour chaque invocation. Pour ce faire, profitez de quelques-uns des remplacements de chaînes "%" spéciaux mentionnés dans le Storm code documentation. Pour l'unicité, %WORKER-ID% est suffisant, il est (assez probable) unique pour chaque processus de travail. Vous voudrez peut-être aussi savoir facilement à quelle topologie le journal GC est destiné. Dans ce cas ajouter %TOPOLOGY-ID% (vous devrez peut-être dire %ID% certaines versions plus anciennes de Storm); cela peut être long mais fournira le nom de la topologie. Jusqu'à présent, les options JVM sont -verbose:gc -Xloggc:/var/log/storm/storm-worker-%TOPOLOGY-ID%-%WORKER-ID%-gc.log (le -%TOPOLOGY-ID% est optionnel, le chemin doit correspondre à votre répertoire de journalisation Storm, et vous pouvez nommer le fichier journal différemment si vous préférez).

Maintenant sur la gestion de l'utilisation de l'espace disque. Je serai heureux s'il y a un moyen plus simple que ce que j'ai. Tout d'abord, profitez de la rotation intégrée du fichier journal GC de Java. -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M est un exemple d'activation de cette rotation, avec jusqu'à 10 fichiers journaux GC provenant de la machine virtuelle Java, dont chacun n'a pas une taille supérieure à 10 Mo. 10 x 10 Mo est 100 Mo d'utilisation maximale. Notez que c'est une instance par travailleur. Avec la rotation du fichier journal GC avec jusqu'à 10 fichiers, '.0', '.1', ... '.9' sera ajouté au nom de fichier que vous avez donné dans Xloggc. .0 sera le premier et après il atteindra .9 il remplacera .0 et continuera sur un tournoi à la ronde. Dans certaines versions de Java, '.current' sera ajouté à la fin du nom du fichier journal en cours d'écriture. En raison du nom de fichier unique que nous devons apparemment ajouter pour éviter les écrasements, cela signifie que vous pouvez avoir 100 Mo d'invocation de processus de travail, donc ce n'est pas une solution totale pour gérer l'espace disque utilisé par les journaux GC. Vous obtiendrez un ensemble de 10 fichiers journaux GC pour chaque processus - cela peut s'additionner. La meilleure solution (sous * nix) à cela semblerait être d'utiliser l'utilitaire logrotate pour nettoyer périodiquement les journaux GC de travail qui n'ont pas été modifiés au cours des N derniers jours.

Assurez-vous de faire le calcul et assurez-vous que vous aurez suffisamment d'espace disque.

Les gens veulent souvent plus de détails et de contexte dans leurs logs GC que les valeurs par défaut, donc pensez à ajouter -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps.

Tous ensemble, vous allez ajouter quelque chose comme ce qui suit à worker.childopts: -verbose:gc -Xloggc:/var/log/storm/storm-worker-%TOPOLOGY-ID%-%WORKER-ID%-gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps plus configurer logrotate.

Enfin, je dois mentionner quelques autres options pour nommer les fichiers journaux, mais je ne vois pas l'avantage, au moins pour mon cas d'utilisation:

  • dans certaines versions de Java que vous pouvez mettre% t dans GC, le nom du fichier journal et Java le remplacent par l'horodatage actuel au format <YYYY>-<MM>-<DD>_<HH>-<MM>-<SS>. Vous pouvez également sortir% p pour obtenir l'ID de processus en cours.
  • Quelqu'un m'a dit que dans certains cas, vous pouvez mettre des expressions rétrodiffusées telles que 'date +'% Y% m% d% H% M'` dans certaines combinaisons de Storm et Java, au moins si vous utilisez Ambari. Il a signalé que cela a fonctionné avec Storm 0.10.0 et Java 1.7.0_95, mais j'ai été incapable d'obtenir ce comportement avec tempête 0.9.3.2.2.0.0-2041 et java 1.7.0_75.