J'ai un travail récent qui se bloque parfois avec une faute de segmentation, et j'ai quelques questions à propos des vidages de mémoire.
Dois-je d'abord ajouter une strophe:
limit core unlimited unlimited
Y a-t-il un inconvénient à autoriser des tailles de noyau illimitées? Une limite finie serait-elle meilleure?
Deuxièmement, où ira le fichier core? Si la valeur par défaut n'est pas un emplacement standard ou logique, comment puis-je le faire apparaître ailleurs?
Les vidages mémoire illimités ne sont pas recommandés dans la plupart des situations, mais sont techniquement corrects. Un core dump n'a que "toute la mémoire" du processus en cours. Donc, tout au plus, il ne peut être aussi gros que votre ram + swap. J'espère que vous avez plus d'espace libre que ça.
Dans la vraie vie, ils devraient être "petits" par rapport au total ram + swap.
Le fichier "devrait" se retrouver dans "le répertoire actuel". Pour les tâches qui ne se déclenchent pas, c’est habituellement /. S'ils changent de répertoire, vous êtes libre de les pourchasser. Vous pouvez cependant coder en dur un chemin pour eux.
Vous devriez être capable de vérifier /proc/sys/kernel/core_pattern
pour le "motif". Si vous définissez le motif sur quelque chose comme echo "/var/log/core" > /proc/sys/kernel/core_pattern
alors tous vos cœurs doivent se retrouver dans/var/log
Un fichier de base est une image d'un processus créé par le système d'exploitation lorsque le processus se termine de manière inattendue. Les fichiers core sont créés lorsqu'un programme se comporte mal en raison d'un bogue ou d'une violation des mécanismes de protection de la CPU ou de la mémoire. Le système d'exploitation tue le programme et crée le fichier core.
Ce fichier peut être très utile pour déterminer ce qui ne va pas avec un processus. La production de fichiers de base peut être activée par défaut, en fonction de la distribution et de la version de Linux que vous avez.
Si vous ne voulez pas du tout de fichiers de base, définissez "ulimit -c 0" dans vos fichiers de démarrage. C'est la valeur par défaut sur de nombreux systèmes. dans /etc/profile
vous pouvez trouver
Les fichiers tronqués n'ayant aucune utilité pratique, définissez la taille du fichier principal Linux sur "illimité".
Usage of ulimit Action
ulimit -c # check the current corefile limit
ulimit -c 0 # turn off corefiles
ulimit -c x # set the maximum corefile size to x number of 1024bytes
ulimit -c unlimited # turn on corefiles with unlimited size
ulimit -n unlimited # allows an unlimited number of open file descriptors
ulimit -p # size of pipes
ulimit -s # maximum native stack size for a process
ulimit -u # number of user processes
help ulimit #list of other options
Le fichier principal est placé dans le répertoire de travail en cours du processus, sous réserve des autorisations d’écriture pour le processus JVM et de l’espace disque disponible.
En fonction du niveau du noyau, une option de noyau utile est disponible, qui donne à Corefiles des noms plus significatifs. En tant qu'utilisateur root, l'option sysctl -w kernel.core_users_pid = 1 garantit que les fichiers de base ont un nom de la forme "Core.PID".
ulimit -S -c 0 > /dev/null 2>&1
Si vous voulez des fichiers core, vous devez le réinitialiser dans votre propre fichier .bash_profile:
ulimit -c 50000
autoriserait les fichiers de base mais les limiterait à 50 000 octets.
Vous avez plus de contrôle sur les fichiers core dans /proc/sys/kernel/
Par exemple, vous pouvez éliminer les marqués sur pid par
echo "0" > /proc/sys/kernel/core_uses_pid
Les fichiers de base seront simplement nommés "core". Les gens font des choses comme ça pour qu'un utilisateur puisse choisir de placer un fichier non-inscriptible nommé "core" dans des répertoires dans lesquels il ne souhaite pas générer de core dumps. Cela pourrait être un répertoire (mkdir core) ou un fichier (touch core; chmod 000 core).
Mais peut-être plus intéressant, c'est que vous pouvez faire:
mkdir /tmp/corefiles
chmod 777 /tmp/corefiles
echo "/tmp/corefiles/core" > /proc/sys/kernel/core_pattern
Tous les corefiles sont alors renvoyés à /tmp/corefiles
(ne changez pas core_uses_pid si vous faites cela).
Testez ceci avec un script simple:
# script that dumps core
kill -s SIGSEGV $$
Sous Ubuntu, la création des fichiers core est contrôlée via le fichier /etc/default/collectd
. Vous pouvez activer la création de core dumps en définissant:
ENABLE_COREFILES=1
Localisation du fichier core
Une fois le démon bloqué, un fichier sera créé dans son répertoire de travail actuel. Par défaut, il s’agit de pkglocalstatedir
, c’est-à-dire prefix/var/lib/collectd
. Si vous avez installé un paquet, ce répertoire est probablement /var/lib/collectd
.
Sources: AP Lawrence et IBM