[gull] ralentissement
cedric briner
briner at infomaniak.ch
Wed Dec 20 16:19:31 CET 2006
>> je publie ici, les echanges avec Daniel Cordey, le dernier echange :
On Wednesday 20 December 2006 15:03, cedric briner wrote:
> qu'est-ce que le buffer-cache compare au cache
le mot 'cache' est ambigu mais souvent utilise pour parler du
buffer-cache. Le mot buffer-cache defini la quantite de memoire utilisee
par le kernel poyr bufferiser les acces disques.
> donc faible activite du HD
Oui, vraiment faible.
> il faut que j'en parle pour mieux comprendre:
>
> Voici une liste par ordre croissant des rapidites d'acces des e/s :
> - acces hd :simple ou swap (acces de la memoire mise sur le swap)
> - ram :
> - cache : la memoire la plus proche du cpu (carrement dans chipset du
> cpu)
EN gros, oui. Il faut rajouter le buffer cache se situant entre la
memoire et le hd. Les acces au BC sont comptabilises en tant 'sys' et
non 'user', car ils sont du ressort de la gestion interne au kernel.
EN plus, les CPU ont souvent 2 voir trois niveaux de cache. Chaque
niveau introduit une penalite pour acceder aux donnees dans la cache.
Par exemple, le niveau L1 (<64K) 1 cycle, le niveau L2 (<~512K) 3 cycles
et le niveau L3 (~>1 MB) 5 cycles. Un cache-miss peut representer 70 a
100 cycles CPU avant de recuperer les data dans la cache L1 !
> donc dans mon cas, l'application psfm.exe utilise bien plus de memoire
> que ce que le cache du CPU en comporte.
C'est evident. De plus, les ccaches sont souvent divisees en Data-cache
et Instruction-cache. Ce qui semble poser probleme dans ton cas et le
Data-cache.
> Et lorsque, l'ordonnanceur (scheduler) passe d'une application a
> l'autre, l'application lorsqu'elle se charge fait plein de miss-cache
> (comptabilise comme user-time :( ). Ce qui fait que l'ordonnanceur ne
> laisse pas assez de temps a l'application interactive pour sembler
> reagir rapidement.
Il y a de ca, mais c'est plus subtile. COntrairement au stack qui fait
(quasi) systematiquement le plain et le vide, la memoire cache du CPU
fonctionne a la demande. C'est a dire que beuacoup d'application
n'utilisent pas forcement beaucoup de data, mais plutot des
instructions. Ce qui fait que, dans ce cas, la contraibte est
principalement mise sur la partie instruction de la cache. Or le
remplissage de celle-ci suit un comportement asses sequentiel et
lineaaire, raison pour laquelle on n'a quasiment jamais de
cache-thrasing pour les instructions. Mais si un autre CPU de calcul est
actif, il va faire plein de cache-miss au debut, remplir presque toute
la cache et continuer a faire des demandes pour le reste de ses datas.
DOnc, ce genre de process vire des datas du cache et garanti d'essayer
de remplir la cache du CPU. ENsuite, un autre process arrive, a besoin
de data dans le cache, vire les lignes de cache existantes, mets les
siennes, etc. Le CPU passe donc son temps a faire du cache-miss et aller
chercher/ecrire des donnes dans la RAM. Sachant que l'on paie pres de
100 cycles pour ce genre d'operation, les performances chutet drastiquement.
Dans le cas de racing entre un processus intercatif X11 et un processus
de cacul, c'est assez inferal. Le processus de cacul a besoin de
beaucoup de data. Il va donc remplir la cache. Or, il se peut que la
"localite" des donnees ne soient pas bones. CAD que le programme accede
a une adresse N et dans ce ca les donnees N a N+16 (4,8,16, etc, ca
depend des architectures) sont loadees dans la cache. Si la donnee
suivant accedee par le programme est N+1000, alors nous aurons un
nouveau cache-miss et une requete pour charger N+1000 a N+1000+16; et
ainsi de suite. Or, dans ce cas, nous avons aun cache-miss pour chaque
acces a une donnee... c'est le cas d'une mauvais "lacalite". Dans n cas
favorable, le programme va acceder a N, puis N+1, N+2, N+3, etc. jusqu'a
N+17 qui vca engendrer un cache-miss. Mais... dans ce cas, on engendre
16 fois moins de cache-miss que dans le cas d'une mauvaise "localite".
Le delat de performance est a-peu-pres : (16 * 1 * 2 + 100) / (16 * 100
* 2)... On va 25 fois plus lentement que dans le cas d'une bonne
"localite" ou acces sequentiel.
Mais le probleme de la "bad locality" est pervers, car quand ce gener de
programme tourne avec un programme interacif, il a tendance a etre
lent... puis il passe la main a boit de ses 10 ms... au programme
interactif... qui perd du temps a recuperer ses donnees de la RAM...
pour faire un system call() (oui, les programme interractifs font
beaucoup de system call()...)... engendrant un context-switch.... Or
comme le programme interactif fait un I/O ou autre, il nest pas
elligible poyr tourner... donc, il repasse la main au programme de
calcul qui pourri la cache... interrupt du kernel a la fin de l'I/O,
repassage au programme interractif car il n'a pas epuise son temps CPU
(contrairement au programme de calcul)... qui doit de nouveau engendrer
de cache-miss, etc.
Ce probleme ne se voit quasi pas avec un programme de calcul qui ne
remplit pas la cache ou qui l'utilise de maniere 'sequentielle' (good
locality).
Un exemple tres simple pour demontrer les problemes de localty
engendrant un cache-thrasing (avec des grosses matrices, ca engendre du
swapping a mort qui divise les performances de 4 a 5 ordres de grandeurs
!!!).
Nomalement, un tableau, quelque soit sa deimension est un espace contigu
en memoire. Soit :
double array[100,100];
pour acceder a :
a[2,3]
l'instruction generee est (schematique) :
&(a) + 2 * 100 + 3
Or, si j'ecris :
for (i = 0; i < 100; i++)
for (j = 0; j < 100; j++)
a[i,j] = i * j;
C'est totalement oppose a :
for (i = 0; i < 100; i++)
for (j = 0; j < 100; j++)
a[j,i] = i * j;
La premiere boucle a un tres bon score 'locality' alors que la deuxieme
a le pire.
Capisco ?
> Donc dans mon cas le probleme vient du fait que les applications passent
> trop de temps a charger le cache sans laisser a l'une comme a l'autre le
> temps de s'etablir.
C'est ca...
> ok je garde ca comme info
>
>
> Est-ce que la solution qui peut etre envisagee est de reecrire le
> programme de calcul de fft de maniere a ce qu'elle travaille par partie
> et qu'elle n'utilise pas tout le cache et qu'elle en laisse pour les
> autres appli.
Oui, mais comme dit plus haut, peut-etre qu'il ne s'agit que d'un ordre
d'acces des elemensts des matrices. Regarde si la librairue mentionnee
ce matin (fftw3) ne resout pas le probleme.
> P.-S. Merci je viens d'apprendre un peu trop de chose selon moi
> P.-S2. Je te propose de poster ce que tu viens d'ecrire sur le gull, ce
> a quoi je repondrai par le meme mail
Tu peux le faitre a ma place... je dois faire un rush sur un truc qui me
prend a tronche depuis un moment... programme de simulation de positions
'shorts' (a decouvert) dans un portefeuille d'actions... On me met la
pression parceque ca tarde a venir :-)
A+
dc
--
Cedric BRINER
71 rue des Truffes |mel briner at infomaniak.ch
F-01710 Thoiry |tel::portable +41(0)78/665-9701
|tel::maison +33(0)450/41-1240
|tel::travail +41(0)22/379-2356
More information about the gull
mailing list