Uso da memória do Linux?

1

Temos 1 TB de memória em um servidor que hospeda um aplicativo SAP.

Quando o aplicativo está em execução, o uso de memória mostrado em top é de cerca de 700 GB. Quando o aplicativo é interrompido, o uso de memória mostrado em top diminui para 10 GB. Uma reinicialização do servidor obtém o uso da memória para 1 GB.

  • Mesmo que nenhum aplicativo esteja em execução, por que o top exibe 10 GB usados e ganha 9 GB após a reinicialização?
  • É possível ganhar 9 GB sem reiniciar?

Saída de free -g :

free -g 
                 total used   free shared buffers cached 
Mem:              1009  567   442    0      0     152 
-/+ buffers/cache:      415   594 
Swap:              1     0     1
    
por Jonu 04.07.2014 / 23:22

2 respostas

4

O Linux usa a RAM de maneira diferente do que outros sistemas operacionais fazem.

Em vez de ficar parado com RAM não usada, o Linux armazena dados que pensa podem ser usados na RAM - qualquer aplicativo pode ser armazenado aqui, arquivos, etc.

Como resultado, o uso da RAM do Linux é maior do que o usado pelos aplicativos em execução. Esse uso extra é armazenado em buffer para ser processado por outras coisas. Execute free -h e a segunda linha em usado mostrará a você que muito da memória "usada" é realmente armazenada em cache.

No caso em que toda a sua memória é armazenada em cache e um programa precisa de memória, ela removerá o suficiente do cache para se adequar ao programa.

    
por 04.07.2014 / 23:54
0

Isso ocorre porque alguns descritores de arquivos ainda estão abertos embora o aplicativo esteja parado. Você pode listar os descritores de arquivos abertos usando as técnicas mencionadas aqui .

Se você precisar fechar os descritores de arquivos sem reinicializar, siga a abordagem mencionada por Graeme aqui . No entanto, você precisa estar ciente dos descritores de arquivo que você está fechando, conforme destacado por Graeme em sua resposta. Sua resposta é,

To answer literally, to close all open file descriptors for bash:

for fd in $(ls /proc/$$/fd); do
  eval "exec $fd>&-"
done

However this really isn't a good idea since it will close the basic file descriptors the shell needs for input and output. If you do this, none of the programs you run will have their output displayed on the terminal (unless they write to the tty device directly). If fact in my tests closing stdin (exec 0>&-) just causes an interactive shell to exit.

What you may actually be looking to do is rather to close all file descriptors that are not part of the shell's basic operation. These are 0 for stdin, 1 for stdout and 2 for stderr. On top this some shells also seem to have other file descriptors open by default. In bash you have 255 (also for terminal I/O) and dash I have 10 which points to /dev/tty rather than the specific tty/pts device the terminal is using. To close everything apart from 0, 1, 2 and 255 in bash:

for fd in $(ls /proc/$$/fd); do
  case "$fd" in
    0|1|2|255)
      ;;
    *)
      eval "exec $fd>&-"
      ;;
  esac
done

Note also that eval is required when redirecting the file descriptor contained in a variable, if not bash will expand the variable but consider it part of the command (in this case it would try to exec the command 0 or 1 or whichever file descriptor you are trying to close). Also using a glob instead of ls (eg /proc/$$/fd/*) seems to open an extra file descriptor for the glob, so ls seems the best solution here.

Update

For further information on the portability of /proc/$$/fd, please see Portability of file descriptor links. If /proc/$$/fd is unavailable, then a drop in replacement for the $(ls /proc/$$/fd), using lsof (if that is available) would be $(lsof -p $$ -Ff | grep f[0-9] | cut -c 2-).

    
por 04.07.2014 / 23:46