OVH Cloud OVH Cloud

kcore et RAM

9 réponses
Avatar
Remi Moyen
Salut,

Je viens de tomber sur une curiosité que je ne m'explique pas :

Je travaille sur une station qui a 2 Go de RAM. Aucn doute, tout est bien
reconnu et utilisé. Par exemple, 'top' me l'indique correctement. De toute
façon, vu les applications que je fais tourner et par comparaison avec
d'autres machines, j'ai bien mes 2 Go de RAM.

Là où ça devient amusant, c'est ici :
$ ls -lh /proc/kcore
-r-------- 1 root root 897M 2004-12-03 17:37 /proc/kcore

(même résultat que je sois root ou non, mais ça, c'est normal)

Tiens, seulement 900 Mo ?? J'ai l'habitude que kcore n'indique pas la
taille exacte de la RAM à 1 Mo près (sur mon portable avec 512 Mo de RAM,
je n'en ai que 510 dans kcore), mais là, se tromper du simple au double,
c'est quand même étonnant.
--
Rémi Moyen
"Malgré les apparences, le temps est très varié à Nancy :
pluie, nuages, neige, brouillard, grêle, ..."

9 réponses

Avatar
Nicolas George
Remi Moyen wrote in message
:
Tiens, seulement 900 Mo ?? J'ai l'habitude que kcore n'indique pas la
taille exacte de la RAM à 1 Mo près (sur mon portable avec 512 Mo de RAM,
je n'en ai que 510 dans kcore), mais là, se tromper du simple au double,
c'est quand même étonnant.


L'accès à la RAM au delà de 960 Mo se fait d'une manière différente de
l'accès habituel (ça demande une option particulière à la compilation ;
d'ailleurs, quand cette option est activée, l'accès habituel ne concerne
plus que 750 Mo).

Avatar
no_spam
On Fri, 03 Dec 2004 19:51:50 +0000, Nicolas George wrote:

Remi Moyen wrote in message
:
Tiens, seulement 900 Mo ?? J'ai l'habitude que kcore n'indique pas la
taille exacte de la RAM à 1 Mo près (sur mon portable avec 512 Mo de RAM,
je n'en ai que 510 dans kcore), mais là, se tromper du simple au double,
c'est quand même étonnant.


L'accès à la RAM au delà de 960 Mo se fait d'une manière différente de
l'accès habituel (ça demande une option particulière à la compilation ;
d'ailleurs, quand cette option est activée, l'accès habituel ne concerne
plus que 750 Mo).


C'est l'option HIGHMEM du kernel qu'il faut activer (c'est assez parlant...).
Attention, cette option touche tout le kernel, il faut donc réinstaller
le kernel et tous les modules.


Avatar
Remi Moyen
On Sat, 4 Dec 2004, no_spam wrote:

Tiens, seulement 900 Mo ?? J'ai l'habitude que kcore n'indique pas la
taille exacte de la RAM à 1 Mo près (sur mon portable avec 512 Mo de RAM,
je n'en ai que 510 dans kcore), mais là, se tromper du simple au double,
c'est quand même étonnant.


L'accès à la RAM au delà de 960 Mo se fait d'une manière différente de
l'accès habituel (ça demande une option particulière à la compilation ;
d'ailleurs, quand cette option est activée, l'accès habituel ne concerne
plus que 750 Mo).


C'est l'option HIGHMEM du kernel qu'il faut activer (c'est assez parlant...).
Attention, cette option touche tout le kernel, il faut donc réinstaller
le kernel et tous les modules.


Ben, euh... Je ne sais pas trop si elle y est où pas, cette option, vu que
j'utilise un noyau standard Debian, et pas un que j'ai recompilé moi-même
(et j'avoue ne jamais avoir eu l'idée d'aller fouiller les options...).

Ceci dit, si cette option n'était pas activée, d'après ce que je sais,
*aucun* programme ne devrait voir plus de 1 Go de RAM, non ? Donc, par
exemple, top ne devrait m'indiquer que 1 Go et pas 2, etc.

Parce que sinon, ça veut dire que HIGHMEM ne contrôle que la taille de
kcore et pas de la mémoire réellement accessible, ce qui serait un peu
naze :-)
--
Rémi Moyen
"Malgré les apparences, le temps est très varié à Nancy :
pluie, nuages, neige, brouillard, grêle, ..."



Avatar
Remi Moyen
On Sat, 4 Dec 2004, no_spam wrote:

Tiens, seulement 900 Mo ?? J'ai l'habitude que kcore n'indique pas
la taille exacte de la RAM à 1 Mo près (sur mon portable avec 512 Mo
de RAM, je n'en ai que 510 dans kcore), mais là, se tromper du
simple au double, c'est quand même étonnant.


L'accès à la RAM au delà de 960 Mo se fait d'une manière différente de
l'accès habituel (ça demande une option particulière à la
compilation ; d'ailleurs, quand cette option est activée, l'accès
habituel ne concerne plus que 750 Mo).


C'est l'option HIGHMEM du kernel qu'il faut activer (c'est assez
parlant...). Attention, cette option touche tout le kernel, il faut donc
réinstaller le kernel et tous les modules.


Ben, euh... Je ne sais pas trop si elle y est où pas, cette option, vu que
j'utilise un noyau standard Debian, et pas un que j'ai recompilé moi-même
(et j'avoue ne jamais avoir eu l'idée d'aller fouiller les options...).

Ceci dit, si cette option n'était pas activée, d'après ce que je sais,
*aucun* programme ne devrait voir plus de 1 Go de RAM, non ? Donc, par
exemple, top ne devrait m'indiquer que 1 Go et pas 2, etc.

Parce que sinon, ça veut dire que HIGHMEM ne contrôle que la taille de
kcore et pas de la mémoire réellement accessible, ce qui serait un peu
naze :-)

Et puis d'ailleurs, je viens de vérifier (d'où le supersedes), et ces
options sont, fort logiquement, activées :

$ grep HIGHMEM /boot/config-2.4.27-1-686-smp
# CONFIG_NOHIGHMEM is not set
CONFIG_HIGHMEM4G=y
# CONFIG_HIGHMEM64G is not set
CONFIG_HIGHMEM=y
# CONFIG_DEBUG_HIGHMEM is not set

Donc, ça ne vient pas de là.
--
Rémi Moyen
"Malgré les apparences, le temps est très varié à Nancy :
pluie, nuages, neige, brouillard, grêle, ..."



Avatar
Jerome Lambert
no_spam wrote:
On Fri, 03 Dec 2004 19:51:50 +0000, Nicolas George wrote:


Remi Moyen wrote in message
:

Tiens, seulement 900 Mo ?? J'ai l'habitude que kcore n'indique pas la
taille exacte de la RAM à 1 Mo près (sur mon portable avec 512 Mo de RAM,
je n'en ai que 510 dans kcore), mais là, se tromper du simple au double,
c'est quand même étonnant.


L'accès à la RAM au delà de 960 Mo se fait d'une manière différente de
l'accès habituel (ça demande une option particulière à la compilation ;
d'ailleurs, quand cette option est activée, l'accès habituel ne concerne
plus que 750 Mo).



C'est l'option HIGHMEM du kernel qu'il faut activer (c'est assez parlant...).
Attention, cette option touche tout le kernel, il faut donc réinstaller
le kernel et tous les modules.


<Infos>

C'est spécifique aux architectures "Intel 386 et +"? J'ai un Amd64 et
cette option n'apparait pas dans la configuration "générique" du noyau:

jerome $ grep HIGHMEM
/usr/share/genkernel/x86/kernel-config-2.6
CONFIG_NOHIGHMEM=y
# CONFIG_HIGHMEM4G is not set
# CONFIG_HIGHMEM64G is not set
jerome $ grep HIGHMEM
/usr/share/genkernel/x86_64/kernel-config-2.6
jerome $

</>



Avatar
Nicolas George
Jerome Lambert wrote in message :
C'est spécifique aux architectures "Intel 386 et +"?


Je dirais : aux architectures 32 bits. Ce qui est somme toutes assez
logique.

Avatar
Jerome Lambert
Nicolas George wrote:
Jerome Lambert wrote in message :

C'est spécifique aux architectures "Intel 386 et +"?



Je dirais : aux architectures 32 bits. Ce qui est somme toutes assez
logique.


Elles ne sont pas censées gérer 4Go sans problèmes?


Avatar
Nicolas George
Jerome Lambert wrote in message :
Elles ne sont pas censées gérer 4Go sans problèmes?


Et le noyau a besoin de maper plusieurs fois la mémoire.

Avatar
no_spam
On Sun, 05 Dec 2004 01:20:18 +0000, Nicolas George wrote:

Jerome Lambert wrote in message :
Elles ne sont pas censées gérer 4Go sans problèmes?


Et le noyau a besoin de maper plusieurs fois la mémoire.


C'est du au fait que le noyau utilise une astuce pour accéder plus vite
à la RAM physique. Le noyau est mappé à l'addresse 0xC0000000. Les
addresses virtuelles en dessous de 0xC0000000 sont utilisées par l'espace
user et celles au dessus par l'espace kernel. Ainsi, contrairement à
beaucoup d'autres OS, il n'a pas besoin de changer les mappings de la MMU
pour accéder à l'espace mémoire du process en cours lors d'un appel
système. Le kernel a donc 1 Go pour lui. Il se réserve une partie de
cet espace pour son code et ses données et utilise le reste de ce Go
pour mapper la RAM physique en RAM virtuelle. De cette façon, le noyau
peut accéder à l'intégralité de la RAM physique toujours sans
reprogrammer la MMU, ce qui accélère considérablement les accès. Par
contre, ça impose que la RAM physique visible soit inférieure à 1Go,
d'ou la limite de ~900 Mo de mémoire physique gérée par défaut sur les
noyaux 32 bits. L'option highmem permet de contourner ce problème en
mappant le surplus de RAM physique indirectement. L'accès à la RAM
physique au dessus de 900 Mo par le noyau est donc plus lent. Mais comme
il y a très peu d'accès à la RAM physique (généralement uniquement
pour les drivers), il suffit de faire en sorte que les drivers ne se
servent jamais de la HighMem pour parler aux périphériques et le tour
est joué.
Il existe un autre patch qui permet aux processes de mapper la
quasi intégralité des 4Go (en fait, 16 Mo sont réservés...) mais ce
patch à pour inconvénient de ralentir tous les appels systèmes.