Dovrei preoccuparmi che lo swap venga utilizzato su un host con quasi 40 GB di memoria libera?


39

Ho un host di produzione, di seguito:

htop

Il sistema utilizza 1 GB di swap, pur mantenendo quasi 40 GB di spazio di memoria libero e inutilizzato. Dovrei essere preoccupato per questo, o è per lo più normale?


23
In realtà, dovresti essere preoccupato per un host di produzione con carico reale che spreca quasi 40 GB di memoria. Sicuramente potrebbe essere utile usare questa memoria: le applicazioni accedono ai dischi, non potrebbe usare quella memoria per memorizzare nella cache alcuni di quei dati, ridurre gli I / O e migliorarne le prestazioni? Perché 40 GB di memoria vengono sprecati su una macchina che funziona? Questo è ciò di cui dovresti preoccuparti. Non è normale
David Schwartz,

25
Sarebbe davvero più utile se ci mostrassi l'output di free -m. La grafica è difficile da leggere.
user9517 supporta GoFundMonica il

@DavidSchwartz - Ho una domanda correlata che è ancora attiva proprio su questo. serverfault.com/questions/825909/…
MrDuk

Risposte:


68

Questo non è un problema ed è probabilmente normale. Un sacco di codice (e possibilmente dati) viene utilizzato molto raramente, quindi il sistema lo scambia per liberare memoria.

Lo scambio è principalmente un problema solo se la memoria viene scambiata continuamente dentro e fuori. È quel tipo di attività che uccide le prestazioni e suggerisce un problema altrove nel sistema.

Se vuoi monitorare la tua attività di swap puoi farlo con diverse utility ma di vmstatsolito è abbastanza utile, ad es

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 348256  73540 274600    0    0     1     9    9    6  2  0 98  0  0
 0  0      0 348240  73544 274620    0    0     0    16   28   26  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   29   33  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   21   23  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   24   26  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   23   23  0  0 100  0  0

Ignora la prima riga in quanto attività dall'avvio del sistema. Nota le colonne sie sosotto ---swap--; dovrebbero generalmente essere cifre abbastanza piccole se non 0 per la maggior parte del tempo.

Vale anche la pena ricordare che questo scambio preventivo può essere controllato con un'impostazione del kernel. Il file in /proc/sys/vm/swappinesscontiene un numero compreso tra 0 e 100 che indica al kernel quanto è aggressivo lo scambio di memoria. Controlla il file per vedere a cosa è impostato. Per impostazione predefinita, la maggior parte delle distribuzioni Linux impostano questo valore su 60, ma se non si desidera vedere alcuno scambio prima che la memoria sia esaurita, inserire uno 0 nel file in questo modo:

echo 0 >/proc/sys/vm/swappiness

Questo può essere reso permanente aggiungendo

vm.swappiness = 0

a /etc/sysctl.conf.


14
Vale anche la pena ricordare che questo scambio preventivo può essere controllato con un'impostazione del kernel. Il file in / proc / sys / vm / swappiness contiene un numero compreso tra 0 e 100 che indica al kernel quanto aggressivamente sostituire la memoria. Controlla il file per vedere a cosa è impostato. Per impostazione predefinita, la maggior parte delle distribuzioni Linux di default questo a 60, ma se non si desidera visualizzare qualsiasi scambio prima che la memoria è esaurita, eco uno 0 nel file in questo modo: echo 0 >/proc/sys/vm/swappiness. Questo può essere reso permanente aggiungendo vm.swappiness = 0a /etc/sysctl.conf.
Virtex,

@virtex: mi piace usare swappiness = 1, o solo qualcosa di meno di 10, sul mio desktop. Ciò potrebbe andare bene anche sui server per la maggior parte del tempo. Scoraggia fortemente lo scambio per liberare la RAM per più pagecache, senza proibirla del tutto.
Peter Cordes,

1
@PeterCordes Abbi cura dei server, in particolare di quelli che accedono ai database o servono i file. Questi potrebbero trarre molti benefici dalla memoria che diventa disponibile per le cache dei file.
Jonas Schäfer,

4
@JonasWielicki: anche con swappiness=7o qualcosa del genere, le pagine inutilizzate a lungo termine vengono scambiate. C'è una grande differenza tra swappiness=0e qualsiasi altro valore, anche valori bassi. Il kernel predefinito swappiness=60è generalmente buono per i server, ed è solo per uso interattivo desktop in cui una bassa swappiness è buona. Ma impostandolo su 7 o qualcosa del genere non dovrebbe fare molto male. (Ma non ho controllato, non sono un amministratore di sistema del server).
Peter Cordes,

2
@PeterCordes Fino a quando non metti pressione sulla memoria, tutto swappinessfunziona alla grande. Con la pressione, vedrai che swappiness=7affama la cache dei file quasi completamente per un lungo periodo di tempo, mentre swappiness=60liquida molta cache ma inizia anche a scambiarsi in pochi secondi. È ancora la cache che prende il pestaggio, ma in un modo molto più equilibrato.
Kubanczyk,

25

Linux scriverà preventivamente le pagine sul disco se non ha niente di meglio da fare. Ciò non significa che sfratterà quelle pagine dalla memoria, però. È solo che nel caso in cui debba sfrattare quelle pagine in futuro, non ha bisogno di aspettare che vengano scritte su disco, perché sono già lì.

Dopotutto, il motivo per cui stai esaurendo la memoria, è probabilmente perché la tua macchina sta già lavorando sodo, non vuoi caricarla ulteriormente con lo scambio. Meglio fare lo scambio quando la macchina non sta facendo nulla.

Per un motivo simile, la tua memoria dovrebbe essere sempre piena. Pagine di memoria, cache del filesystem tmpfs, ci sono così tante cose che potrebbero essere conservate in memoria. Davvero, dovresti preoccuparti se la tua memoria è vuota; dopotutto, hai pagato un sacco di soldi (almeno rispetto alla stessa quantità di spazio su disco), quindi è meglio usarlo!


Jorg, le pagine che il kernel scrive preventivamente sui dischi non sono pagine di scambio, sono pagine di cache del disco sporche. I parametri sintonizzabili vm.dirty_background _... lo controllano. L'attività di swap out inizia in base alla sintonizzazione della swapiness e non attende i tempi di inattività.
Lucas,

11

Lo swap utilizzato non è male, ma molta attività di swap lo è

  vmstat 1
  procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
  6  0 521040 114564   6688 377308    8   13   639   173    0 1100  5  4 90  0
  1  0 521040 114964   6688 377448    0    0   256     0    0 1826  3  4 94  0
  0  0 521040 115956   6688 377448    0    0     0     0    0 1182  7  3 90  0
  0  0 521036 115992   6688 377448    4    0    16     0    0 1154 10  2 88  0
  3  0 521036 114628   6696 377640    0    0   928   224    0 1503 15 17 67  1

La colonna di swapd non è affatto un problema. Valori diversi da zero sulle colonne si e quindi sono mortali per le prestazioni del server. Soprattutto quelli con molta RAM.

È meglio disabilitare lo swapinness su macchine con diversi GB di RAM:

sysctl -w vm.swappiness=0

Ciò non disabiliterà lo scambio. Indica a Linux solo di utilizzare lo swap come ultima risorsa. Ciò sprecherà alcuni MB di programmi che non devono essere nella RAM ... Ma è preferibile scambiare il gonfiore delle code di accesso al disco.

Modifica 1: perché il valore predefinito di swapiness non è ottimale

Dobbiamo ricordare due decenni fa che un grande 486 aveva solo 32 Mb di RAM. Gli algoritmi di swap sono stati sviluppati quando l'intera RAM poteva essere spostata sul disco in una piccola frazione di secondo. Anche con i dischi più lenti di quel tempo. Questo è il motivo per cui i criteri di scambio predefiniti sono così aggressivi. La RAM era il collo di bottiglia in quei giorni. Da allora la dimensione della RAM è aumentata di oltre 10.000 volte e la velocità del disco è inferiore a 10 volte. Ciò ha spostato il collo di bottiglia sulla larghezza di banda del disco.

Modifica 2: perché l'attività è così letale per i server?

Si e così l' attività su macchine con tonnellate di RAM è mortale perché significa che il sistema sta combattendo con se stesso per la RAM. Quello che succede è che i dischi, anche i grandi archivi sono troppo lenti rispetto alle RAM. Lo scambio aggressivo favorisce la cache del disco del kernel rispetto ai dati dell'applicazione ed è la fonte più comune di lotta per la RAM. Poiché il sistema operativo dovrà liberare la cache del disco su ogni si , il tempo necessario per vivere la cache aggiuntiva fornita dallo swap è troppo basso per essere comunque utile. Il risultato è che stai prendendo la larghezza di banda del disco per memorizzare la cache che probabilmente non verrà utilizzata e mettere in pausa i tuoi programmi in attesa delle pagine si . Ciò significa che consuma molte risorse critiche con scarsi o nulli vantaggi per le applicazioni.

Nota il titolo della risposta "molta attività di scambio su server con molta RAM". Questo non si applica alle macchine con si occasionale e quindi attività. Ciò potrebbe non applicarsi in futuro se nei sistemi operativi vengono sviluppati algoritmi di scambio più intelligenti.

Modifica 3: pagine "fredde"

Le persone romanticizzano l'algoritmo di scambio. Alcuni dicono "richiede meno pagine della RAM utilizzate", ma questo non è affatto ciò che fa il kernel. La cosa che è difficile da capire su swap è che il kernel non sa cosa sia una "pagina fredda". Il kernel non ha una buona metrica per determinare se la pagina viene utilizzata o probabilmente verrà utilizzata nel prossimo futuro. Per evitare che il kernel inserisca le pagine nello scambio più o meno in modo casuale e le pagine non necessarie restano lì. Il problema di quell'algoritmo è che le pagine devono andare allo scambio per sapere se sono necessarie per le applicazioni. E questo significa che molte pagine "calde" andranno allo scambio. Il problema è che i dischi sono troppo dannatamente lenti rispetto alla RAM.

Ho costruito il mio benchmark che è uno scenario realistico molto comune a molte applicazioni con un volume decente. Dai miei test, non ho riscontrato alcun vantaggio sulla velocità effettiva o sulla latenza quando sono in uso gli swap. Lontano da esso. Quando si avvia lo scambio, questo rallenta la velocità effettiva e la latenza di almeno un ordine di grandezza.

Vado un po 'oltre a questo: capisco che lo swap non è per l'elaborazione. Gli swap sono solo per le emergenze. Quei momenti in cui troppe applicazioni sono in esecuzione contemporaneamente e si ottiene un picco di memoria. Senza scambio ciò causerebbe errori di memoria insufficiente. Considero l'utilizzo dello swap un fallimento dei team di sviluppo e produzione. Questa è solo un'opinione che va ben oltre ciò di cui abbiamo discusso qui, ma è quello che penso. Naturalmente le mie applicazioni hanno un'eccellente gestione della memoria da sole.


9
"Meglio disabilitare lo swapinness" Meglio, perché? (Meglio, a quale scopo?) L'impostazione predefinita potrebbe non essere adatta a tutti gli usi, ma avrei comunque bisogno di un motivo per cambiarlo.
jpaugh,

3
Come è sipiù mortale per il tuo server di bi? Entrambi significano che alcuni programmi sono in attesa di 4096 byte da leggere dal disco alla memoria. Il bida qualsiasi file, e sida una specifica categoria ristretta di file (ma i loro byte spostare altrettanto veloce attraverso esattamente lo stesso percorso).
Kubanczyk,

2
Un 486 con 128 MB di RAM era molto raro e sarebbe stato considerato un mainframe o un supercomputer - quindi la CPU sarebbe stata probabilmente 486. Il mio vecchio 486 aveva 4 MB di RAM ed ero invidioso della macchina del mio amico con 16 MB di ram (server di grandi dimensioni aveva da 16 a 32 MB di RAM). Avanti veloce a Pentiums e iniziamo a vedere da 8 a 16 MB come di consueto. Quando Pentium3 è apparso per la prima volta (quando le CPU hanno iniziato normalmente a superare 1GHz) 32 MB era normale e i server Web in genere avevano da 64 a 128 MB.
Slebetman,

swappiness=0sembra totalmente inappropriato per i server. Potresti considerarlo per un sistema desktop interattivo (ma anche in questo caso, swappiness=1è una scelta migliore per eventualmente scambiare pagine davvero fredde). Vedi i commenti su un'altra risposta . swappiness=7o qualcosa ridurrà drasticamente l'attività di scambio senza bloccare pagine fredde nella RAM fino a OOM, e vale la pena considerare se pensi che 60sia troppo swappy per un server specifico.
Peter Cordes,

1
@kubanczyk: penso che sisia peggio di bi. La maggior parte del software server è progettata in base al presupposto che l'I / O dal disco potrebbe essere lento e utilizza thread, I / O asincroni o altre tecniche per rimanere reattivo in generale durante l'attesa dell'I / O. Un errore di pagina potrebbe verificarsi ovunque. Nel peggiore dei casi, dopo un blocco potrebbe verificarsi un errore di pagina lenta, impedendo a tutti gli altri thread di accedere a quella sezione critica per ~ 10ms (con scambio su memoria a rotazione lenta). Ciò potrebbe essere plausibile se una sezione critica copia i dati da una struttura di dati condivisa a una pagina potenzialmente fredda.
Peter Cordes,

8

Questa non è una risposta alla tua domanda; ma piuttosto, solo informazioni extra per aiutarti a prendere una decisione informata.

Se desideri sapere quali processi utilizzano specificamente la quantità di scambio, ecco un piccolo script di shell:

#!/bin/bash

set -o posix
set -u

OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d -regex "^/proc/[0-9]+"` ; do
  PID=`echo $DIR | cut -d / -f 3`
  PROGNAME=`ps -p $PID -o comm --no-headers`

  SUM=0
  for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'` ; do
    let SUM=$SUM+$SWAP
  done
  echo "PID=$PID - Swap used: $SUM - ($PROGNAME )"

  let OVERALL=$OVERALL+$SUM
done
echo "Overall swap used: $OVERALL"

Vorrei anche aggiungere che anche tmpfs cambierà. Questo è più comune sui moderni sistemi Linux che usano systemd che creano sovrapposizioni di spazio utente / tmp usando tmpfs.


Bella sceneggiatura. Dai un'occhiata anche a smem.
user9517 supporta GoFundMonica il

Penso che potresti scriverlo molto più efficientemente ( molti meno processi biforcuti) con awk '/Swap/ {sw += $2} FNR==1 { /*first line of a new file */ find the command somehow, maybe still fork/exec ps;} END { print totals }' /proc/[0-9]*/smaps. Funziona con cut e ps per ogni processo e grep + awk più volte per ogni processo nel sistema.
Peter Cordes,

0

Ho notato che la replica di MySQL Cluster rallenta o fallisce quando gli agenti si scambiano pesantemente. Forse ad alcune applicazioni non importa o magari beneficiano di alcuni scambi, ma i database sembrano davvero soffrirne. Tuttavia, molte discussioni che ho visto nei forum parlano di swap decontestualizzati dalla specifica discussione sul carico di lavoro.

Nel mondo DBA il consenso sembra essere che "È logico che quando si esegue MySQL (o realmente qualsiasi altro DBMS) non si desidera vedere alcun I / O nel proprio spazio di swap. Ridimensionamento della dimensione della cache (usando innodb_buffer_pool_size nel caso di MySQL) è una pratica standard per assicurarsi che ci sia abbastanza memoria libera, quindi non è necessario lo scambio.

Ma cosa succede se si commette un errore o un errore di calcolo e lo scambio avviene? Quanto influisce davvero sulle prestazioni? Questo è esattamente ciò che ho deciso di indagare. "

Spero che i lettori troveranno i seguenti collegamenti a proposito.

https://www.percona.com/blog/2017/01/13/impact-of-swapping-on-mysql-performance/

https://www.percona.com/blog/2010/01/18/why-swapping-is-bad-for-mysql-performance/


1
Benvenuti in Server Fault! Sebbene ciò possa teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il collegamento come riferimento.
Frederik Nielsen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.