- 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_anon
≠ rss
, 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.
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.