O que significa o tamanho da memória virtual no topo?

103

Estou executando top para monitorar o desempenho do meu servidor e 2 dos meus processos java mostram memória virtual de até 800MB-1GB. Isso é ruim?

O que significa memória virtual?

E ai btw, eu tenho swap de 1GB e ele mostra 0% usado. Então estou confuso.

Processo Java = 1 servidor Tomcat + meu próprio servidor daemon = Ubuntu 9.10 (kármico)

    
por kapso 04.05.2010 / 17:37

7 respostas

121

A memória virtual nem é necessariamente memória. Por exemplo, se um processo mapear a memória em um arquivo grande, o arquivo será realmente armazenado em disco, mas ainda ocupará "espaço de endereço" no processo.

Espaço de endereço (ou seja, memória virtual na lista de processos) não custa nada; Não é real. O que é real é a coluna RSS (RES), que é a memória residente. Isso é o quanto da sua memória real um processo está ocupando.

Mas mesmo isso não é a resposta completa. Se um processo chamar fork (), ele será dividido em duas partes e ambas compartilharão inicialmente todos os seus RSS. Assim, mesmo que o RSS tenha inicialmente 1 GB, o resultado depois de bifurcado seriam dois processos, cada um com um RSS de 1 GB, mas você ainda usaria apenas 1 GB de memória.

Confuso ainda? Veja o que você realmente precisa saber: use o comando free e verifique os resultados antes e depois de iniciar o programa (na linha +/- buffers/cache ). Essa diferença é o quanto nova memória seu programa recém-iniciado usou.

    
por 05.05.2010 / 03:17
23

Na primeira página do manual:

o: VIRT  --  Virtual Image (kb)
      The  total  amount  of  virtual  memory  used  by the task.  It
      includes all code, data and shared libraries  plus  pages  that
      have been swapped out.

      VIRT = SWAP + RES.

Onde RES significa memória residente (memória física usada).

Na verdade, isso não está correto (mais). Quando ele diz "swap", isso também inclui arquivos que o programa mapeou em seu espaço de endereço, que pode ou não estar realmente consumindo RAM real ainda. Esta memória é suportada por arquivos, mas não é realmente swap.

O VIRT também inclui páginas que foram alocadas, mas ainda não usadas para nada. Qualquer página neste estado é mapeada para a página Zero do kernel (conceito brilhante - você deve procurá-la) para que apareça no VIRT, mas na verdade não consuma nenhuma memória.

    
por 04.05.2010 / 17:43
8

Eu encontrei esta explicação de Mugurel Sumanariu muito claro:

VIRT stands for the virtual size of a process, which is the sum of memory it is actually using, memory it has mapped into itself (for instance the video card’s RAM for the X server), files on disk that have been mapped into it (most notably shared libraries), and memory shared with other processes. VIRT represents how much memory the program is able to access at the present moment.

RES stands for the resident size, which is an accurate representation of how much actual physical memory a process is consuming. (This also corresponds directly to the %MEM column.) This will virtually always be less than the VIRT size, since most programs depend on the C library.

SHR indicates how much of the VIRT size is actually sharable (memory or libraries). In the case of libraries, it does not necessarily mean that the entire library is resident. For example, if a program only uses a few functions in a library, the whole library is mapped and will be counted in VIRT and SHR, but only the parts of the library file containing the functions being used will actually be loaded in and be counted under RES.

    
por 27.01.2016 / 18:53
5

A coluna VIRT na saída ps / top é quase irrelevante para medir o uso da memória. Não se preocupe com isso. Carga pesada do Apache VIRT contra a memória RES

link

    
por 04.05.2010 / 17:41
2

O Linux suporta memória virtual, ou seja, usa um disco como uma extensão da RAM para que o tamanho efetivo da memória utilizável cresça correspondentemente. O kernel gravará o conteúdo de um bloco de memória atualmente não utilizado no disco rígido para que a memória possa ser usada para outra finalidade. Quando o conteúdo original é necessário novamente, eles são lidos de volta na memória. Isso tudo é completamente transparente para o usuário; os programas em execução no Linux só veem a maior quantidade de memória disponível e não percebem que partes deles residem no disco de tempos em tempos. É claro que ler e gravar o disco rígido é mais lento (na ordem de mil vezes mais lento) do que usar a memória real, portanto, os programas não são executados tão rapidamente. A parte do disco rígido que é usada como memória virtual é chamada de espaço de troca.

O Linux pode usar um arquivo normal no sistema de arquivos ou uma partição separada para o espaço de troca. Uma partição swap é mais rápida, mas é mais fácil alterar o tamanho de um arquivo de troca (não é necessário reparticionar todo o disco rígido e, possivelmente, instalar tudo do zero). Quando você sabe quanto espaço de troca você precisa, você deve ir para uma partição de swap, mas se você estiver incerto, você pode usar um arquivo de troca primeiro, usar o sistema por um tempo para que você possa ter uma idéia de quanto você precisa, e então faça uma partição swap quando estiver confiante sobre seu tamanho.

Você também deve saber que o Linux permite usar várias partições de troca e / ou trocar arquivos ao mesmo tempo. Isso significa que, se ocasionalmente você precisar de uma quantidade incomum de espaço de troca, poderá configurar um arquivo de troca extra nesses momentos, em vez de manter o valor total alocado o tempo todo.

Uma nota sobre a terminologia do sistema operacional: ciência da computação normalmente distingue entre permutação (gravação de todo o processo em espaço de troca) e paginação (gravação apenas de partes de tamanho fixo, normalmente alguns kilobytes, de cada vez). Geralmente, a paginação é mais eficiente, e é isso que o Linux faz, mas a terminologia tradicional do Linux fala sobre a troca de qualquer maneira.

Fonte: link

    
por 04.05.2010 / 17:43
2
A coluna

VIRtual da parte superior, refere-se ao superespaço (super-espaço de consumo) do processo, que o processo pode não estar realmente tomando no tempo de execução. Há outra coluna RESident , que se refere à memória / espaço físico real alocado pelo processo, no tempo de execução.

O motivo da diferença, entre os dois, pode ser entendido pelo exemplo: se o processo estiver usando determinada biblioteca, o tamanho da biblioteca também ajudará no virtual-size . no entanto, uma vez que apenas uma parte da biblioteca seria usada (ou seja, alguns métodos em uso), de modo que ajudará em resident-size .

Consulte Mais informações

    
por 26.02.2016 / 15:27
0

"VIRT" apenas endereça o espaço, RES é a memória "real", mas a quantidade "SHR" (= compartilhada) de "RES" é a parte do RES que é compartilhada com outros processos. Portanto, para a maioria dos processos, acredito que subtraindo SHR de RES, você recebe a quantidade de memória realmente atribuível a esse processo em particular.

    
por 19.04.2018 / 01:03