En tant qu'administrateur système Linux, il est très important de comprendre et de maîtriser les concepts de processus et de threads ainsi que les compétences pratiques correspondantes. Cela nous aide non seulement à mieux gérer les ressources du système, mais améliore également l'efficacité opérationnelle et la stabilité du système. Cet article vous donnera une compréhension approfondie des processus et des threads Linux et partagera quelques conseils et outils pratiques.
Un processus est une activité en cours d'exécution d'un programme avec certaines fonctions indépendantes sur une certaine collection de données. C'est l'unité de base de l'exécution dynamique du système d'exploitation. Dans les systèmes d'exploitation traditionnels, le processus est à la fois l'unité d'allocation de base et l'unité d'exécution de base.
Processus
Un processus est une activité en cours d'exécution d'un programme avec certaines fonctions indépendantes sur une certaine collection de données. C'est l'unité de base de l'exécution dynamique du système d'exploitation. Dans les systèmes d'exploitation traditionnels, le processus est à la fois l'unité d'allocation de base et l'unité d'exécution de base. Il y a deux points principaux dans le concept de processus : Premièrement, un processus est une entité. Chaque processus possède son propre espace d'adressage, qui comprend généralement une région de texte, une région de données et une région de pile. La zone de texte stocke le code exécuté par le processeur ; la zone de données stocke les variables et la mémoire allouée dynamiquement utilisée pendant l'exécution du processus et la zone de pile stocke les instructions et les variables locales pour les appels de procédure actifs. Deuxièmement, un processus est un « programme en cours d’exécution ». Un programme est une entité inanimée. Ce n'est que lorsque le processeur donne vie au programme (le système d'exploitation l'exécute) qu'il peut devenir une entité active.
Thread
Thread est la plus petite unité sur laquelle le système d'exploitation peut effectuer la planification des opérations. Il est inclus dans le processus et constitue la véritable unité opérationnelle du processus. Un thread fait référence à un seul flux de contrôle séquentiel dans un processus. Plusieurs threads peuvent s'exécuter simultanément dans un processus et chaque thread exécute différentes tâches en parallèle. On l'appelle également processus légers sous Unix System V et SunOS, mais les processus légers font davantage référence aux threads du noyau, tandis que les threads utilisateur sont appelés threads. La relation entre les processus et les threads Plusieurs threads dans le même processus partageront toutes les ressources système du processus, telles que l'espace d'adressage virtuel, les descripteurs de fichiers, le traitement du signal, etc. Mais plusieurs threads dans le même processus ont leurs propres piles d'appels, leur propre contexte de registre et leur propre stockage local de thread.
Threads et processus sous Linux
Dans le noyau Linux, bien que les processus et les threads soient tous deux des tâches, ils doivent être distingués. Où pid est l'identifiant du processus et tgid est l'ID du groupe de threads. Pour tout processus, s'il n'y a que le thread principal, alors le pid est lui-même, le tgid est lui-même et le group_leader pointe toujours vers lui-même. Cependant, si un processus crée d’autres threads, cela change. Le thread a son propre pid, tgid est le pid du thread principal du processus et group_leader pointe vers le thread principal du processus. Ainsi avec tgid, on sait si Taste_struct représente un processus ou un thread. La relation est la suivante :
À propos des paramètres du noyau des threads et des processus
ulimit limit, exécutez ulimit -a sous Linux, vous verrez les limites ulimit sur diverses ressources.
Le "max user process" est le nombre maximum de threads qu'un processus peut créer. On peut modifier ce paramètre :
.ulimit -u 66535
2. Paramètre limite sys.kernel.threads-max. Ce paramètre limite le nombre de threads globalement dans le système d'exploitation. Vous pouvez afficher sa valeur via la commande suivante. Afficher la méthode threads-max :
cat /proc/sys/kernel/threads-max 32768
Comment modifier cette valeur :
#方法一,重启后会失效 echo 65535 > /proc/sys/kernel/threads-max #方法二,永久修改 echo "kernel.threads-max = 65535" >> /etc/sysctl.conf
3. Paramètre limite sys.kernel.pid_max. Ce paramètre limite le nombre de threads globalement dans le système d'exploitation. Vous pouvez afficher sa valeur via la commande suivante. Permettez-moi de parler du système d'exploitation 32 bits. La valeur maximale est de 32 768 et ne peut pas être modifiée. La valeur maximale de pid_max sur le système 64 bits est de 2 ^ 22. Lorsque le noyau Linux initialise le système, il définira la valeur pid_max en fonction du nombre de processeurs de la machine. Par exemple, si le nombre de processeurs dans la machine est inférieur ou égal à 32, alors pid_max sera défini sur 32768 (32 Ko) ; si le nombre de processeurs dans la machine est supérieur à 32, alors pid_max sera défini sur N ; *1024 (N est le nombre de processeurs). Comment vérifier pid_max :
cat /proc/sys/kernel/pid_max 32768
Comment modifier cette valeur :
#方法一,重启后会失效 echo 65535 > /proc/sys/kernel/pid_max #方法二,永久修改 echo "kernel.pid_max = 65535" >> /etc/sysctl.conf
Remarque : un certain nombre de threads occuperont également un pid, donc threads-max doit être inférieur ou égal à pid_max.
Limitation du nombre de threads de conteneur
Pour les systèmes Linux, un conteneur est un ensemble de processus. Si l'application dans le conteneur crée trop de processus ou présente des bogues, elle produira un comportement similaire aux fork bombs. De cette façon, non seulement les autres conteneurs sur le même nœud ne pourront pas fonctionner, mais l’hôte lui-même ne pourra pas non plus fonctionner. Ainsi, pour chaque conteneur, nous devons limiter son nombre maximum de processus, et cette fonction est complétée par le sous-système pids Cgroup. J'ai déjà rencontré un tel problème. Étant donné que les applications Java doivent gérer de nombreuses tâches planifiées, une tâche planifiée ouvre un fil de discussion. Cependant, en raison de bogues dans le code, les threads n'ont pas été recyclés à temps, puis le conteneur a continué à générer des threads, ce qui a épuisé l'espace table du processus de l'hôte, ce qui a finalement amené l'ensemble du service Linux à signaler l'erreur "java.lang.OutOfMemoryError". : Impossible de créer des threads natifs", affectant d'autres services. Un message d'erreur « Ressource temporairement indisponible » apparaît pendant le processus de création. En plus de permettre aux développeurs de corriger des bugs, ce genre de problème nécessite également de limiter le nombre de threads au niveau du système.
cgroup
Les Pids sont isolés dans le groupe de contrôle. En modifiant la configuration docker/kubelet, vous pouvez limiter le nombre total de pids pour limiter le nombre total de threads.
Docker, définissez le paramètre –pids-limit au démarrage du conteneur pour limiter le nombre total de pids au niveau du conteneur
kubelet, activez la fonctionnalité SupportPodPidsLimit, définissez le paramètre –pod-max-pids et limitez le nombre total de pids pour chaque pod du nœud
Le principe est le suivant : après la création d'un conteneur, le service qui crée le conteneur créera un sous-répertoire sous /sys/fs/cgroup/pids, qui est un groupe de contrôle. Le fichier le plus critique du groupe de contrôle est pids. maximum. Kubelet ou docker écrit une valeur dans ce fichier, et cette valeur correspond au nombre maximum de processus autorisés dans ce conteneur. Chaque nœud de Kubernetes exécute un service appelé Kubelet, qui est responsable de l'état et du cycle de vie des conteneurs sur le nœud, comme la création et la suppression de conteneurs. Selon le document officiel de Kubernetes Process ID Limits And Reservations, vous pouvez définir l'option de configuration –pod-max-pids du service Kubelet. Les conteneurs suivants créés sur ce nœud finiront par utiliser le contrôleur pid Cgroups pour limiter le nombre de processus dans le. récipient.
Résumé
Grâce à l'introduction et à l'analyse de cet article, nous comprenons les concepts, les différences, les transitions d'état et leur impact sur les ressources système des processus et threads Linux. Dans le même temps, nous avons également partagé quelques conseils et outils pratiques, tels que le réglage des processus, les outils de détection et les outils de gestion. Ces outils et techniques peuvent non seulement nous aider à mieux gérer les ressources du système et à améliorer l'efficacité opérationnelle et la stabilité du système, mais également à améliorer notre efficacité de travail et notre compétitivité. Par conséquent, il est essentiel que nous maîtrisions l’importance et les compétences pratiques des processus et des threads Linux.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!