menos tamanho máximo do buffer?

0

Eu estava brincando com o meu sistema e encontrei uma nova maneira de usar a memória, mas parece que o comando menos só contém uma quantidade limitada de dados antes de parar / matar o comando.

Para testar, execute (cuidado! usa muita memória do sistema muito rápido!)

$ cat /dev/zero | less

Do meu teste, parece que o comando é morto depois que menos alcança 2,5 gigabytes de memória, mas não consigo encontrar nada na página de manual que sugira que isso o limitaria dessa maneira.

Além disso, não consegui encontrar nenhuma documentação através do google sobre o assunto.

Qualquer luz para essa descoberta surpreendente seria ótima!

Informações do sistema: Intel quad core i7, 8 gb de ram.

$ uname -a
Linux Tyler-Work 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

$ less --version
less 458 (GNU regular expressions)
Copyright (C) 1984-2012 Mark Nudelman

less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution,
see the file named README in the less distribution.
Homepage: http://www.greenwoodsoftware.com/less

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04 LTS 
Release:    14.04
Codename:   trusty

Atualização:

O menor processo permanece após atingir o uso de 2,5 GB do RAM, mas ele deixa de reunir a entrada da saída do processo. Verificar valores de retorno indica que o processo do gato está sendo eliminado por um sinal de menos.

$ cat /dev/zero | less; echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}"
141 0

O status de saída 141 sugere que menos está eliminando o processo do gato por meio de um SIGPIPE ( link )

Coletando informações do próprio executável que menos binário é 64bits, então não deve ser limitado na quantidade de memória RAM que ele pode usar:

$ file /bin/less
/bin/less: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=539cf624699477e3e069b6c4e4b33842f22be2d2, stripped

O que não explica por que menos envia um sinal de kill ao processo do gato como essa quantidade específica de dados.

    
por Tyzoid 19.08.2014 / 22:21

1 resposta

1

Pode haver algumas coisas, o código-fonte de menos lhe dará mais informações sobre o que está acontecendo.

É menos um aplicativo de 32 bits? Se assim for, dependendo da configuração do seu kernel, você pode ter 3 GB, 3,5 GB ou (pouco menos) 4 GB de espaço do usuário.

menos provavelmente faz um malloc () de pedaços de memória, no que é chamado de heap. Quais são os limites de heap? Depende da configuração do kernel e outros fatores. Em algum momento, menos provavelmente está pedindo memória e o sistema diz que não pode obter nenhum. Ele acha que "não consigo ter memória, não posso ir adiante, eu realmente deveria desistir, já que não consigo acompanhar as linhas".

Por que em 2,5G? Não sei, às vezes seu alocador de heap não é totalmente eficiente. Você pode dizer que 3Gb é grátis, mas como você precisa juntar partes em blocos, você obtém efetivamente menores quantidades de alocação, com algum espaço livre aparecendo. Lembro-me de um programa que usamos apenas 2GB de um heap de 3.5Gb. Pequenas alocações fragmentaram tanto o monte que mal conseguimos metade do que queríamos. Lembre-se que o malloc precisa ser rápido e bom, às vezes rápido, supera bem. Não é o Tetris que sabe como encaixar as coisas perfeitamente, troca a eficiência da embalagem pelo tempo. Seria uma experiência interessante usar um alocador diferente (o tcmalloc do Google parece particularmente antigo se você souber como usá-lo com LD_PRELOAD).

Além disso, é morto? Ou morre? Faça um eco $? depois que terminar, e você verá um número < 127 se faz uma saída em si, ou algo > 128 se um sinal o matou. Se ele for morto, talvez o seu reaperador de memória do sistema o tenha matado, embora com 8Gb de RAM, eu ficaria surpreso se o seu sistema sentisse a necessidade.

Portanto, em suma, provavelmente programa de 32 bits, + alguma restrição de kernel, + alocador ineficiente, + menos 'padrão de alocação. Mas verifique o valor de retorno para ver se possivelmente o Reaper Out Of Memory o matou.

    
por 19.08.2014 / 23:45

Tags