Existe alguma relação entre a fragmentação da memória e se a troca está ou não ativada em um sistema?

8

Uma das respostas para Preciso de espaço de troca se tiver uma quantidade de RAM suficiente? me fez pensar se existe alguma relação entre a fragmentação da memória medida por cat /proc/buddyinfo e se a troca está ou não em uso. Para ser mais específico, gostaria de saber se a utilização de swap pode reduzir a fragmentação da memória. Durante um dia normal de trabalho com troca no meu sistema, tenho o seguinte:

tvbox@tvbox-G31M-ES2L:~$ cat /proc/buddyinfo
Node 0, zone      DMA      3      3      4     14     16      6      2      0      0      1      0 
Node 0, zone   Normal   1564   1052    462    356    240    109     33     21      6      1      0 
Node 0, zone  HighMem     43   1972    839    285    183    109     98     34     16      0      0 
tvbox@tvbox-G31M-ES2L:~$ free
             total       used       free     shared    buffers     cached
Mem:       2053888    1821904     231984     171376     299908     812940
-/+ buffers/cache:     709056    1344832
Swap:            0          0          0

Nota: este sistema possui um tempo de atividade que nunca excede 18 horas.

Em um sistema mais utilizado, tenho o seguinte:

me@me-zippy:~$ cat /proc/buddyinfo
Node 0, zone      DMA    149    106     70     26     15      5      4      0      0      2      0 
Node 0, zone   Normal   2455   3527   4651   1421    367    157     61     19     14      3      0 
Node 0, zone  HighMem      7     43     75    266    166    162     91     43     27      0      0 
me@me-zippy:~$ free -h
             total       used       free     shared    buffers     cached
Mem:          7.4G       7.0G       351M       281M       116M       6.0G
-/+ buffers/cache:       967M       6.4G
Swap:           0B         0B         0B
me@me-zippy:~$ uptime
 12:01:49 up 3 days,  3:20,  2 users,  load average: 0.52, 0.23, 0.17

Você notará que nenhum desses sistemas tem a troca ativada.

Elder Geek
fonte
4
Por curiosidade, por que importaria se a memória estivesse fragmentada? Não é como um disco rígido onde o tempo de busca é importante. A memória sempre aparecerá logicamente contígua no espaço de endereço virtual do processo, portanto, o espaço do usuário não pode nem dizer se a memória está fragmentada no nível físico. É porque as tabelas de conversão de páginas se tornam mais complicadas?
Celada
Boa pergunta. A condição foi levantada como um motivo para usar a troca. Eu continuo cético, então estou procurando por qualquer conexão entre utilização de swap e fragmentação de memória. Não espero encontrar um, mas estou sempre disposto a mudar minha postura diante de novas informações. Eu posso acabar respondendo a mim mesmo depois de mais testes.
Elder Geek

Respostas:

3

A troca permite que as páginas físicas sejam movidas, no sentido de que uma página usada para uma finalidade pode ter seu conteúdo trocado e usado para outra finalidade.

Sob um sistema de gerenciamento de memória virtual de grande variedade, não existe fragmentação da memória física no que diz respeito aos aplicativos. Cada página alocada por um aplicativo pode ser acessada em qualquer lugar da memória física; não há motivo para que duas páginas consecutivas na memória virtual precisem ter uma proximidade específica na memória física.

Há muitos casos em que a fragmentação da memória é uma preocupação: quaisquer circunstâncias em que a localização da memória física seja importante. Isso inclui:

  • Paravirtualização , onde as máquinas virtuais decidem quem é o proprietário de qual página física em uma granularidade mais grossa do que uma página.
  • Da mesma forma, clusters em que vários nós compartilham o mesmo conjunto de RAM.
  • Memória usada por periféricos, que geralmente requer grandes buffers contíguos.
  • Otimizações, como páginas enormes .

Na ausência de cenários "complexos", a fragmentação da memória física pode causar problemas na conexão de um novo dispositivo que requer um pool de memória contígua (o kernel mantém esses pools para isso, mas eles podem precisar ser aumentados se um driver repentinamente fizer uma grande solicitação). Se o uso do dispositivo for constante, a fragmentação física não importaria e, em particular, não faria com que um aplicativo fosse executado mais lentamente ou sem espaço.

É possível que a fragmentação do espaço de endereço físico possa levar ao uso de mais memória no kernel para representar a lista livre. Não acredito que seja esse o caso do Linux, mas estou longe de ser um especialista em gerenciamento de memória.

Resumindo, permitir a troca de parte de um aplicativo não permite que esse aplicativo aloque mais memória, mas pode permitir que alguns drivers de hardware aloquem a memória necessária.

A adição de troca não tem efeito no espaço de memória virtual do aplicativo. Afinal, esse é o ponto de troca - é transparente para os aplicativos.

No entanto, é possível que adicionar swap a uma máquina tenha uma influência indireta na fragmentação dentro do espaço de memória virtual de um aplicativo. Se o sistema ficar sem memória virtual, o aplicativo terá que se contentar com o que possui. Se o aplicativo estiver usando a maior parte da memória alocada no sistema operacional, isso com o tempo causará fragmentação dentro desse espaço, à medida que pequenos blocos são liberados aqui e ali. Se o aplicativo tiver mais memória virtual (algumas das quais trocadas), isso dará ao gerenciador de memória mais espaço de manobra e reduzirá o risco de que o aplicativo fique sem memória, com três blocos separados de 2kB disponíveis quando ele deseja um único Objeto de 4kB.

Gilles 'SO- parar de ser mau'
fonte
Não é interessante como todas as respostas levam a uma nova pergunta? Agora, fico curioso sobre a ordem das operações de gerenciamento de memória e quais técnicas para liberar memória precisam falhar antes que uma condição de falta de memória seja atingida. Minha suposição é que o cache é menos importante e seria descartado primeiro. Eu sei que há um núcleo de verdade aqui em algum lugar (trocadilhos). ;-)
Elder Geek
@ElderGeek - Documentation / cgroups / memory.txt é provavelmente um bom lugar para começar. Embora esteja irremediavelmente desatualizado, ele apresenta uma visão geral do controlador de memória do kernel.
mikeserv
@ mikeserv Obrigado por isso. Eu também encontrei - landley.net/writing/memory-faq.txt, que também parece estar "irremediavelmente desatualizado", mas pelo menos parece minha teoria sobre o despejo lógico do cache primeiro para liberar RAM antes de recorrer à morte processos são precisos. Duvido que eu aprenda muito mais sobre isso sem me aprofundar no próprio código. Isso pode ser um pouco além de mim como eu não ter escrito qualquer código para além bash script por décadas ...
Elder Geek