OVH Cloud OVH Cloud

Peut-on relancer kswapd ?

3 réponses
Avatar
Alexandre Vial
Bonsoir,

en faisant un petit top ce matin sur ma machine linux, j'ai trouvé ceci :
5 root 9 0 0 0 0 Z 0,0 0.0 0:01 kswapd <defunct>

Dans /var/log/kern.log, j'ai :

Jan 9 09:35:30 vial kernel: kernel BUG at dcache.c:345!
Jan 9 09:35:30 vial kernel: invalid operand: 0000
Jan 9 09:35:30 vial kernel: CPU: 0
Jan 9 09:35:30 vial kernel: EIP: 0010:[prune_dcache+93/328]
Tainted: P
Jan 9 09:35:30 vial kernel: EFLAGS: 00210202
Jan 9 09:35:30 vial kernel: eax: 00000004 ebx: d0088918 ecx:
d0088000 edx
: d0088998
Jan 9 09:35:30 vial kernel: esi: d0088900 edi: d6fba900 ebp:
00002efd esp
: c1595f34
Jan 9 09:35:30 vial kernel: ds: 0018 es: 0018 ss: 0018
Jan 9 09:35:30 vial kernel: Process kswapd (pid: 5, stackpage=c1595000)
Jan 9 09:35:30 vial kernel: Stack: 00000000 c14deae4 00000017 ffffffff
c013fb5b
000033e2 c012948a 00000006
Jan 9 09:35:30 vial kernel: 000001d0 00000020 000001d0 c024a87c
c024a87c
c1594000 000031aa 000001d0
Jan 9 09:35:30 vial kernel: c024a87c c01296e3 c1595fa8 0000003c
000001d0
00000020 c0129750 c1595fa8
Jan 9 09:35:30 vial kernel: Call Trace: [shrink_dcache_memory+27/52]
[shrink
_cache+654/864] [shrink_caches+47/60] [try_to_free_pages_zone+96/224]
[kswapd_ba
lance_pgdat+74/152]
Jan 9 09:35:31 vial kernel: [kswapd_balance+26/48] [kswapd+153/188]
[arch_ker
nel_thread+40/56]
Jan 9 09:35:31 vial kernel:
Jan 9 09:35:31 vial kernel: Code: 0f 0b 59 01 60 2d 21 c0 8d 46 10 8b
48 04 8b
53 f8 89 4a 04


Mon noyau est un 2.4.24 (sur Debian 3.0) , j'ai repris le .config de mon
noyau précédent 2.4.22 avec lequel je n'avais jamais observé de problème.
Je pensais que kswapd gérait le swap, or j'ai testé en allouant pas mal
de mémoire pour faire swapper, tout fonctionne encore normalement.
À quoi sert donc kswapd finalement, peut-on le relancer, ou vivre sans ?
Y a-t-il vraiment un bug dans le kernel ou est-ce un problème physique
(RAM ?)

Merci pour vos éclaircissement

Alexandre

3 réponses

Avatar
no_spam
On Fri, 09 Jan 2004 21:28:41 +0100, Alexandre Vial wrote:

Bonsoir,

en faisant un petit top ce matin sur ma machine linux, j'ai trouvé ceci :
5 root 9 0 0 0 0 Z 0,0 0.0 0:01 kswapd <defunct>

Dans /var/log/kern.log, j'ai :

Jan 9 09:35:30 vial kernel: kernel BUG at dcache.c:345!
Jan 9 09:35:30 vial kernel: invalid operand: 0000
Jan 9 09:35:30 vial kernel: CPU: 0
...


Mon noyau est un 2.4.24 (sur Debian 3.0) , j'ai repris le .config de mon
noyau précédent 2.4.22 avec lequel je n'avais jamais observé de problème.
Je pensais que kswapd gérait le swap, or j'ai testé en allouant pas mal
de mémoire pour faire swapper, tout fonctionne encore normalement.
À quoi sert donc kswapd finalement, peut-on le relancer, ou vivre sans ?
Y a-t-il vraiment un bug dans le kernel ou est-ce un problème physique
(RAM ?)

Oui, c'est un vrai bug kernel.

Tu ne peux pas le relancer, c'est un thread kernel.
Tu peux juste rebooter...
kswapd réorganise la mémoire en background, indépendement des demandes
de mémoire des process. Son but est plus d'optimiser la gestion
mémoire. Je ne suis même pas sur qu'il swappe des pages, en fait...
Quand tu réclames explicitement de la la mémoire, le kernel
honore toujours ta requête (sauf si tu remplit l'espace de mémoire
virtuelle disponible pour le process). A noter que la mémoire est
allouée physiquement lorsqu'on écrit dedans, et pas quand on la mappe.
A ce moment là, le kernel libère des pages de façon synchrone
et ne se sert donc pas d'un thread pour le faire.
Il me semble que kswapd n'est pas indispensable, mais un crash
d'un thread kernel pouvant (souvent) masquer un problème plus profond,
il est sage de rebooter tant que tu as la main...

Avatar
Erwann ABALEA
On Fri, 9 Jan 2004, no_spam wrote:

Quand tu réclames explicitement de la la mémoire, le kernel
honore toujours ta requête (sauf si tu remplit l'espace de mémoire
virtuelle disponible pour le process).


Extrait de mm/mmap.c d'un noyau 2.4.18:

-----
/* Check that a process has enough memory to allocate a
* new virtual mapping.
*/
int vm_enough_memory(long pages)
{
/* Stupid algorithm to decide if we have enough memory: while
* simple, it hopefully works in most obvious cases.. Easy to
* fool it, but this should catch most mistakes.
*/
/* 23/11/98 NJC: Somewhat less stupid version of algorithm,
* which tries to do "TheRightThing". Instead of using half of
* (buffers+cache), use the minimum values. Allow an extra 2%
* of num_physpages for safety margin.
*/

unsigned long free;

/* Sometimes we want to use more memory than we have. */
if (sysctl_overcommit_memory)
return 1;

/* The page cache contains buffer pages these days.. */
free = atomic_read(&page_cache_size);
free += nr_free_pages();
free += nr_swap_pages;
[...]
-----

Ce que tu décris n'est plus vrai à partir du noyau 2.4.0. On peut activer
l'overcommit_memory (ce qui ramène le fonctionnement que tu décris) en
écrivant une valeur différente de 0 dans /proc/sys/vm/overcommit_memory.
Il est possible que certaines distributions le font, ce n'est pas le cas
sur une Debian.

--
Erwann ABALEA - RSA PGP Key ID: 0x2D0EABD5
-----
D'accord, mais si on se met à utiliser des arguments intelligents dans
ce genre de débat, il devient impossible de discuter.
Vous sombrez dans la facilité.
-+- TS in GNU : La dialectique n'est plus ce qu'elle était.

Avatar
no_spam
On Sat, 10 Jan 2004 00:55:48 +0100, Erwann ABALEA wrote:

On Fri, 9 Jan 2004, no_spam wrote:

Quand tu réclames explicitement de la la mémoire, le kernel
honore toujours ta requête (sauf si tu remplit l'espace de mémoire
virtuelle disponible pour le process).


Extrait de mm/mmap.c d'un noyau 2.4.18:


...

Ce que tu décris n'est plus vrai à partir du noyau 2.4.0. On peut activer
l'overcommit_memory (ce qui ramène le fonctionnement que tu décris) en
écrivant une valeur différente de 0 dans /proc/sys/vm/overcommit_memory.
Il est possible que certaines distributions le font, ce n'est pas le cas
sur une Debian.


Effectivement, il vérifie que l'espace est disponible.J'en avait déduit
qu'il marchait toujours comme celà (sans regarder le code, j'avoue),
car, comme il prend en compte la taille ram libre + cache + swap
pour son calcul, je ne suis jamais arrivé en situation de le faire
échouer.
Merci pour l'info.