Aumentare costantemente le dimensioni dello swap in Linux e lo spazio di swap non viene recuperato?


10

Ho un box Linux da 8 GB di RAM su cui sono in esecuzione 4 server Tomcat. Uno di questi è impostato su 3000 MB di memoria (impostazione jvm -Xms e -Xmx) e altri su 1500 MB. Anche la partizione di swap è impostata su 8Gigs. Quando avvio questi server, l'utilizzo del file di scambio è basso. Ma per un periodo di giorni e durante determinati periodi in cui uno / tutti i server sono in attività di punta, l'utilizzo dello swap inizia ad aumentare. Ecco un tipico output sar -r.

kbmemfree kbmemused% membbed kbbuffer kbcached kbswpfree kbswpused % swpused kbswpcad

48260 8125832 99,41 196440 2761852 7197688 1190912 14,20 316044

75504 8098588 99.08 198032 2399460 7197688 1190912 14.20 316032

Mostra lo swap del 14,2% attualmente utilizzato. La cosa divertente è che questa% NON diminuisce MAI . Continua ad aumentare e raggiunge fino al 30-40% . Riavviamo i nostri server settimanalmente.

Suppongo che la % swpused aumenti durante i periodi di picco dell'attività e diminuisca durante i periodi di bassa attività ... O almeno rimanga costante. Sembra che lo spazio di swap non venga mai recuperato dal sistema operativo.

Output di libero: libero -m totale usato libero buffer condiviso condiviso memorizzato nella cache Mem: 7982 7937 45 0 32 2088 - / + buffer / cache: 5816 2166 Swap: 8191 1163 7028

Quindi ci sono almeno 2 g di Ram gratis. Quindi la domanda è: perché lo spazio di swap continua ad aumentare e non viene recuperato dal sistema operativo? O come eseguire il debug di questo per capire cosa sta succedendo ...

Risposte:


12

Se le informazioni vengono scambiate su disco e successivamente rilette in memoria, spesso vengono lasciate allocate nell'area di scambio fino a quando lo spazio di scambio non si esaurisce. Ciò significa che se le stesse informazioni devono essere scambiate nuovamente in un secondo momento e non sono state modificate, il sistema operativo può semplicemente eliminare le pagine dalla RAM allocata senza dover scrivere nulla sul disco risparmiando tempo.

Verrà liberato anche lo swap allocato alle cose che sono state lette in memoria

  1. quando le pagine pertinenti non sono più necessarie (ovvero vengono liberate dall'applicazione)
  2. quando le pagine pertinenti vengono modificate (quindi la copia su disco non è più aggiornata)
  3. la macchina ha poco spazio di swap, quindi cancella alcune cose che sono già nella RAM per fare spazio

Cerca /proc/meminfouna riga chiamata "SwapCached". Questa voce conta le pagine che si trovano sia nella RAM che nelle partizioni di swap. Ad esempio, selezionando casualmente una piccola VM, il /proc/meminfofile virtuale su una delle mie VM mostra:

SwapTotal:        698816 kB
SwapFree:         624520 kB
SwapCached:        17232 kB

indicando che 74268K di spazio di swap sono allocati, ma che 17232K di quelle pagine sono anche attualmente mappate nella RAM (quindi potrebbero essere deallocate da swap in un momento se lo spazio è necessario per qualcos'altro).

Inoltre, ci saranno senza dubbio pagine sedute lì che sono state scambiate anni fa e da allora non sono più state utilizzate. Il kernel non ricaricherà le pagine dallo swap solo perché c'è della RAM libera in cui rileggerlo poiché quella RAM potrebbe essere meglio utilizzata per cache o buffer - le pagine scritte per lo scambio sono generalmente rilette solo quando sono necessarie in seguito.

Se vuoi cancellare ciò che è in scambio, a patto che tu abbia abbastanza libero e / o libero (cioè libero + cache + buffer (meno quelle parti dei conteggi c + b che non sono libere di RightThisInstant)), basta girarlo spento e riacceso con swapoff -a && swapon -a.

Ovviamente potresti anche avere una perdita di memoria da qualche parte, ma questa non è l'unica spiegazione del comportamento che stai vedendo.


Risposta eccellente Grazie. Quindi il mio sistema attualmente mostra SwapTotal: 8388600 kB SwapFree: 7197688 kB SwapCached: 595724 kB Quindi Scambio effettivo gratuito = 7197688 + 595724 = 7793412. Actul Swap utilizzato = 8388600-7793412 = 595188 == 581MB. Immagino che 581 MB di utilizzo del file di scambio siano ragionevoli per un sistema da 8 GB con 4 app in esecuzione. Consentitemi di monitorare questo per i prossimi due giorni e vedere se la cifra di swapCached continua ad aumentare proporzionalmente a% di swapUsed.
Zenil

2

Fondamentalmente, non è necessario preoccuparsene. Ciò che è importante sapere è quanto IO va allo scambio (dai un'occhiata al comando 'vmstat'). Avere più cose nello scambio non costa nulla. L'unico costo è mettere cose nello swap (pagina dentro) o eliminarle (pagina fuori). Quindi è perfettamente ragionevole per il sistema operativo far crescere lo swap.


1
È importante sapere perché lo swap sta crescendo e non diminuendo mai ... Cosa succede se permettiamo ai nostri server di continuare a funzionare per settimane? Lo scambio aumenterà oltre il limite e causerà problemi di memoria? Lo swapin / swapout sembra "ragionevole" .. Durante i periodi di picco dell'attività vi è un elevato swapin / swapout (e anche aumenti% swapused) .. Durante i periodi normali lo swapin / swapout è minimo ma% swapused non diminuisce
Zenil

0

fino a quando si dispone di spazio di swap, non è necessario che il sistema operativo liberi lo spazio di swap. Sarà liberato quando non c'è più spazio. Bu quando ti trovi in ​​questa situazione hai sicuramente un problema.


0

Non c'è modo di sapere se alla fine questo diventerà un problema se non si esegue un server abbastanza a lungo per vedere se diventa un problema.

Fondamentalmente il sistema operativo cambierà le cose che non vengono utilizzate per mantenere sempre un po 'di memoria libera, nel caso in cui venga avviato un nuovo programma. Lo spazio di swap non verrà liberato finché non sarà necessario, il che significa che è possibile utilizzare lo spazio di swap al 100% e non avere problemi di prestazioni. La cosa di cui preoccuparsi è se questo è causato da una perdita di memoria. Non è necessariamente una perdita di memoria ma potrebbe esserlo.

Java non è soggetto a perdite di memoria, ma può accadere soprattutto con applicazioni complicate.

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.