web-dev-qa-db-fra.com

Inconvénient de la taille de base illimitée? Où vont les fichiers core?

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?

8
brooks94

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

6
coteyr

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

5
Mitch