Combien de fils d’ex´
ecution ?
St´
ephane Bortzmeyer
Premi`
ere r´
edaction de cet article le 4 septembre 2008
http://www.bortzmeyer.org/combien-de-fils.html
—————————-
Je viens de commencer un programme comportant plusieurs fils d’´
excution (”threads”). Lorsqu’on
d´
ecoupe un programme en fils, il y a une d´
ecision `
a prendre concernant le nombre de fils ; beaucoup de
fils permet un parall´
elisme maximal mais implique aussi un surtravail d ˆ
u`
a la communication avec ces
fils. Peu de fils fait que du travail peut rester bloqu´
e car le fil en est toujours au travail pr´
ec´
edent. La
valeur optimale d´
epend ´
evidemment du probl`
eme pr´
ecis.
Ici, il s’agissait d’un projet AFNIC d’interrogation des zones DNS sous .fr pour en d´
eduire des in-
formations, par exemple sur le niveau de d´
eploiement de IPv6 ou bien de DNSSEC (projet DNSwitness
<http://www.bortzmeyer.org/dnswitness-expose-ripe.html>). Les requˆ
etes DNS aux ser-
veurs de noms peuvent ˆ
etre tr`
es lentes, surtout si un ou plusieurs serveurs de la zone sont en panne,
et qu’on doit attendre l’expiration du d´
elai de garde. Avec un programme s´
equentiel, quelques pour-
cents de zones vraiment cass´
ees peuvent retarder consid´
erablement tout le programme. D’o`
u l’id´
ee de
parall`
eliser.
.fr compte actuellement environ 1 200 000 zones d´
el´
egu´
ees. Faut-il 1 200 000 fils d’ex´
ecution ? Ou
bien seulement 10 ? Ou entre les deux ? On peut toujours sp´
eculer a priori sur le chiffre id´
eal. Il d´
epend
de beaucoup de facteurs (mat´
eriel utilis´
e, efficacit´
e de l’ordonnanceur utilis´
e, ici celui de Python, nombre
de communications n´
ecessaires avec les fils, etc). Notons que, le programme ´
etant ´
ecrit en Python, o `
u
l’interpr´
eteur lui-mˆ
eme n’est pas parall`
ele, une machine multiprocesseur n’est pas forc´
ement utile.
Le mieux est de mesurer <http://www.bortzmeyer.org/mesurer-temps-execution.html>
plutˆ
ot que d’essayer d’imaginer. Je fais un programme qui lit le fichier de zone de .fr, je cr´
ee N tˆ
aches
Python et je confie `
a chacune 1 200 000 / N zones `
a interroger (chaque tˆ
ache doit ´
evidemment aussi
signaler `
a la tˆ
ache maˆ
ıtresse le r´
esultat de ses interrogations). L’interrogation se fait avec l’excellent
module DNS Python <http://www.bortzmeyer.org/dnspython.html>, en ne parlant pas direc-
tement aux serveurs de noms mais en ´
etant derri`
ere un r´
esolveur/cache Unbound (donc, attention, le
cache peut influencer les mesures, c’est pour cela qu’elles ont ´
et´
e faites deux fois).
Avec seulement cent tˆ
aches (N = 100), le programme ne peut faire qu’environ cent zones par seconde.
Je l’ai interrompu avant la fin. Avec 1000 tˆ
aches, on arrive `
a 480 zones par seconde. Et avec 10 000 tˆ
aches,
on atteint 550 zones par seconde.
1