Quanta RAM usa il kernel?


46

Questa domanda è motivata dal mio shock quando ho scoperto che il kernel di Mac OS X utilizza 750 MB di RAM .

Uso Linux da 20 anni e ho sempre "saputo" che l'utilizzo della RAM del kernel è ridotto da X (è vero? È mai stato vero?).

Quindi, dopo aver cercato su Google, ho provato slabtopche mi diceva:

Active / Total Size (% used)       : 68112.73K / 72009.73K (94.6%)

Questo significa che il mio kernel sta usando ~ 72 MB di RAM ora?

(Dato che topriporta Xorgl'RSS come 17M, il kernel ora sminuisce X, non viceversa).

Qual è il "normale" utilizzo della RAM del kernel (intervallo) per un laptop?

Perché MacOS utilizza un ordine di grandezza in più di RAM rispetto a Linux?

PS. Nessuna risposta qui rivolta all'ultima domanda, quindi per favore vedi le domande correlate:


Sulla mia macchina, riporta quasi 2 GB ... ma quando guardi i dettagli, è tutto correlato alla cache del filesystem.
derobert,

2
In effetti, se faccio un echo 3 > /proc/sys/vm/drop_caches, allora ho usato solo 80 MB.
derobert,

Secondo i commenti nel collegamento fornito, la memoria utilizzata dall'hardware grafico integrato è inclusa nella contabilità kernel_task.
Russell Borogove,

Risposte:


38

Kernel è un po 'improprio. Il kernel di Linux è composto da diversi processi / thread + i moduli ( lsmod), quindi per avere un quadro completo dovrai guardare l'intera sfera e non solo un singolo componente.

Per inciso i miei spettacoli slabtop:

 Active / Total Size (% used)       : 173428.30K / 204497.61K (84.8%)

La pagina man per slabtopaveva anche questo da dire:

L'intestazione statistica slabtop sta monitorando quanti byte di lastre vengono utilizzati e non è una misura della memoria fisica. Il campo 'Slab' nel file / proc / meminfo tiene traccia delle informazioni sulla memoria fisica del solaio utilizzata.

Eliminare le cache

Far cadere la mia cache come suggerito da @derobert nei commenti sotto la tua domanda fa quanto segue per me:

$ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
$

 Active / Total Size (% used)       : 61858.78K / 90524.77K (68.3%)

L'invio di un 3 procede come segue: pagecache, dentries e inode gratuiti. Ne discuterò di più in questo U&L Domande e risposte intitolato: Esistono modi o strumenti per scaricare la memoria cache e il buffer? ". Quindi 110 MB del mio spazio venivano utilizzati semplicemente mantenendo le informazioni riguardanti pagecache, dentries e inode.

Informazioni aggiuntive

Quindi quanta RAM sta usando il mio kernel?

Questa foto è un po 'più nebulosa per me, ma ecco le cose che "penso" sappiamo.

Lastra

Possiamo ottenere un'istantanea dell'uso della lastra usando questa tecnica. In sostanza possiamo estrarre queste informazioni /proc/meminfo.

$ grep Slab /proc/meminfo
Slab:             100728 kB

moduli

Inoltre possiamo ottenere un valore di dimensione per i moduli del kernel (non è chiaro se sia la loro dimensione dal disco o quando nella RAM) estraendo questi valori da /proc/modules:

$ awk '{print $1 " " $2 }' /proc/modules | head -5
cpufreq_powersave 1154
tcp_lp 2111
aesni_intel 12131
cryptd 7111
aes_x86_64 7758

slabinfo

Gran parte dei dettagli su SLAB sono accessibili in questa struttura di proc /proc/slabinfo:

$ less /proc/slabinfo | head -5
slabinfo - version: 2.1
# name            <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>
nf_conntrack_ffff8801f2b30000      0      0    320   25    2 : tunables    0    0    0 : slabdata      0      0      0
fuse_request         100    125    632   25    4 : tunables    0    0    0 : slabdata      5      5      0
fuse_inode            21     21    768   21    4 : tunables    0    0    0 : slabdata      1      1      0

dmesg

All'avvio del sistema è presente una riga che riporta l'utilizzo della memoria del kernel Linux subito dopo il suo caricamento.

$ dmesg |grep Memory:
[    0.000000] Memory: 7970012k/9371648k available (4557k kernel code, 1192276k absent, 209360k reserved, 7251k data, 948k init)

Riferimenti


1
C'è un modo per ottenere il quadro completo?
Gilles,

@Gilles - di quanti ricordi in uso, giusto? Mi sembra di ricordare una Q riguardo a quello prima, tu?
slm

@Gilles - credo che questo sia vicino a quello che stai chiedendo: grep Slab /proc/meminfo.
slm

@Gilles - c'è anche questo:, /proc/slabinfoche sembra essere la fonte per slabtop, quindi si potrebbero calcolare gli importi da qui per un conteggio totale più accurato.
slm

1
/proc/modulesè più probabile che la colonna 2 di venga caricata nella memoria del modulo poiché i moduli su disco sono normalmente compressi (ad es. su Fedora 27 è xz), ho controllato il tg3driver NIC, la dimensione del disco su (compresso o originale) non corrisponde alla dimensione in byte visualizzata in /proc/modules.
Terry Wang,

7

Cosa ne pensi di questo:

Active / Total Size (% used)       : 4709.24K / 5062.03K

È su una macchina appena avviata, molto piccola che gira senza testa con un kernel normale. Quindi non richiede molto.

Come suggerisce derobert, il kernel utilizzerà la memoria disponibile per la memorizzazione nella cache e questo è molto di ciò che vedi slabtop. Oltre alla cache dei file, ciò ha a che fare con la memoria condivisibile dai processi di userspace che non è più in uso. Il kernel lo lascia lì fino a quando non viene richiesto di nuovo lo stesso materiale, oppure qualcosa ha attivamente bisogno di RAM, nel qual caso viene dimenticato. Un'analogia sarebbe quella di prendere un libro da uno scaffale e metterlo aperto per leggerlo su un tavolo: quando hai finito di leggere, puoi lasciare il libro aperto sul tavolo nel caso in cui dovessi guardarlo di nuovo.


4

Su questo server RAM da 512 GB che esegue Solaris, il kernel utilizza 25 GB:

Page Summary                Pages                MB  %Tot
------------     ----------------  ----------------  ----
Kernel                    3210102             25078    5%
Anon                     15266226            119267   23%
Exec and libs               41457               323    0%
Page cache                3539331             27651    5%
Free (cachelist)         13799571            107809   21%
Free (freelist)          30093164            235102   46%

Total                    65949851            515233
Physical                 65927406            515057

Quella più piccola ha più della metà della sua RAM utilizzata dal kernel:

Page Summary                Pages                MB  %Tot
------------     ----------------  ----------------  ----
Kernel                    2149699             16794   52%
Anon                       517016              4039   13%
Exec and libs               15420               120    0%
Page cache                  21840               170    1%
Free (cachelist)             8768                68    0%
Free (freelist)           1404862             10975   34%

Total                     4117605             32168
Physical                  4096002             32000

Niente di cui preoccuparsi, la RAM non utilizzata viene comunque sprecata.


1
Descrivi come hai realizzato il tuo risultato.
Maus,

@Maus in esecuzione echo ::memstat | mdb -ksu alcuni server di produzione Solaris 10 precedenti all'aggiornamento 10/09.
jlliagre,
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.