Perché Swap viene utilizzato quando è rimasta molta memoria libera?


35

Ho un server web (dedicato) abbastanza buono con buone risorse di memoria:

System information
Server load     2.19 (8 CPUs)   
Memory Used     29.53% (4,804,144 of 16,267,652)    
Swap Used   10.52% (220,612 of 2,097,136)   

Come puoi vedere, il mio server sta usando lo scambio quando c'è molta memoria libera disponibile.

È normale o c'è qualcosa che non va nella configurazione o nella codifica?

NB Il
mio processo MySQL sta utilizzando oltre il 160% della potenza della CPU per qualche motivo; Non so perché, ma non ho più di 70 utenti simultanei ...


Le applicazioni possono utilizzare oltre il 100% della CPU in Linux? Ehm ...
BlueRaja,

5
@BlueRaja: Sì, perché in Linux l'utilizzo della CPU viene misurato rispetto a una singola CPU, non a tutte le CPU del sistema. Quindi in una macchina con 8 CPU, hai un massimo dell'800% di CPU disponibile.
Daniel Pryden,

Quale versione di MySQL stai usando ???
RolandoMySQLDBA

@RolandoMySQLDBA versione 5.5
user1179459

Risposte:


61

Questo è perfettamente normale.

All'avvio del sistema, vengono avviati numerosi servizi. Questi servizi si inizializzano da soli, leggono nei file di configurazione, creano strutture di dati e così via. Usano un po 'di memoria. Molti di questi servizi non funzioneranno mai più per tutto il tempo in cui il sistema è attivo perché non li stai usando. Alcuni di essi possono funzionare in ore, giorni o settimane. Eppure tutti questi dati sono nella memoria fisica.

Ovviamente, il sistema non può eliminare questi dati. Non può dimostrare che non sarà mai possibile accedervi. Uno di questi servizi, ad esempio, potrebbe essere quello che ti fornisce l'accesso remoto alla scatola. Potresti non averlo usato in una settimana, ma se lo usi, avrebbe funzionato meglio.

Ma il sistema sa che potrebbe piacere usare quella memoria fisica per cose come una cache del disco o in altri modi che miglioreranno le prestazioni. Quindi esegue lo scambio opportunistico. Quando non ha niente di meglio da fare, scrive su disco i dati che non sono stati usati da molto tempo, usando lo spazio di swap. Tuttavia, mantiene ancora le pagine nella memoria fisica. Quindi è ancora possibile accedervi senza doverli scambiare.

Ora, se il sistema in seguito ha bisogno di quella memoria fisica per qualcos'altro, può semplicemente buttare via quelle pagine perché le ha già scritte per scambiare. Questo dà al sistema il meglio di entrambi i mondi. I dati sono ancora conservati in memoria, quindi è possibile accedervi senza doverli leggere dal disco. Ma se il sistema ha bisogno di quella memoria per un altro scopo, non dovrà prima scriverlo. Grande vittoria dappertutto.


In tal caso, puoi spiegare perché a volte lo spazio di scambio non viene affatto utilizzato. Mem: 49554484k totale, 4087592k usato, 45466892k libero, buffer buffer 349244k Scambio: 94204k totale, 0k usato, 94204k libero, 1113644k memorizzato nella cache
ananthan

4
@ananthan: potrebbero esserci molte ragioni. Il più probabile è che il sistema non sia mai stato sottoposto a nessuna pressione di memoria, anche a causa di scritture bufferizzate, quindi il codice di scambio opportunistico potrebbe non essere mai stato attivato. Potrebbe anche essere che qualcuno abbia ritenuto che un eventuale utilizzo dello swap fosse errato e che il sistema non fosse così ottimizzato per non scambiarlo opportunisticamente (riducendo lo swapiness ).
David Schwartz,

6

Questo può accadere se in passato in passato avevi bisogno di più memoria di quanta tu abbia RAM fisica nella macchina. In quel momento alcuni dati saranno stati scritti nello spazio di swap.

Quando la memoria successiva viene liberata, i dati di swap non vengono automaticamente riletti nella RAM: ciò accade solo quando i dati di swap sono effettivamente necessari per un processo. Questo è perfettamente normale.

Per quanto riguarda il tuo processo mysql: tutto dipende dal tipo di query che esegui. In teoria 2 query molto complesse potrebbero probabilmente essere sufficienti per ottenere un tale carico, indipendentemente dal numero di utenti. È possibile abilitare il registro delle query lente per ottenere maggiori informazioni su quali query richiedono un carico elevato.


No: l'utilizzo dello swap non è un segno elevato. Quando le pagine scambiate vengono mappate indietro, le pagine del disco vengono contrassegnate come non in uso (ma possono ancora contenere dati).
symcbean,

Ho citato solo uno scenario in cui è possibile utilizzare l'utilizzo di swap, ma questo in effetti non è sempre sintomatico di non avere abbastanza memoria fisica - come spiegato anche da David Schwartz sopra
brain99

3

Puoi anche modificare questo comportamento di sysctl -w vm.swappiness=10, il che ridurrà notevolmente l'uso dello swap fino a quando non sarà effettivamente necessario.

Per quanto riguarda MySQL, hai almeno eseguito un test di configurazione di base utilizzando lo script tuning-primer.sh ?


1
Ciò aumenterà la tendenza alla rigenerazione di cache / buffer. Sfortunatamente dalla domanda originale non è chiaro se la cifra del 29,53% includa buffer / cache; in caso contrario, apportare le modifiche suggerite avrà un impatto negativo sulle prestazioni. Se questo dbms utilizza ampiamente innodb, probabilmente è stato configurato in modo errato (anche se una singola scatola da 8 core da 16 gb da utilizzare come server
Web

perché dici una cattiva scelta per il web server? non uso molto innodb preferisco ancora myisam perché le mie letture sono del 70% e scrive solo il 30% ....
user1179459

1

Questo è probabilmente, come ha spiegato David, un comportamento normale del kernel Linux, ma può anche essere un'occorrenza del problema di "follia di scambio" di MySQL . Nel tuo caso (8 CPU, 16 GB RAM totali, 5 GB utilizzati), affinché ciò accada, il tuo computer dovrebbe essere un sistema NUMA con 4 nodi (socket) e 4 GB di RAM per nodo e un pool buffer MySQL InnoDB di 4 GB.

In breve (dovresti leggere il link sopra per i dettagli completi), ecco cosa succede:

  1. All'avvio del sistema, i processi vengono distribuiti su tutti i nodi NUMA utilizzando parte della loro memoria.
  2. All'avvio di MySQL, alloca 4 GB per il pool di buffer InnoDB, riempiendo la RAM di un nodo NUMA e usando un po 'di RAM su altri nodi.
  3. Quindi, il kernel Linux, che non può spostare la RAM allocata da un nodo NUMA a un altro, pensa che sia una buona idea scambiare pagine dal nodo affamato (o è necessario scambiare pagine perché le pagine devono essere scambiate).

Per evitarlo, modifica l'allocazione di memoria per MySQL per allocare la RAM su tutti i core (vedi il link sopra per maggiori dettagli).

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.