Desvantagem do tamanho ilimitado do núcleo? Para onde vão os arquivos principais?

8

Tenho um trabalho inicial que ocasionalmente trava com uma falha de segmentação e tenho algumas perguntas sobre os dumps principais.

Primeiro, devo adicionar uma estrofe:

limit core unlimited unlimited

Existe uma desvantagem em permitir tamanhos de núcleo ilimitados? Um limite finito seria melhor?

Segundo, para onde irá o arquivo principal? Se o padrão não for um local padrão ou lógico, como faço para aparecer em outro lugar?

brooks94
fonte
você poderia por favor nos atualizar com o seu trabalho arrivista
Qasim

Respostas:

6

Despejos de núcleo ilimitados não são aconselháveis ​​na maioria das situações, mas são tecnicamente corretos. Um dump principal possui apenas "toda a memória" do processo atual. Portanto, no máximo, só pode ser tão grande quanto o seu ram + swap. Espero que você tenha mais espaço livre do que isso.

Na vida real, eles devem ser "pequenos" em comparação com o total de ram + swap.

O arquivo "deve" acabar no "diretório atual". Para tarefas iniciantes que não chdir, geralmente é /. Se eles mudarem de diretório, você estará sozinho para procurá-los. No entanto, você pode codificar um caminho para eles.

Você deve poder verificar /proc/sys/kernel/core_patterno "padrão". Se você definir o padrão para algo como echo "/var/log/core" > /proc/sys/kernel/core_pattern, todos os seus núcleos deverão terminar em / var / log

coteyr
fonte
5

Um arquivo principal é uma imagem de um processo criado pelo sistema operacional quando o processo é encerrado inesperadamente. Os arquivos principais são criados quando um programa se comporta incorretamente devido a um bug ou a uma violação dos mecanismos de proteção da CPU ou de memória. O sistema operacional mata o programa e cria o arquivo principal.

Esse arquivo pode ser muito útil para determinar o que deu errado com um processo. A produção dos arquivos principais pode ser ativada por padrão, dependendo da distribuição e versão do Linux que você possui.

Se você não deseja nenhum arquivo principal, defina "ulimit -c 0" nos arquivos de inicialização. Esse é o padrão em muitos sistemas; em /etc/profilevocê pode encontrar

Como os arquivos truncados não são úteis, defina o tamanho do arquivo principal do Linux como "ilimitado".

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

O arquivo principal é colocado no diretório de trabalho atual do processo, sujeito a permissões de gravação para o processo da JVM e espaço livre em disco.

Dependendo do nível do kernel, está disponível uma opção útil do kernel que fornece nomes mais significativos aos arquivos principais. Como usuário root, a opção sysctl -w kernel.core_users_pid = 1 garante que os arquivos principais tenham um nome no formato "Core.PID".

ulimit -S -c 0 > /dev/null 2>&1

Se você quiser arquivos principais, precisará redefinir isso por conta própria .bash_profile:

ulimit -c 50000

permitiria arquivos principais, mas os limitaria a 50.000 bytes.

Você tem mais controle dos arquivos principais no /proc/sys/kernel/

Por exemplo, você pode eliminar os marcados no pid

echo "0" > /proc/sys/kernel/core_uses_pid 

Os arquivos principais serão então chamados de "núcleo". As pessoas fazem coisas assim para que um usuário possa optar por colocar um arquivo não gravável chamado "core" em diretórios nos quais não deseja gerar dumps principais. Pode ser um diretório (mkdir core) ou um arquivo (touch core; chmod 000 core).

Mas talvez o mais interessante seja o que você pode fazer:

mkdir /tmp/corefiles 
chmod 777 /tmp/corefiles 
echo "/tmp/corefiles/core" > /proc/sys/kernel/core_pattern 

Todos os corefiles são lançados no /tmp/corefiles(não altere core_uses_pid se você fizer isso).

Teste isso com um script simples:

# script that dumps core 
kill -s SIGSEGV $$ 

No Ubuntu, a criação dos arquivos principais é controlada pelo arquivo /etc/default/collectd. Você pode ativar a criação de core dumps configurando:

ENABLE_COREFILES=1

Localizando o arquivo principal

Depois que o daemon travou, um arquivo será criado em seu diretório de trabalho atual. Por padrão, isto é pkglocalstatedir, ie prefix/var/lib/collectd. Se você instalou um pacote, esse diretório é mais provável /var/lib/collectd.

Fontes: AP Lawrence e IBM

Mitch
fonte