Le noyau Linux offre une certaine flexibilité en matière d’allocation de mémoire. Un paramètre sysctl, vm.overcommit_memory, contrôle la façon dont le noyau gère les situations dans lesquelles les processus demandent plus de mémoire que ce qui est physiquement disponible. Lorsqu’il est défini sur 0 ou 1, le noyau autorise le « surengagement » – permettant essentiellement aux programmes d’allouer plus de mémoire qu’il n’en existe. Cela peut conduire à une situation critique si la mémoire allouée est pleinement utilisée, car le système peut manquer de ressources physiques.
Surengagement et épuisement de la mémoire
Lorsque la mémoire est épuisée, la stabilité de l’ensemble du système est menacée. Les processus pourraient tomber en panne, les services essentiels pourraient échouer et les performances globales se dégraderaient considérablement. Pour éviter cela, le noyau Linux utilise un mécanisme connu sous le nom de Out of Memory (OOM) Killer.
Le processus décisionnel du tueur OOM
Le rôle principal de OOM Killer est de mettre fin de manière sélective aux processus afin de libérer suffisamment de mémoire pour que le système puisse fonctionner. Le défi consiste à choisir le « meilleur » processus à supprimer – celui qui libérera le plus de mémoire tout en provoquant un minimum de perturbations.
Score OOM : pour prendre cette décision, le noyau attribue un oom_score à chaque processus. Ce score peut être consulté sous le système de fichiers /proc dans le répertoire ID de processus. Plus le oom_score est élevé, plus le processus est susceptible d’être interrompu lors d’une situation de MOO.
Calcul du score MOO : dans les noyaux Linux modernes, le oom_score est calculé comme un simple pourcentage de la mémoire disponible utilisée par le processus.
- Si l’ensemble du système manque de mémoire, la « mémoire disponible » correspond au total de la RAM et de l’espace d’échange.
- Si le manque se situe au sein d’un groupe de contrôle spécifique (groupe de contrôle), la « mémoire disponible » est la quantité allouée à ce groupe de contrôle.
- Nuances de notation : le calcul aboutit à un nombre compris entre 0 (sans utilisation de mémoire) et 1 000 (en utilisant toute la mémoire disponible). Il y a des ajustements mineurs :
- Les processus appartenant à la racine voient leur score légèrement réduit, car ils sont souvent considérés comme plus importants.
- La variable oom_score_adj (réglable via /proc) peut être ajoutée, permettant aux utilisateurs d’influencer l’attractivité d’un processus pour le OOM Killer.
Implications et considérations
Comprendre le comportement de OOM Killer est crucial pour les administrateurs système et les développeurs. En surveillant l’utilisation de la mémoire des processus et les valeurs oom_score, vous pouvez avoir un aperçu de la façon dont le système peut réagir sous la pression de la mémoire. Gardez à l’esprit que le OOM Killer est un dernier recours. Il est conçu pour atténuer les défaillances catastrophiques, mais les processus de destruction peuvent toujours avoir des conséquences négatives.
Mesures proactives
- Optimiser les applications : assurez-vous que votre logiciel est bien écrit et ne consomme pas trop de mémoire.
- Surveiller l’utilisation de la mémoire : vérifiez régulièrement l’utilisation de la mémoire à l’échelle du système et les statistiques de processus individuels.
- Définir des limites de mémoire : envisagez d’utiliser des groupes de contrôle ou d’autres mécanismes pour définir des limites d’utilisation de la mémoire par processus ou groupe de processus.
Le Linux OOM Killer joue un rôle crucial dans le maintien de la stabilité du système en cas de pénurie de mémoire critique. Son processus de prise de décision, bien que complexe, vise à minimiser les dommages en sélectionnant les processus les plus consommables. En comprenant comment fonctionne le OOM Killer et en prenant des mesures proactives pour gérer l’utilisation de la mémoire, vous pouvez réduire la probabilité de rencontrer des situations de MOO et garantir un fonctionnement du système plus fluide et plus fiable.








