Parfois, je travaille avec d'énormes décharges de données que je souhaite conserver en mémoire pour le traitement. Parfois, je calcule mal la quantité de mémoire que mon programme va produire, ou un débogueur multiplie l'utilisation de la mémoire par un facteur qui dépasse ma mémoire disponible.
Chaque fois que je démarre un processus gourmand en mémoire, voici ce que j'attends d'un système d'exploitation sain: essayez de manger toute la mémoire libre, puis demandez à d'autres processus non essentiels de bien abandonner la mémoire dont ils n'ont pas besoin, puis écrire pour échanger.
Voici ce que Ubuntu fait pour moi: manger toute la mémoire libre, puis demander au système d'exploitation d'échanger tous les services essentiels (session gnome, terminal, clavier), puis geler et attendre que je débranche la prise d'alimentation.
Deux questions:
- Comment un système d'exploitation peut-il supposer que quelque chose pourrait être si important qu'il est possible d'arrêter d'écouter les entrées de l'utilisateur?
- Comment puis-je dire à Ubuntu de ne jamais échanger les services essentiels et de toujours réagir aux entrées des utilisateurs, même si un processus stupide essaie de consommer plus de ressources que le système n'en fournit.
swapon
pour le savoir)? Cheers, Alswappiness
paramètre à 10, c'est-vm.swappiness = 10
à- dire: dans /etc/sysctl.conf. Recherchez ici la permutation pour plus d'informations à ce sujet. 2) Si l'échange n'est pas utile ... Même si vous ne voulez pas ... augmenter la taille de votre fichier d'échange à 1,5x16G et voir si cela aide. Tiens moi au courant. Cheers, Alvm.swappiness=10
doit être AJOUTÉ à sysctl.conf. Une personne expérimentée pourrait même utiliser la commande sysctl à la volée, pour définir vm.swappiness = 10, sans modifier le fichier sysctl.conf. A bientôt, Al ps: en attente de réponse de l'OP.Réponses:
Je n'ai toujours pas de solution au problème, mais je peux proposer deux solutions de contournement qui pourraient intéresser les autres:
1) earlyoom
C'est un service qui surveille l'utilisation de la mémoire et tue le processus qui consomme le plus de mémoire lorsqu'un certain seuil est atteint (voir aussi ceci et cette question concernant le tueur OOM dans le noyau linux)
Je l'ai testé avec un processus de démonstration qui demande indéfiniment de la mémoire en petits morceaux. Voici ma première impression: lorsque je démarre le processus escroc, il mange rapidement toute ma RAM. L'échange commence alors, le système ne répond plus. Quelques secondes plus tard, le système est de nouveau en ligne. Le journal de earlyoom montre qu'il a tué le processus de consommation de mémoire après que l'utilisation de la mémoire et du swap ait atteint 90%.
Il y a toujours le décalage ennuyeux lorsque l'échange commence et après la fin du processus, certaines parties d'autres processus restent généralement en échange jusqu'à ce qu'elles soient demandées, mais c'est un début.
2) désactivez simplement le swap
Je sais que c'est un sujet controversé , mais pour les systèmes de bureau et en particulier les machines de développement où il peut arriver de temps en temps qu'un processus essaie de consommer toute votre mémoire, cela a du sens: sans échange, le tueur OOM fonctionne simplement comme prévu. Lorsque vous manquez de mémoire, il trouve le meilleur processus pour tuer et s'en débarrasse. Pas de décalage, pas de retard.
Vous pouvez désactiver l'échange pour la session en cours avec
sudo swapoff -a
ou rendre la modification permanente .La bonne solution au problème serait bien sûr que le système reste réactif lorsque la mémoire principale est épuisée et qu'il commence à échanger la mémoire comme s'il n'y avait pas de lendemain, mais cela ne semble pas se produire de si tôt.
la source
Essayez l'une des deux choses suivantes:
1) changez le paramètre de swappiness de son paramètre par défaut de 60, à 10, c'est -à- dire: ajoutez vm.swappiness = 10 à /etc/sysctl.conf (dans le terminal, tapez
sudo gedit /etc/sysctl.conf
), puis redémarrez le système. Recherchez ici la permutation pour plus d'informations à ce sujet.2) Si l'échange n'est pas utile ... même si vous ne voulez pas ... augmenter la taille de votre fichier d'échange à 1,5x16G et voir si cela aide.
Tiens moi au courant. À la vôtre, Al
la source
top
pour tuer le porc de la mémoire). Après environ une minute, le processus est tué. Pas parfait, mais on se rapproche.J'ai résolu un problème similaire. Je ne sais pas si mon expérience vous convient peut-être ...
Récemment, j'ai publié un guide sur la façon d'installer linux sur les périphériques LVM en boucle démarrant à partir d'USB (donc sans avoir à installer grub sur le disque interne, en le laissant comme original). Voici le guide: https://github.com/DareDevil73/linux-on-loopback-usb .
Ensuite, je suis tombé dans le problème de gel sur une charge de mémoire élevée et j'ai observé une utilisation anormale de l'espace de swap (toute la RAM consommée et l'utilisation de swap proche de zéro). De toute évidence, la partition d'échange LVM a été montée et fonctionne correctement, mais je ne sais pas pourquoi le noyau ne l'a pas utilisée comme prévu.
J'ai essayé une solution alternative. J'ai créé un fichier de bouclage de swap (pas LVM) et le gel a disparu. Maintenant, le fichier d'échange est utilisé comme il le serait, et le système d'exploitation ne se fige jamais!
Veuillez consulter https://github.com/DareDevil73/linux-on-loopback-usb#known-issues pour obtenir des informations plus approfondies.
la source