AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 483704
Accepted
humanityANDpeace
humanityANDpeace
Asked: 2018-11-24 07:16:00 +0800 CST2018-11-24 07:16:00 +0800 CST 2018-11-24 07:16:00 +0800 CST

Por que o linux out-of-memory (OOM) killer não é executado automaticamente, mas funciona na sysrq-key?

  • 772

Descobri que, ao se deparar com uma situação OOM de falta de memória, minha interface do usuário da caixa linux congela completamente por muito tempo.

Eu configurei a magic-sysrq-key e, em seguida, usando echo 1 | tee /proc/sys/kernel/sysrqe encontrando uma situação OOM->UI-unresponsive foi capaz de pressionar Alt-Sysrq-fque, como o dmesglog mostrou, faz com que o OOM encerre/mate um processo e, com isso, resolva a situação do OOM.

Minha pergunta é agora. Por que o linux não responde tanto quanto a GUI congelou, no entanto, parecia não acionar o mesmo OOM-Killer, que eu acionei manualmente por meio da Alt-Sysrq-fcombinação de teclas?

Considerando que na situação "congelada" do OOM o sistema não responde a ponto de nem mesmo permitir uma resposta oportuna (< 10 segundos) ao pressionar o Ctrl-Alt-F3(alternar para tty3), eu teria que assumir que o kernel deve estar ciente de sua falta de resposta, mas ainda assim não invocou por si só o Alt-Sysrq-fOOM-Killer, por quê?

Estas são algumas configurações que podem ter impacto no comportamento descrito.

$> mount | grep memory
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
$> cat /sys/fs/cgroup/memory/memory.oom_control 
oom_kill_disable 0
under_oom 0
oom_kill 0

que enquanto eu entendo afirma que o cgroup de memória não tem OOM nem ativado nem desativado (evidentemente deve haver uma boa razão para ter o OOM_kill ativo e desativado, ou talvez eu não possa interpretar corretamente a saída, também under_oom 0não está claro, ainda )

linux out-of-memory
  • 2 2 respostas
  • 3321 Views

2 respostas

  • Voted
  1. Best Answer
    humanityANDpeace
    2018-11-24T11:21:43+08:002018-11-24T11:21:43+08:00

    A razão pela qual o OOM-killer não é chamado automaticamente é porque o sistema, embora completamente lento e sem resposta já quando está perto de falta de memória y, na verdade não atingiu a situação de falta de memória.

    Simplificado, o ram quase completo contém 3 tipos de dados:

    1. dados do kernel, que são essenciais
    2. páginas de dados essenciais do processo (por exemplo, quaisquer dados que o processo criou apenas na ram)
    3. páginas de dados de processo não essenciais (por exemplo, dados como o código de executáveis, para os quais há uma cópia no disco/no sistema de arquivos e que, enquanto estão atualmente mapeados para a memória, podem ser "relidos" do disco após o uso)

    Em uma situação de falta de memória, o kernel linux, tanto quanto eu posso dizer, é kswapd0thread do kernel, para evitar perda de dados e perda de funcionalidade, não pode jogar fora 1. e 2. , mas tem a liberdade de remover pelo menos temporariamente aqueles mapeados em- dados de arquivos de memória da ram que são processos de formulário que não estão em execução no momento.

    Embora este seja um comportamento que envolve o disk-thrashing , constantemente descartar dados e reler do disco, pode ser visto como útil, pois evita, ou pelo menos adia a remoção/eliminação necessária de um processo e a liberação-mas-também- perdendo sua memória, tem um preço alto : desempenho.

    [load pages from disk to ram with code of executable of process 1]
    [ run process 1 ] 
    [evict pages with binary of process 1 from ram]
    [load pages from disk to ram with code of executable of process 2]
    [ run process 2 ] 
    [evict pages with binary of process 2 from ram]
    [load pages from disk to ram with code of executable of process 3]
    [ run process 3 ] 
    [evict pages with binary of process 3 from ram]
    ....
    [load pages from disk to ram with code of executable of process 1]
    [ run process 1 ] 
    [evict pages with binary of process 1 from ram]
    

    é claramente IO caro e o sistema provavelmente não responderá, embora tecnicamente ainda não tenha ficado completamente sem memória.

    Do ponto de vista do usuário, como parece, ser travado/congelado e a interface do usuário que não responde pode não ser realmente preferível, em vez de simplesmente matar o processo (por exemplo, de uma guia do navegador, cujo uso de memória pode ter sido a causa raiz/culpado para começar com.)

    É aqui que, como a pergunta indicou, o gatilho da tecla Magic SysRq para iniciar o OOM manualmente parece ótimo, pois o Magic SysRq é menos afetado pela falta de resposta do sistema.

    Embora possa haver casos de uso em que seja importante preservar os processos a todo custo ( desempenho ), para um desktop, é provável que os usos prefiram o OOM-killer sobre a interface do usuário congelada. Há um patch que afirma isentar arquivos com backup de fs mapeados limpos da memória em tal situação nesta resposta no stackoverflow .

    • 6
  2. Michael Prokopec
    2018-11-24T07:42:51+08:002018-11-24T07:42:51+08:00

    Você pode observar o arquivo /sys/fs/cgroup/memory/memory.oom_control, durante um teste de estresse.

    ou

    Você pode olhar para a data da última modificação, para ver se foi alterada na época do último bloqueio. Isso lhe dirá se ele estava mesmo tentando fazer seu trabalho.

    under_oom 0
    

    Esse é o seu problema:

    under_oom    0 or 1 (if 1, the memory cgroup is under OOM, tasks may
                 be stopped.)
    

    Se definido como 1, significa que está sob controle do oom. Habilitado.
    Se definido como 0, assim não está sob controle do oom. Desabilitado.

    • 2

relate perguntas

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • Necessidade de algumas chamadas de sistema

  • astyle não altera a formatação do arquivo de origem

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve