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

8

Eu tenho um trabalho inicial que ocasionalmente falha com uma falha de segmentação, e tenho algumas dúvidas sobre os despejos 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?

Em segundo lugar, para onde vai o arquivo principal? Se o padrão não é um lugar padrão ou lógico, como faço para aparecer em outro lugar?

    
por brooks94 15.05.2013 / 16:10

2 respostas

5

Ilimitados core dumps não são aconselháveis na maioria das situações, mas são tecnicamente bons. Um dump principal tem apenas "toda a memória" que o processo atual possui. Então, 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 "small-ish" em relação ao total ram + swap.

O arquivo "deve" terminar no "diretório atual". Para tarefas iniciantes que não são chdir, geralmente é /. Se eles mudarem de diretório, você estará por conta própria para caçá-los. Você pode no entanto codificar um caminho para eles.

Você deve poder verificar /proc/sys/kernel/core_pattern para o "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 devem acabar em / var / log

    
por coteyr 23.05.2013 / 02:58
5

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

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

Se você não quiser arquivos core, defina "ulimit -c 0" nos seus arquivos de inicialização. Esse é o padrão em muitos sistemas; em /etc/profile você pode encontrar

Como os arquivos truncados não são de uso prático, 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, uma opção de kernel útil está disponível, o que dá aos núcleos mais nomes significativos. Como usuário root, a opção sysctl -w kernel.core_users_pid = 1 assegura 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 em seu próprio .bash_profile:

ulimit -c 50000

permite arquivos principais, mas limita-os a 50.000 bytes.

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

Por exemplo, você pode eliminar o tag no pid de

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

Os arquivos principais serão chamados de "core". As pessoas fazem coisas assim para que um usuário possa escolher colocar um arquivo não gravável chamado "core" em diretórios onde eles não querem gerar core dumps. Isso poderia ser um diretório (mkdir core) ou um arquivo (touch core; chmod 000 core).

Mas talvez seja mais interessante que você possa fazer isso:

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

Todos os corefiles então são lançados para /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 de arquivos principais é controlada pelo arquivo /etc/default/collectd . Você pode ativar a criação de dumps principais definindo:

ENABLE_COREFILES=1

Localizando o arquivo principal

Quando o daemon falhar, um arquivo será criado em seu diretório de trabalho atual. Por padrão, isso é pkglocalstatedir , ou seja, prefix/var/lib/collectd . Se você instalou um pacote, este diretório provavelmente é /var/lib/collectd .

Fontes: AP Lawrence e IBM

    
por Mitch 28.05.2013 / 14:18