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 / 499485
Accepted
Philip Couling
Philip Couling
Asked: 2019-02-09 06:28:24 +0800 CST2019-02-09 06:28:24 +0800 CST 2019-02-09 06:28:24 +0800 CST

Como uso o espaço de troca apenas para emergências?

  • 772

Eu tenho um laptop Debian (Buster) com 8 GB de RAM e 16 GB de swap. Estou executando uma tarefa muito longa. Isso significa que meu laptop foi deixado ligado nos últimos seis dias enquanto ele roda.

Ao fazer isso, periodicamente preciso usar meu laptop como laptop. Isso não deve ser um problema; a tarefa de longa execução é limitada por E/S, trabalhando em um disco rígido USB e não consome muita RAM (<200 MB) ou CPU (<4%).

O problema é que quando eu voltar ao meu laptop depois de algumas horas, ele ficará muito lento e pode levar 30 minutos para voltar ao normal. Isso é tão ruim que os monitores de falhas sinalizam seus respectivos aplicativos como congelados (especialmente as janelas do navegador) e as coisas começam a falhar incorretamente.

Olhando no monitor do sistema, dos 2,5 GB usados, cerca de metade é trocado. Confirmei que esse é o problema removendo o espaço de troca ( swapoff /dev/sda8). Se eu deixá-lo sem espaço de troca, ele volta à vida quase instantaneamente, mesmo após 24 horas. Com a troca, é praticamente um tijolo nos primeiros cinco minutos, restando apenas seis horas. Confirmei que o uso de memória nunca excede 3 GB , mesmo quando estou ausente.

Eu tentei reduzir o swappiness ( veja também: Wikipedia ) para valores de 10e 0, mas o problema ainda persiste. Parece que após um dia de inatividade, o kernel acredita que toda a GUI não é mais necessária e a limpa da RAM (troca-a para o disco). A tarefa de longa duração é ler através de uma vasta árvore de arquivos e ler todos os arquivos. Portanto, pode ser que o kernel esteja confuso ao pensar que o cache ajudaria. Mas em uma única varredura de um HD USB de 2 TB com ~ 1 bilhão de nomes de arquivos, uma RAM extra de GB não ajudará muito o desempenho. Este é um laptop barato com um disco rígido lento. Ele simplesmente não pode carregar dados de volta na RAM com rapidez suficiente.

Como posso dizer ao Linux para usar apenas o espaço de troca em uma emergência? Eu não quero correr sem swap. Se algo inesperado acontecer, e o sistema operacional de repente precisar de alguns GBs extras, não quero que as tarefas sejam eliminadas e prefiro começar a usar o swap. Mas no momento, se eu deixar a troca habilitada, meu laptop simplesmente não pode ser usado quando eu precisar.

A definição precisa de uma "emergência" pode ser motivo de debate. Mas para esclarecer o que quero dizer: uma emergência seria onde o sistema fica sem outra opção além de trocar ou matar processos.


O que é uma emergência? - Você realmente tem que perguntar?... Espero que você nunca se encontre em um prédio em chamas!

Não me é possível definir tudo o que possa constituir uma emergência nesta questão. Mas, por exemplo, uma emergência pode ser quando o kernel é tão pressionado pela memória que começa a matar processos com o OOM Killer . Uma emergência NÃO é quando o kernel pensa que pode melhorar o desempenho usando swap.


Edição final: aceitei uma resposta que faz exatamente o que pedi no nível do sistema operacional. Os futuros leitores também devem tomar nota das respostas que oferecem soluções em nível de aplicativo.

linux memory
  • 6 6 respostas
  • 7113 Views

6 respostas

  • Voted
  1. derobert
    2019-02-09T08:07:48+08:002019-02-09T08:07:48+08:00

    Uma correção é certificar-se de que o controlador de memória cgroup está habilitado (acho que é por padrão em kernels meio recentes, caso contrário, você precisará adicionar cgroup_enable=memoryà linha de comando do kernel). Então você pode executar sua tarefa intensiva de E/S em um cgroup com um limite de memória, o que também limita a quantidade de cache que pode consumir.

    Se você estiver usando o systemd, você pode definir +MemoryAccounting=yese MemoryHigh/ MemoryMaxou MemoryLimit(depende se você estiver usando cgroup v1 ou v2) na unidade ou em uma fatia que o contenha. Se for uma fatia, você pode usar systemd-runpara executar o programa na fatia.

    Exemplo completo de um dos meus sistemas para rodar o Firefox com limite de memória. Observe que isso usa cgroups v2 e é configurado como meu usuário, não como root (uma das vantagens de v2 sobre v1 é que delegar isso para não-root é seguro, então o systemd faz isso).

    $ systemctl --user cat mozilla.slice 
    # /home/anthony/.config/systemd/user/mozilla.slice
    [Unit]
    Description=Slice for Mozilla apps
    Before=slices.target
    
    [Slice]
    MemoryAccounting=yes
    MemoryHigh=5G
    MemoryMax=6G
    
    $ systemd-run --user --slice mozilla.slice --scope -- /usr/bin/firefox &
    $ systemd-run --user --slice mozilla.slice --scope -- /usr/bin/thunderbird &
    

    Descobri que para fazer o usuário funcionar, tive que usar uma fatia. O sistema um funciona apenas colocando as opções no arquivo de serviço (ou usando systemctl set-propertyno serviço).

    Aqui está um exemplo de serviço (usando cgroup v1), observe as duas últimas linhas. Isso faz parte da instância do sistema (pid=1).

    [Unit]
    Description=mount S3QL filesystem
    Requires=network-online.target
    After=network-online.target
    
    [Install]
    WantedBy=multi-user.target
    
    [Service]
    Type=forking
    User=s3ql-user
    Group=s3ql-user
    LimitNOFILE=20000
    ExecStartPre=+/bin/sh -c 'printf "S3QL_CACHE_SIZE=%%i\n" $(stat -c "%%a*%%S*.90/1024" -f /srv/s3ql-cache/ | bc) > /run/local-s3ql-env'
    ExecStartPre=/usr/bin/fsck.s3ql  --cachedir /srv/s3ql-cache/fs1 --authfile /etc/s3ql-authinfo  --log none «REDACTED»
    EnvironmentFile=-/run/local-s3ql-env
    ExecStart=/usr/bin/mount.s3ql --keep-cache --cachedir /srv/s3ql-cache/fs1 --authfile /etc/s3ql-authinfo --cachesize ${S3QL_CACHE_SIZE} --threads 4
    ExecStop=/usr/bin/umount.s3ql /mnt/S3QL/
    TimeoutStopSec=2m
    MemoryAccounting=yes
    MemoryLimit=1G
    

    A documentação está em systemd.resource-control(5).

    • 29
  2. Best Answer
    phuclv
    2019-02-10T04:31:38+08:002019-02-10T04:31:38+08:00

    Ter uma troca tão grande hoje em dia é muitas vezes uma má ideia. No momento em que o sistema operacional trocou apenas alguns GB de memória para trocar, seu sistema já havia rastreado até a morte (como o que você viu)

    É melhor usar zramcom uma pequena partição de troca de backup . Muitos sistemas operacionais como ChromeOS , Android e várias distribuições Linux ( Lubuntu , Fedora ) habilitam o zram por padrão há anos, especialmente para sistemas com menos RAM. É muito mais rápido do que trocar no HDD e você pode sentir claramente a capacidade de resposta do sistema neste caso. Menos em um SSD, mas de acordo com os resultados de benchmark aqui ainda parece mais rápido, mesmo com o algoritmo lzo padrão. Você pode mudar para lz4 para um desempenho ainda melhor com uma taxa de compactação um pouco menor. Sua velocidade de decodificação é quase 5 vezes mais rápida que o lzo com base no benchmark oficial

    Na verdade , o Windows 10 e o macOS também usam técnicas de compactação de arquivo de paginação semelhantes por padrão

    Há também zswapembora eu nunca tenha usado. Provavelmente vale a pena tentar e comparar qual é melhor para seus casos de uso

    Depois disso, outra sugestão é reduzir a prioridade desses processos vinculados a IO e possivelmente deixar um terminal executando com prioridade mais alta para que você possa executar comandos nele imediatamente, mesmo quando o sistema estiver com carga alta

    Leitura adicional

    • Arch Linux - Melhorando o desempenho - Zram ou zswap
    • Habilite o ZSwap para aumentar o desempenho
    • Habilite o zRAM para melhor manipulação de memória e menos trocas
    • Ficando sem RAM no Ubuntu? Ativar ZRAM
    • Diferença entre ZRAM e ZSWAP
    • zram vs zswap vs zcache Guia final: quando usar qual deles
    • Linux, SSD e swap
    • https://wiki.debian.org/ZRam
    • https://www.kernel.org/doc/Documentation/blockdev/zram.txt
    • https://wiki.gentoo.org/wiki/Zram
    • 18
  3. jlliagre
    2019-02-09T07:27:52+08:002019-02-09T07:27:52+08:00

    Parece que após um dia de inatividade, o kernel acredita que toda a GUI não é mais necessária e a limpa da RAM (troca-a para o disco).

    O kernel está fazendo a coisa certa™ acreditando nisso. Por que manteria 1 memória não utilizada na RAM e, essencialmente, a desperdiçaria em vez de usá-la como cache ou algo assim?

    Eu não acho que o kernel Linux esteja trocando páginas de forma gratuita ou antecipada, então se ele fizer isso deve ser para armazenar algo mais na RAM, melhorando assim o desempenho de sua tarefa de longa duração, ou pelo menos com esse objetivo.

    Se você souber com antecedência quando precisará reutilizar seu laptop, poderá usar o atcomando (ou crontab) para agendar uma limpeza de troca ( swapoff -a;swapon -a).

    Como limpar a troca pode ser um exagero e até acionar o assassino OOM se, por algum motivo, nem tudo couber na RAM, você pode apenas "desfazer a troca" 2 tudo relacionado aos aplicativos em execução que deseja reviver.

    Uma maneira de fazer isso seria anexar um depurador como gdba cada um dos processos afetados e acionar uma geração de dump principal:

    # gdb -p <pid>
    ...
    generate-core-dump /dev/null
    ...
    quit
    

    Como você escreveu, seu aplicativo de longa execução não está reutilizando os dados que lê após a passagem inicial, portanto, você está em um caso específico em que o cache de longo prazo não é útil. Em seguida, ignorar o cache usando E/S direta, como sugerido por Will Crawford, deve ser uma boa solução alternativa.

    Como alternativa, você pode liberar regularmente o cache do arquivo ecoando 1ou 3para o /proc/sys/vm/drop_cachespseudo-arquivo antes que o sistema operacional ache que é uma boa ideia trocar seus aplicativos e ambiente da GUI.

    Consulte Como você esvazia os buffers e o cache em um sistema Linux? para detalhes.

    1 Sem uso no sentido de: não mais usado ativamente por um período significativo de tempo, a memória ainda sendo relevante para seus proprietários.
    2 Coloque de volta na RAM as páginas armazenadas na área de troca.

    • 15
  4. Will Crawford
    2019-02-09T11:15:41+08:002019-02-09T11:15:41+08:00

    O processo que você está executando é algo que você mesmo criou?

    Nesse caso, pode valer a pena ajustar seu código para abrir os arquivos usando o O_DIRECTsinalizador, que para citar a página de manual -

    Tente minimizar os efeitos de cache da E/S de e para este arquivo. Em geral, isso degradará o desempenho, mas é útil em situações especiais, como quando os aplicativos fazem seu próprio cache. A E/S de arquivo é feita diretamente de/para buffers de espaço do usuário. O sinalizador O_DIRECT por si só faz um esforço para transferir dados de forma síncrona, mas não fornece as garantias do sinalizador O_SYNC de que os dados e os metadados necessários sejam transferidos. Para garantir E/S síncrona, O_SYNC deve ser usado além de O_DIRECT. Veja as NOTAS abaixo para uma discussão mais aprofundada.

    • 10
  5. X Tian
    2019-02-09T07:33:20+08:002019-02-09T07:33:20+08:00

    Aqui está uma ideia, que eu mesmo não experimentei (e lamento não ter tempo agora para experimentar isso).

    Suponha que você crie uma pequena VM com apenas 512 MB de memória para seu processo em segundo plano. Não tenho certeza se você deseja que isso tenha alguma troca, sua chamada e desative a troca em seu sistema host.

    • 6
  6. Satoshi Nakamoto
    2019-02-09T07:57:44+08:002019-02-09T07:57:44+08:00

    Remova o swap ou diminua-o em cerca de 20% ( pode variar de acordo com os sistemas ), pois recentemente os sistemas operacionais não estão mais usando o swap da mesma maneira que nos últimos anos. Provavelmente responderá sua pergunta:

    --> oficial redhat.com

    algumas das informações da Red Hat abaixo,

    No passado, alguns fornecedores de aplicativos recomendavam a troca de um tamanho igual à RAM, ou até o dobro da RAM. Agora vamos imaginar o sistema mencionado acima com 2 GB de RAM e 2 GB de swap. Um banco de dados no sistema foi configurado por engano para um sistema com 5 GB de RAM. Uma vez que a memória física é usada, a troca é usada. Como o disco de troca é muito mais lento que a RAM, o desempenho diminui e ocorre o thrashing. Nesse ponto, até mesmo logins no sistema podem se tornar impossíveis. À medida que mais e mais memória é gravada, eventualmente tanto a memória física quanto a memória de troca ficam completamente esgotadas e o assassino OOM entra em ação, matando um ou mais processos. No nosso caso, há bastante swap disponível, então o tempo de desempenho ruim é longo.

    e

    https://wiki.debian.org/Swap

    uma parte do link Debian acima,

    Informações e considerações relacionadas ao valor do swap a ser usado:

    "A quantidade recomendada de espaço de troca tem sido tradicionalmente o dobro da quantidade de memória do sistema. Isso mudou ao longo do tempo para uma vez e meia a memória do sistema, ambas as respostas são linhas de base decentes, mas estão se tornando cada vez menos úteis para a pergunta com o passar do tempo. Existem muitas variáveis ​​sobre o seu sistema e o uso pretendido que determinarão a troca de sistema disponível que você deseja ter."

    Você pode tentar:

    "Melhor maneira de desabilitar a troca no Linux"


    ***Nota pessoal:***

    Desde que eu tenho 6 GB de RAM e em todos os meus sistemas operacionais Linux recentemente. Nunca vi nenhuma indicação do uso do Swap. Eu determinei que deveria desligá-lo por espaço (alguns gigabytes a mais) ou porque às vezes deixou meu sistema lento.

    • 3

relate perguntas

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

  • Necessidade de algumas chamadas de sistema

  • Um processo pode alocar memória cache de forma que o kernel possa aproveitá-la quando necessário?

  • 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

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

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

    • 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

    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
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • 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
    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

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