Quanto SWAP daresti un'installazione CentOS su un XEON Quad Core doppio con 16 GB di RAM che eseguirà un sito Web PHP con un backend mysql - carico medio / pesante?
Quanto SWAP daresti un'installazione CentOS su un XEON Quad Core doppio con 16 GB di RAM che eseguirà un sito Web PHP con un backend mysql - carico medio / pesante?
Risposte:
Non più di un concerto o due: vuoi un po 'di scambio disponibile, nel caso in cui e perché aiuta le cose a funzionare un po' meglio, ma se mai arriverai al punto in cui stai scambiando pesantemente, la macchina sta andando per essere inutili - e in una situazione catastrofica reale, in realtà stai meglio con uno spazio di scambio più piccolo, perché poi attiverai l'assassino OOM prima piuttosto che dopo.
Mi scuso per la lunghissima risposta. Ho voglia di mettere questa roba da qualche parte accessibile per un po '!
TLDR; Teoricamente parlando, la risposta sarebbe "probabilmente non meno della quantità totale di memoria residente che tutte le tue applicazioni vogliono usare"
Proverò a spiegare se rimani con me ..
Un po 'di memoria virtuale
Penso che ci sia un malinteso comune in questi giorni su quale sia il valore dello swap e quale sia il suo scopo. Spesso si considera che lo scambio è inteso come un "banco di riserva" per la memoria quando la memoria si sta esaurendo. Sì, questo è in parte vero, ma il kernel non vuole usare lo swap come banca di riserva . Inoltre il kernel non vuole mai invocare il disco per ottenere i dati che cerchi!
Nello spazio delle applicazioni, ci sono una serie di cose che il kernel manterrà in memoria.
Ai fini della gestione della memoria, l'allocazione della memoria è supportata in un modo o nell'altro da un dispositivo di supporto.
La memoria supportata da file è la memoria che proviene da un file e su un O / S tipico costituisce la stragrande maggioranza dell'allocazione di memoria sul sistema. Include file come librerie condivise che sono state caricate, file letti dal disco e archiviati nella cache della pagina e file mmaped dal disco (in effetti, il kernel non fa distinzione tra pagine nella cache della pagina e file mmapped come essenzialmente la stessa cosa).
La cosa grandiosa di questa memoria dal punto di vista dei kernel è il suo usa e getta, cioè dovrebbe essere possibile scaricare queste pagine se hai bisogno di memoria per qualcos'altro e questo è esattamente ciò che fa la cache delle pagine se la memoria improvvisamente è un requisito.
La memoria anonima è una questione diversa. La memoria di questa regione è anonima perché, beh, non esiste alcun file sul disco che contenga effettivamente questi dati. Questo è normalmente costituito dallo stack di applicazioni, dall'heap, da qualsiasi cosa in tmpfs e mmapped data che è privato ed è stato modificato (dal momento che non è possibile sincronizzare queste cose sul disco). Poiché non esiste alcun file valido sul filesystem in cui riscrivere queste pagine se cambiano, la memoria con supporto anonimo è supportata dal supporto di scambio.
Ora, il kernel sa che quando la memoria è scarsa, è molto più economico abbandonare la memoria di backup dei file della memoria mappata in modo anonimo, questo perché i dati anonimi hanno una probabilità molto maggiore di essere "sporchi" rispetto ai dati di backup di file, in effetti di default il kernel valuta la memoria sostenuta in modo anonimo come 80 volte più preziosa della memoria di backup di file e questo è ciò che fa il modificatore di swappiness su linux (vedi questo post qui se vuoi sapere che cosa sta esattamente modificando il parametro swappiness).
Lo scenario peggiore
Lo scenario peggiore quando si tratta di un server che va fuori controllo e OOMing si basa sul fatto che passa troppo tempo a gestire le richieste I / O piuttosto che onorare le richieste di allocazione della memoria. Esistono due condizioni che possono invocare questo criterio.
Il primo è il problema comunemente pensato. Cioè, poiché gran parte della memoria vive all'interno dello swap, è necessario scambiare la memoria anonima dalla RAM, rimetterla in swap, quindi prendere qualcosa dallo swap e metterlo nella RAM reale. Questa operazione è molto costosa, rallentando la macchina fino al punto in cui può diventare una situazione irrecuperabile (poiché più cose sono in coda per le richieste di pagine di quelle che possono essere fornite dall'I / O).
Il secondo è meno considerato ma altrettanto importante. Se assegni quasi tutta la tua memoria a dati di applicazioni reali, non durerai a lungo. Quasi tutte le applicazioni si affidano alla lettura dei file dal filesystem per funzionare, ciò potrebbe essere dovuto al fatto che alcune istruzioni vivono in una libreria condivisa o perché è necessario leggere /etc/resolv.conf per una chiamata alla libreria o per qualsiasi altro scopo. È del tutto plausibile arrestare un sistema operativo, ma dispone di memoria sufficiente per adattarsi a tutte le applicazioni, ma dal momento che l'accodamento richiede così tanto I / O, nulla ha la possibilità di completarsi correttamente.
Cosa vuole fare il kernel con il tuo scambio
Il kernel vuole usare lo swap per sbarazzarsi di pagine che stanno sprecando memoria in modo da poter usare quella memoria per qualcos'altro.
Fondamentalmente, durante il normale funzionamento, il kernel ama riempire in modo aggressivo la cache della pagina con i dati letti dal disco, questo significa che non leggerà il disco per gli stessi dati. Questo è un buon design e può ridurre enormemente l'I / O. Ora, potrebbe darsi che tu abbia qualche applicazione in memoria che dorme per 3 giorni, si sveglia, fa un sacco di lavoro e poi dorme altri 3 giorni.
Quello che il kernel vorrebbe fare con questi dati è scambiarlo per fare spazio invece all'attività del filesystem, poiché hai una possibilità molto più alta di usare effettivamente queste pagine più spesso di quelle che usi per la tua applicazione. Lo scambio, in questo senso, potrebbe essere una transazione di 16kb sul supporto di scambio che difficilmente dovresti sentire, ma in cambio hai liberato 16kb di memoria che potrebbe essere utilizzata per archiviare quattro file di dati.
Per cosa il kernel non vuole usare swap
Il kernel sicuramente non vuole usare lo swap per allocare più memoria anonima scambiando altra memoria anonima, questa è la situazione di cui le persone si preoccupano di più e giustamente.
Tuttavia, dovrei sottolineare che se hai allocato così tanta memoria che il kernel non ha altra scelta che farlo, questo è un problema di configurazione degli amministratori di sistema, non del kernel stesso - sta solo cercando di fare il meglio dal opzioni che gli hai dato!
Se hai una quantità enorme di swap aumenti le possibilità di utilizzarlo?
No! Se hai 1G di RAM e 4G di swap, non c'è una probabilità dell'80% che i tuoi dati vengano scambiati! Il kernel vuole usare lo swap solo quando le pagine in memoria possono essere servite meglio facendo qualcos'altro!
È vantaggioso non utilizzare affatto lo swap
Non lo farei mai. Lo scambio consente all'O / S di liberarsi della memoria necessaria ma che non viene mai utilizzata. Se non hai swap, il tuo inghiottimento di memoria non ti farà mai tornare indietro, per il quale potresti vedere un significativo miglioramento delle prestazioni permettendo, diciamo, alla cache della pagina di averlo invece.
Qual è il miglior scambio da avere
Teoricamente parlando, scopri quanta memoria residente + 20% per le sicurezze come le chiamate in libreria rientranti che devono allocare memoria dall'heap - quindi imposta lo scambio su tale importo. Ciò (teoricamente comunque) consentirebbe al sistema operativo di scambiare tutta la memoria anonima se dovesse fare spazio a qualcosa di più utile.
Se avessi l'opportunità del kernel di scambiare tutto ciò che è pericoloso, giusto?
Ricorda, il kernel non vuole scambiarsi per fare spazio a un'allocazione di memoria più anonima qui, sostituirà sempre e solo le pagine non in uso per favorire qualcos'altro che farà invece un uso migliore dello spazio.
Se si scambia una memoria solo per allocare da più memoria anonima, si sta facendo qualcosa di sbagliato e occorre più RAM o risintonizzare lo stack dell'applicazione.
Di quanta RAM avresti bisogno
Ovviamente devi consentire abbastanza RAM per eseguire tutte le tue applicazioni, ma probabilmente dovresti consentire un ulteriore 2G di RAM per riempire pagecache - forse di più. La cache della pagina rende il computer molto più veloce e i dischi durano più a lungo. Se stai pensando di eseguire un server web, avere ancora di più per pagecache è una buona idea a causa della grande quantità di contenuto statico che puoi recuperare e riutilizzare da pagecache che verrebbe pubblicato (se il throughput del tuo server web è di 5 MB / s, non lo fai davvero dopo tutto, voglio recuperare quel contenuto da 5 MB / s generato dal tuo disco!).
Cosa fare se non ti fidi davvero che Linux cambi correttamente
Se sei davvero preoccupato, puoi allocare più memoria di quella che hai:
Qual è il modo migliore per ottimizzare la mia memoria per la mia applicazione
Il venditore consiglia una configurazione diversa.
Ascoltalo invece. Alcune applicazioni sono scritte in modo tale da invocare deliberatamente il kernel affinché le loro pagine siano attive su tutte le altre. Questo è un brutto trucco per essere onesti, ma rompe la capacità dei kernel di gestire senza problemi la memoria quando succede. Se il tuo fornitore ti fornisce dettagli specifici, probabilmente rientrano in questa categoria e ascoltano invece quello che dicono.
In sintesi
Il kernel di solito fa un ottimo lavoro nel gestire correttamente la memoria virtuale. È quasi sempre il caso in cui l'applicazione stia allocando più memoria di quanto si possa sperare di lavorare e questo è ciò che sta causando una OOM.
Lo swap era usato come "memoria di riserva", ma non è più il suo scopo principale, quindi non pensare di usarlo in quel modo. Invece, apprezza il fatto che il tuo kernel probabilmente sappia meglio per cosa vuole usare la tua memoria. Dagli spazio per prendere quelle decisioni e trarrai beneficio da un miglioramento complessivo delle prestazioni.
Dal documento "Oracle 10g Server su Red Hat® Enterprise Linux® 5 Suggerimenti per la distribuzione".
Oracle fornisce raccomandazioni generiche relative alle dimensioni dello swap nella nota MetaLink 169706.1. Queste raccomandazioni possono portare alla creazione di uno spazio di scambio molto ampio su sistemi con una grande quantità di memoria. Lo scambio molto ampio può causare un grave peggioramento delle prestazioni del sistema e può essere risolto riducendo lo spazio di scambio. Red Hat non consiglia di allocare più di 4 GB per lo scambio su Red Hat Enterprise Linux 5.
Quindi per 16 GB non dovresti avere più di 4 GB di swap.
PS. Vale anche la pena notare che invocato oom
è quasi sempre meglio del processo di scambio inutilizzabile che utilizza l'intera larghezza di banda I / O.
Gli attuali consigli di CentOS Swap utilizzano la formula:
M = Amount of RAM in GB, and S = Amount of swap in GB, then
If M < 2
S = M *2
Else
S = M + 2
Quindi, per 16G, la quantità di swap dovrebbe essere 18G.
Vedi http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-swapspace.html
Da quello che ricordo dalla documentazione di Linux: se il tuo ram è maggiore di 2 GB, allora fai swap = (ramSize + 2). Se è inferiore, fai swap = (ramSize * 2)
Ho trovato questo documento per te, dovrebbe aiutarti a prendere quella decisione, eccolo qui: che cos'è Swap Space? , ma nessuna delle risposte precedenti è corretta
dd if=/dev/zero of=swap.file bs=1024 count=1048576; mkswap swap.file; swapon swap.file