La suite de la gestion des problèmes de performances Jenkin dans l'environnement K8S (configuration du pod de tâches)

Gestion des problèmes de performances Jenkin dans l'environnement K8S

Cet article est une suite de "Gestion des problèmes de performances Jenkin dans l'environnement K8S" . L'article précédent a résolu le problème de performances du nœud maître dans le cluster Jenkins. Les problèmes de performances des pods déterminent la vitesse de la tâche ou même le succès ou l'échec;

Informations environnementales

  1. Matériel: trois serveurs CentOS 7.7
  2. gouverneurs: 1,15
  3. JDK: 1.8.0_141
  4. maven : 3.6.3

Pour plus de détails sur le déploiement et l'utilisation de Jenkins dans un environnement K8S, veuillez vous référer à "Helm Deployment and Experience Jenkins"

Problèmes de performances du nœud de tâche

Les programmeurs Java utilisent souvent Jenkins pour compiler et générer des projets Maven. Si les paramètres de génération utilisent la configuration par défaut, des problèmes de performances sont susceptibles de se produire. Ensuite, utilisez des projets open source pour reproduire ce problème:

  1. Lors de la configuration du plug-in Jenkins kubernetes, la mémoire allouée au module de tâches est 1G, comme indiqué ci-dessous:
    Insérez la description de l'image ici
  2. Ensuite, téléchargez le code source Flink (version 1.8.3-rc3) depuis GitHub, puis compilez et générez. Le code source du pipeline correspondant à cette tâche est le suivant:
pipeline {
  agent {
    label 'my-jenkins-jenkins-slave'
  }
 
  tools {
    maven 'mvn-3.6.3'
  }
 
  stages {
    stage('Checkout') {
      steps {
        echo '从GitHub下载flink工程的源码(1.8.3-rc3归档包)'
        sh 'wget https://codeload.github.com/apache/flink/tar.gz/release-1.8.3-rc3'
        echo '下载结束,解压归档包'
        sh 'tar -zxf release-1.8.3-rc3'
      }
    } 
    
    stage('Build') {
      steps {
        echo '开始编译构建'
        sh 'cd flink-release-1.8.3-rc3 && mvn clean package -U -s /home/jenkins/settings/settings.xml'
      }
    }
  }
}
  1. Dans le processus d'exécution de la tâche de génération, cliquez sur la boule grise dans la zone rouge ci-dessous pour accéder à la page de journal du pod qui a exécuté la tâche:
    Insérez la description de l'image ici
  2. La figure suivante est la page du journal du pod. La zone rouge indique que la tâche a une exception (cette fois, un scénario de test unitaire est en cours d'exécution)
    Insérez la description de l'image ici
  3. Comme indiqué dans l'encadré rouge ci-dessous, le pod effectuant la tâche s'affiche comme hors ligne:
    Insérez la description de l'image ici
  4. À ce stade, connectez-vous à l'environnement kubernetes et vérifiez l'état du pod. Comme indiqué dans l'encadré rouge ci-dessous, le statut du pod de la tâche est OOMKilled. Il semble qu'une mémoire insuffisante a provoqué la destruction du podl:
    Insérez la description de l'image ici

Le premier ajustement (paramètre K8S)

  1. Étant donné que la mémoire du pod est trop petite et que la tâche échoue, vous pouvez ajuster la mémoire du pod dans la page des paramètres de Jenkins. Comme le montre la figure suivante, cette fois définie sur 6G. Veillez à ne pas dépasser la configuration matérielle de la machine hôte:
    Insérez la description de l'image ici
  2. Répétez la tâche ci-dessus une fois, cette fois la mémoire est suffisante et la construction est réussie;

Observer

Comme cette tâche consiste principalement à effectuer la compilation et la construction de maven, il est nécessaire de comprendre l'utilisation de la mémoire du processus maven:

  1. Dans le processus d'exécution de la tâche, recherchez le conteneur Docker correspondant au pod (commande kubectl describe pod xxx ), l'ID est 22484d8b1e56
  2. Exécution docker exec 22484d8b1e56 JPS obtenir Maven ID 87 (le nom du lanceur), comme indiqué ci - dessous:
    Insérez la description de l'image ici
  3. L'exécution de docker exec 22484d8b1e56 jmap -heap 87 peut voir la mémoire JVM du processus maven. Comme le montre la figure suivante, on peut voir que la mémoire réelle utilisée par maven n'est que de la 3G:
    Insérez la description de l'image ici
  4. À l'heure actuelle, le Pod possède une mémoire 6G, et vous pouvez donner plus de mémoire au processus maven grâce aux réglages des paramètres;

Deuxième ajustement (paramètres JVM)

Ensuite, essayez de définir les paramètres de mémoire du processus maven. Ici, essayez de diviser la majeure partie de la mémoire à l'ancienne génération :

  1. Comme indiqué ci-dessous, accédez à la page des paramètres:
    Insérez la description de l'image ici
  2. Comme indiqué dans la figure ci-dessous, recherchez les modèles de pod , ajoutez la variable d'environnement, la clé est MAVEN_OPTS , la valeur est -Xms5632m -Xmx5632m -Xmn512m -Xss256k , car la mémoire totale du pod est 6G, donc après ce paramètre, la mémoire système du pod n'est que de 512 m , le reste La mémoire de 5632 m est entièrement allouée au processus maven, et la jeune génération du processus maven ne fait que 512 m, laissant toute la mémoire à l'ancienne génération:
    Insérez la description de l'image ici
  3. Après avoir enregistré les paramètres, exécutez à nouveau la tâche, recherchez d'abord le conteneur Docker correspondant au pod de tâches, puis utilisez la commande jmap -heap pour afficher la mémoire du processus maven. Comme le montre la figure ci-dessous, 5632 m de mémoire sont tous alloués au processus maven et la jeune génération est également contrôlée à 512 m:
    Insérez la description de l'image ici
  4. La figure suivante représente l'exécution de la commande jstat pour afficher la situation GC du processus maven. La boîte rouge est le nombre de YGC et la boîte bleue est le nombre de FGC. En raison de la petite mémoire de la jeune génération, la fréquence de YGC est fréquente, mais le nombre de FGC n'est pas important:
    Insérez la description de l'image ici
  5. L' exception StackOverflow s'est également produite pendant le processus de génération . Comme le montre la figure suivante, la solution consiste toujours à ajuster le paramètre MAVEN_OPTS , la valeur est -Xms5632m -Xmx5632m -Xmn512m -Xss512k , ce qui revient à doubler la mémoire de la pile de threads:
    Insérez la description de l'image ici
  6. Les réglages ci-dessus ne sont pas optimaux, mais vérifiez que le réglage des paramètres de mémoire MAVEN peut prendre effet;
  7. Grâce à la page des paramètres Jenkins, les paramètres personnalisés du pod de tâches et le processus maven correspondant ont été effectués. J'espère que cet article pourra vous fournir des références pour vous aider à effectuer des ajustements et une optimisation ciblés en fonction des caractéristiques du projet;

Bienvenue à prêter attention à mon numéro public: le programmeur Xinchen

Insérez la description de l'image ici

Publié 376 articles originaux · loué 986 · 1,28 million de vues

Je suppose que tu aimes

Origine blog.csdn.net/boling_cavalry/article/details/105181474
conseillé
Classement