Product SiteDocumentation Site

3.7. memory

Il sottosistema memory genera notifiche automatiche sulle risorse di memoria usate dai task in un cgroup, ed imposta i limiti sull'utilizzo di memoria da parte dei task:
memory.stat
notifica una vasta gamma di statistiche sulla memoria, come descritto nella seguente tabella:
Tabella 3.1. Valori riportati da memory.stat
Statistica Descrizione
cache cache di pagina, incluso tmpfs (shmem), in byte
rss cache swap ed anonima, non include tmpfs (shmem), in byte
mapped_file dimensione dei file mappati sulla memoria, incluso tmpfs (shmem), in byte
pgpgin numero di pagine assegnate all'interno della memoria
pgpgout numero di pagine scartate dalla memoria
swap utilizzo dello swap in byte
active_anon cache anonima e swap in un elenco LRU (Least-Recently-Used) attivo, incluso tmpfs (shmem), in byte
inactive_anon cache swap ed anonima su un elenco LRU inattivo, incluso tmpfs (shmem), in byte
active_file memoria file-backed in un elenco LRU attivo, in byte
inactive_file memoria file-backed in un elenco LRU inattivo, in byte
unevictable memoria che non è possibile riottenere, in byte
hierarchical_memory_limit limite di memoria per la gerarchia che contiene il cgroup memory, in byte
hierarchical_memsw_limit limite di swap più memoria per la gerarchia che contiene il cgroup memory, in byte

Inoltre, ognuno di questi file, con l'esclusione di hierarchical_memory_limit e hierarchical_memsw_limit, presentano un equivalente prefissato con total_, che riporta non solo sul cgroup ma anche su tutti i suoi figli. Per esempio, swap riporta l'uso dello swap di un cgroup e total_swap riporta l'uso totale dello swap del cgroup e di tutti i gruppi figlio.
Durante l'interpretazione dei valori presenti in memory.stat, notare la relazione delle diverse statistiche:
  • active_anon + inactive_anon = memoria anonima + file cache per tmpfs + swap cache
    Quindi active_anon + inactive_anonrss, poichè rss non include tmpfs.
  • active_file + inactive_file = cache - dimensione di tmpfs
memory.usage_in_bytes
notifica l'utilizzo totale della memoria corrente da parte dei processi nel cgroup (in byte).
memory.memsw.usage_in_bytes
notifica la somma della memoria corrente più lo spazio di swap usato dai processi nel cgroup (in byte).
memory.max_usage_in_bytes
notifica la memoria massima usata dai processi nel cgroup (in byte).
memory.memsw.max_usage_in_bytes
notifica la massima quantità di spazio di memoria e di swap usati dai processi nel cgroup (in byte).
memory.limit_in_bytes
imposta la quantità massima di memoria dell'utente (incluso il file cache). Se nessuna unità è stata specificata il valore viene interpretato in byte. Tuttavia è possibile usare un suffisso per rappresentare unità più grandi — k o K per kilobyte, m o M per Megabyte, e g o G per Gigabyte.
Non è possibile utilizzare memory.limit_in_bytes per limitare il cgroup di root; è possibile solo applicare i valori ai gruppi ad un livello più basso della gerarchia.
Scrivere -1 su memory.limit_in_bytes per rimuovere qualsiasi limite esistente.
memory.memsw.limit_in_bytes
imposta la quantità massima per l'utilizzo di memoria e swap. Se non è stata specificata nessuna unità il valore viene interpretato in byte. Tuttavia è possibile usare un suffisso per rappresentare unità più grandi — k o K per kilobyte, m o M per Megabyte, e g o G per Gigabyte.
Non è possibile utilizzare memory.memsw.limit_in_bytes per limitare il cgroup di root; è possibile applicare i valori solo ai gruppi ad un livello più basso della gerarchia.
Scrivere -1 su memory.memsw.limit_in_bytes per rimuovere i limiti esistenti.

Impostare i parametri memory.memsw.limit_in_bytes e memory.limit_in_bytes

E' importante impostare il parametro memory.limit_in_bytes prima di impostare il parametro memory.memsw.limit_in_bytes; in caso contrario si ha un errore. Questo perché memory.memsw.limit_in_bytes è reso disponibile soltanto dopo che tutte le limitazioni di memoria (precedentemente impostata con memory.limit_in_bytes) sono esaurite.
Si consideri il seguente esempio: impostare memory.limit_in_bytes = 2G e memory.memsw.limit_in_bytes = 4G per un certo cgroup, consente ai processi in quel cgroup di allocare 2 GB di memoria, e una volta esaurita, di allocare altri 2 GB solo di swap; il parametro memory.memsw.limit_in_bytes rappresenta una somma di memoria e swap. I processi in un cgroup che non hanno impostato il parametro memory.memsw.limit_in_bytes, possono potenzialmente usare tutto lo swap disponibile (dopo aver esaurito la limitazione di memoria), e far scattare una situazione di Out of Memory causata dalla mancanza di swap.
L'ordine in cui sono impostati i parametri memory.limit_in_bytes e memory.memsw.limit_in_bytes nel file /etc/cgconfig.conf è quindi importante. Di seguito si riporta un esempio corretto di una tale configurazione:
memory {
    memory.limit_in_bytes = 1G;
    memory.memsw.limit_in_bytes = 1G;
}
memory.failcnt
notifica il numero di volte che il limite di memoria ha raggiunto il valore impostato in memory.limit_in_bytes.
memory.memsw.failcnt
notifica il numero di volte che il limite dello spazio di swap più memoria ha raggiunto il valore impostato in memory.memsw.limit_in_bytes.
memory.force_empty
impostato a 0, svuota la memoria di tutte le pagine usate dai task in questo cgroup. Questa interfaccia può essere usata solo quando il cgroup non ha task. Se la memoria non può essere liberata, ci si sposta in un cgroup genitore ove possibile. Usare il parametro memory.force_empty prima di rimuovere un cgroup, onde evitare di mandare fuori uso pagine di cache dal cgroup genitore.
memory.swappiness
stabilisce la tendenza del kernel ad intercambiare la memoria di processo usata dalle istanze in questo cgroup, invece di acquisire nuovamente le pagine dalla cache di pagina. Questa è la stessa tendenza, calcolata in modo simile, impostata in /proc/sys/vm/swappiness per l'intero sistema. Il valore predefinito è 60. I valori più bassi diminuiranno la tendenza del kernel ad intercambiare la memoria di processo, con valori maggiori di 60 aumenta la tendenza del kernel a intercambiare la memoria e con valori maggiori di 100 il kernel inizierà ad intercambiare le pagine che fanno parte dello spazio di indirizzo dei processi in questo cgroup.
Da notare che un valore 0 non impedisce l'interscambio della memoria di processo; l'interscambio si può verificare in presenza di una memoria di sistema non sufficiente, poiché la logica di gestione della memoria virtuale globale non legge il valore di cgroup. Per bloccare completamente le pagine usare mlock() al posto dei cgroup.
Non è possibile modificare swappiness nei seguenti gruppi:
  • il cgroup di root, il quale utilizza il set swappiness in /proc/sys/vm/swappiness.
  • un cgroup con gruppi figlio sottostanti.
memory.use_hierarchy
presenta un flag (0 o 1) che specifica se prendere in considerazione l'uso della memoria per tutta la gerarchia dei cgroup. Se abilitato (1), il sottosistema di memoria acquisisce nuovamente la memoria dai figli e dal processo che eccede il proprio limite. Per impostazione predefinita (0), il sottosistema non acquisisce la memoria dai processi figlio di un task.