Qual métrica devo usar para determinar quando um servidor está com pouca memória?

7

Existem inúmeras (centenas?) de diferentes medidas para uso de memória em uma máquina Linux, mas o que é uma boa heurística / métrica para ajudar a determinar se um servidor precisa de mais memória?

Algumas ideias:

  • Olhando para MemTotal - Ativo - Inativo de / proc / meminfo como uma medida da memória "com fio"
  • Analisando a soma dos valores RSS de todos os processos em ps
  • Olhando para Committed_AS em / proc / meminfo
por loopj 11.10.2012 / 07:33

6 respostas

2

O Kernel do Linux 4.20 adicionou PSI , que significa "informação sobre a perda de pressão". Dá-lhe mais insights porque uma máquina está sobrecarregada. E qual recurso é o gargalo.

Existem três novos arquivos em /proc/pressure :

  • /proc/pressure/cpu
  • /proc/pressure/memory
  • /proc/pressure/io

Para citar Controlando informações sobre a barra de pressão sobre /proc/pressure/memory :

Its output looks like:

some avg10=70.24 avg60=68.52 avg300=69.91 total=3559632828
full avg10=57.59 avg60=58.06 avg300=60.38 total=3300487258

The some line is similar to the CPU information: it tracks the percentage of the time that at least one process could be running if it weren't waiting for memory resources. In particular, the time spent for swapping in, refaulting pages from the page cache, and performing direct reclaim is tracked in this way. It is, thus, a good indicator of when the system is thrashing due to a lack of memory.

The full line is a little different: it tracks the time that nobody is able to use the CPU for actual work due to memory pressure. If all processes are waiting for paging I/O, the CPU may look idle, but that's not because of a lack of work to do. If those processes are performing memory reclaim, the end result is nearly the same; the CPU is busy, but it's not doing the work that the computer is there to do. If the full numbers are much above zero, it's clear that the system lacks the memory it needs to support the current workload.

Ainda não tenho acesso a um servidor de produção com o Linux 4.20, mas aqui está uma pequena experiência na minha área de trabalho (que não tem swap configurada). Inicialmente, não tenho pressão de memória (todos os contadores são 0):

$ cat /proc/pressure/memory
some avg10=0.00 avg60=0.00 avg300=0.00 total=0
full avg10=0.00 avg60=0.00 avg300=0.00 total=0

Depois, aumentei o uso de memória até ficar sem memória, o que congelou a máquina até que a OOM matasse alguns processos. Antes de congelar, a pressão na memória aumentou:

some avg10=0.00 avg60=0.00 avg300=0.00 total=0
full avg10=0.00 avg60=0.00 avg300=0.00 total=0

some avg10=0.00 avg60=0.00 avg300=0.00 total=47047
full avg10=0.00 avg60=0.00 avg300=0.00 total=32839

some avg10=0.00 avg60=0.00 avg300=0.00 total=116425
full avg10=0.00 avg60=0.00 avg300=0.00 total=81497

some avg10=1.26 avg60=0.22 avg300=0.04 total=183863
full avg10=0.72 avg60=0.13 avg300=0.02 total=127684

Agora, depois que o sistema tiver se recuperado, a pressão da memória será novamente 0 e os contadores total não aumentarão mais:

$ cat /proc/pressure/memory 
some avg10=0.00 avg60=0.00 avg300=0.07 total=53910568
full avg10=0.00 avg60=0.00 avg300=0.02 total=27766222

...

$ cat /proc/pressure/memory 
some avg10=0.00 avg60=0.00 avg300=0.05 total=53910568
full avg10=0.00 avg60=0.00 avg300=0.00 total=27766222
    
por 14.01.2019 / 22:19
2

Não há resposta certa para isso.

Peter está correto em dizer que os valores que você precisa olhar são reportados no topo e de graça (você pode obter o para o pacote procps que mostra como obter esses valores de 'C' - mas para scripts é mais simples executar 'free' ')

Se o sistema tiver memória não utilizada (a primeira linha de saída livre), é improvável que seja mais rápido adicionando mais memória - mas pode ficar mais rápido reduzindo a pressão do cache VFS (mantenha as coisas no cache por mais tempo).

Embora não haja uma resposta correta, há muitos errados - você não pode dizer do espaço do usuário quais páginas são compartilhadas, mas acessadas por diferentes locais - olhar para o uso da memória para determinar quanta memória é livre simplesmente não funciona. / p>

Como ponto de partida, você deve estar olhando para os dois valores de memória livre informados por 'free'

    
por 11.10.2012 / 10:56
2

Eu já disse isso antes, a melhor medida para obter o requisito de memória em tempo real é observar o campo COmmitted_AS em / proc / meminfo e compará-lo ao longo do tempo para ver quanta memória você precisa.

Teoricamente, se o seu Committed_AS estiver sempre acima de (Memfree + swapfree), então você está bem. Mas se for menor que isso e você acumular sua carga de trabalho no sistema ao longo do tempo, estará se aproximando de uma situação de OOM. O valor Committed_AS determina quanta memória é necessária para o sistema se todas as solicitações de memória estiverem sendo concedidas ao sistema neste mesmo instante.

O monitoramento é uma boa medida ao longo do tempo para ver se é necessário aumentar a RAM ou se você precisa diminuir a carga de trabalho.

    
por 11.10.2012 / 11:47
2

Realmente, tudo depende da (s) aplicação (ões), no entanto, você pode usar o método empregado pelo kernel para determinar a pressão da memória, o que lhe dará uma visão geral sobre a capacidade dos hosts de gerenciar a memória.

A pressão da memória é ideal, já que não tem nenhuma preocupação com o cache de páginas, o swappiness ou mesmo com a quantidade de memória que você realmente tem.

A pressão da memória é efetivamente uma contagem de quantas páginas querem ser marcadas como ativas por / proc / meminfo . O kernel mede a pressão de memória mantendo o controle de quantas páginas vão de "inativas" a "ativas" na tabela de páginas. Um monte de mudanças entre esses dois status indica que você provavelmente não tem muita memória sobressalente disponível para tornar mais páginas ativas.

Baixa pressão de memória é indicada por ter muito poucas promoções de inativas para ativas (porque o kernel claramente tem espaço suficiente para manter as páginas ativas ativas).

Este script medirá a pressão a cada PERIODIC segundos. Quanto mais dados você puder coletar, melhor. A ideia aqui é você fazer um gráfico dos dados e furar o seu eixo Y com 0 no centro. Em circunstâncias ideais, o gráfico deve ter uma linha horizontal de 0. Se as linhas ficarem regularmente fora de 0 (particularmente 'Ativo' sendo positivo, ou aumentando bastante regularmente), a pressão de memória no host é alta e mais memória seria benéfica.

#!/usr/bin/python
import os
import sys
import re
import time

PERIODIC = 1
pgs = re.compile('Active:\s+([0-9]+) kB\nInactive:\s+([0-9]+) kB')
meminfo = open('/proc/meminfo')

def read_meminfo():
    content = meminfo.read(4096)
    m = pgs.search(content, re.M)
    active, inactive = int(m.group(1)), int(m.group(2))
    active = active / 4
    inactive = inactive / 4
    meminfo.seek(0, 0)
    return active,inactive  

if __name__ == "__main__":
    oldac, oldin = read_meminfo()
    while True:
        time.sleep(PERIODIC)
        active, inactive = read_meminfo()
        print "Inactive Pressure:\t%d" % (inactive - oldin)
        print "Active Pressure:\t%d" % (active - oldac)
        oldac = active
        oldin = inactive
    
por 11.10.2012 / 16:34
1

Você pode executar o comando top para ver uma visão geral de todos os principais componentes do Linux, incluindo o uso da memória. Ao visualizar a parte superior pela primeira vez, observe que a memória usada inclui buffers e cache, se houver.

Existe também o comando free para a memória. Você pode executar como free -m para visualizar a memória livre em megabytes.

Existem muito mais ferramentas, mas acho que isso respondeu suficientemente à parte da ferramenta da questão.

Quanto a quando você precisa de mais memória depende do aplicativo que você está executando. Precisa de capacidade de ruptura? Beneficia-se strongmente de um grande tamanho de cache? Mas, geralmente, se você está fazendo swap e frequentemente, você realmente precisa de mais memória RAM.

    
por 11.10.2012 / 07:45
1

Se eu fosse você, coletaria dados sobre carga, memória livre, free -m e a principal característica de desempenho do seu servidor (por exemplo, latência por solicitação) e faria um gráfico no Calc / Excel, tentando discernir o "local de troca" "para vários pontos de dados (configurações de memória - 8 G, 16G, 32G, etc.). Então, eu tentaria várias regressões para encontrar o link entre o "penhasco" e a memória disponível.

Uma pesquisa na literatura existente em CiteSeerX também ajudaria.

    
por 11.10.2012 / 11:22

Tags