Re: [FRnOG] [TECH] lookup dans la FIB d'un routeur logiciel

2019-11-14 Par sujet Vincent
Le 13/11/2019 à 22:09, Jérôme Marteaux a écrit :
> Qu'en pensez-vous, est-ce que 24 Mo peut stocker 1 millions de route
> IPv4 (sous forme d'arbre, pas
> juste 1 000 000 x 4 octets !) avec les index des interfaces et les MAC
> des nexthop ?
> Quelle est la taille minimale nécessaire ?

4 octets pour deux index, ça fait 65536 nexthop différents.
Si tu prends 3 octets pour deux index, ça fait 1024 nexthop.
Et 2 : 256 nexthop.

Après un peer, ça ne peut être que 1 index qui contient l'interface et
la mac donc:
4 octets : 4G nexthop
3 : 16M nexthop
2 : 65536 nexthop
1 : 256 nexthop

Dans ce cas, 2 octets devrait couvrir les besoins de la majorité.

Au total, 2o * 1 000 000 + 65536 * ( 2o "interface", 6o "mac" ) = 2.5Mo
Si on rajoute des compteurs, 2*8 octets pour chaque nexthop + 8o autre
(32o au total) = 4Mo
Avec 256o par nexthop = 19Mo : il y a déjà de quoi faire.

Avec 3 octets : 137Mo
4 : 34Go
Dans les deux derniers cas, c'est la table des interfaces/mac qui
bouffe. Un hash passerait peut-être mieux


---
Liste de diffusion du FRnOG
http://www.frnog.org/


RE: [FRnOG] [TECH] lookup dans la FIB d'un routeur logiciel

2019-11-13 Par sujet Michel Py
> Benoît Ganne a écrit :
> Je n'ai jamais vu d'accès DDR en moins de 100 cycles CPU... Et encore ça 
> c'est quand ta DDR n'est pas trop
> chargée. Ca peut rapidement monter à plusieurs centaines de cycles dès que tu 
> commences à avoir du trafic.
> Un exemple mesuré sur les serveurs du lab CSIT :
> https://docs.fd.io/csit/master/report/vpp_performance_tests/test_environment.html#id5
> => on voit que la latence de la DDR va de ~80ns (~200 cycles @2.5GHz) en idle 
> à ~280ns (~700 cycles @2.5GHz) quand elle est chargée.

Ah la vache c'est bien pire que ce que je pensais, merci pour le lien.
Bah, encore une idée à jeter. J'ai appris quelque chose, merci.

Michel.


---
Liste de diffusion du FRnOG
http://www.frnog.org/


Re: [FRnOG] [TECH] lookup dans la FIB d'un routeur logiciel

2019-11-13 Par sujet Jérôme Marteaux


Le 13/11/2019 à 20:00, Michel Py a écrit :
>> Radu-Adrian Feurdean a écrit :
>> 3) la mise a jour : imagine deja la mise a jour d'un /16 (65K entrees a
>> mettre a jour), ou encore pire d'un /10 :)
> Certes, mais à comparer avec ce que çà fait gagner, 85 cycles d'horloge à 
> chaque paquet.
> Comparativement à plusieurs millions de paquets par seconde, la mise à jour 
> est très rare.
>
> En plus, la DDR c'est lent sur des accès individuels, mais pas pour les gros 
> blocks. DDR4 récente c'est au moins 40 GO par seconde en écriture.
> Un /10 avec 8 Octets par IP çà représente 32 MO de mémoire, moins de 1ms en 
> théorie. Il doit bien y avoir des instructions pour gérer çà en DMA ou autres 
> sans même avoir une boucle bourrin.
>
> Michel.
>
Je partage un graphique, ce sont des chiffres intéressants sur les
différentes grandeurs
qui ont cours aujourd'hui: http://i.imgur.com/k0t1e.png
(même la RAM coûte cher en perf, et c'est pas le média le plus lent !).

Ecrire dans la RAM va vite sur un bloc contigu de mémoire. Si ce n'est
pas contigu,
ça se transforme vite en des accès aléatoire (patricia est orienté
lecture plutôt
qu'être optimisé délai pour mettre à jour l'arbre).

L'autre problème qui me semble important c'est qu'il y a
plusieurs consommateurs (les core qui routent) et un core qui va
mettre à jour la RAM, il faut donc un système qui permet de verrouiller
la mémoire le temps de la mise à jour. Ces systèmes là sont lents.
Mais les routes ne sont pas les seuls éléments à stocker, il y a aussi
de la config, des compteurs, des interfaces, des adresses MAC,
des neighbors IPv6, des pointeurs... Si avant chaque accès il faut
demander l'usage exclusif de la ressource, les perfs s'écroulent.

Est-ce qu'il ne faudrait pas alors avoir n copie de la FIB (et de tous
les autres éléments)
avec n le nombre de core ? (et en archi NUMA).
Il me semble que c'est le principe de DPDK, affecter des core à une
fonction unique et précise.
Et qu'il soit capable de faire ce job le plus indépendamment possible,
en évitant de faire
du context switching.

Globalement il faut se passer un maximum de la RAM, utiliser un maximum
le cache (qui aujourd'hui est énorme, on peut en stocker des infos dans
24 Mo. Et même bientôt 128 Mo).

Qu'en pensez-vous, est-ce que 24 Mo peut stocker 1 millions de route
IPv4 (sous forme d'arbre, pas
juste 1 000 000 x 4 octets !) avec les index des interfaces et les MAC
des nexthop ?
Quelle est la taille minimale nécessaire ?

A cela il faut rajouter les problèmes de pipeline (mauvaises
prédictions) ... et c'est l'enfer.


Jérôme

-- 

Jérôme Marteaux


---
Liste de diffusion du FRnOG
http://www.frnog.org/


Re: [FRnOG] [TECH] lookup dans la FIB d'un routeur logiciel

2019-11-13 Par sujet Benoît Ganne
>>> Michel Py a écrit :
>>> Est-ce que çà ne vaudrait pas le coup de gaspiller 32GO de DDR4 pour 
>>> réduire ces 35ns 
>>> à 1 accès mémoire ?
>> 1) d'abord ça va te coûter plus que 32Go : il faut stocker les infos
>> nécessaires au routage : interface de sortie, etc. Ca prend plusieurs octets
> Combien ? avec 32 GO, j'avais prévu au pif 8 octets : 4 pour
> l'adresse de la passerelle, 2 pour l'interface de sortie, et 2 je
> sais pas trop pourquoi.
Je ne sais pas précisément, mais déjà tu vas sans doutes vouloir gérer
de l'ECMP maintenir des statistiques...

>> 2) avec un espace pareil, tous tes lookups vont misser en cache, tu va
>> partir en DDR à chaque fois. Avec un trie, on bénéficie du fait que
>> l'adressage réseau est hiérarchique pour pouvoir mieux cacher les entrées
> C'est pas évident, car çà dépend du nombre de flux actifs. C'est à
> prévoir, mais combien de ns çà prend un accès en DDR ? d'après ce que
> je comprends, c'est environ 10ns a CAS19, ce qui ferait quand même
> gagner 25ns par lookup.

Je n'ai jamais vu d'accès DDR en moins de 100 cycles CPU... Et encore ça
c'est quand ta DDR n'est pas trop chargée. Ca peut rapidement monter à
plusieurs centaines de cycles dès que tu commences à avoir du trafic.
Un exemple mesuré sur les serveurs du lab CSIT :
https://docs.fd.io/csit/master/report/vpp_performance_tests/test_environment.html#id5
=> on voit que la latence de la DDR va de ~80ns (~200 cycles @2.5GHz) en
idle à ~280ns (~700 cycles @2.5GHz) quand elle est chargée.

ben


---
Liste de diffusion du FRnOG
http://www.frnog.org/


RE: [FRnOG] [TECH] lookup dans la FIB d'un routeur logiciel

2019-11-13 Par sujet Michel Py
>> Michel Py a écrit :
>> Est-ce que çà ne vaudrait pas le coup de gaspiller 32GO de DDR4 pour réduire 
>> ces 35ns 
>> à 1 accès mémoire ? D'après ce que dit Ben le lookup çà serait a peu près la 
>> moitié
>> de la performance, donc on pourrait en théorie doubler la performance d'un 
>> routeur soft.

> Benoît Ganne a écrit :
> Je ne crois pas que ce soit aussi simple : le soucis avec du direct 
> addressing,
> c'est que : 1) d'abord ça va te coûter plus que 32Go : il faut stocker les 
> infos
> nécessaires au routage : interface de sortie, etc. Ca prend plusieurs octets

Combien ? avec 32 GO, j'avais prévu au pif 8 octets : 4 pour l'adresse de la 
passerelle, 2 pour l'interface de sortie, et 2 je sais pas trop pourquoi.

> 2) avec un espace pareil, tous tes lookups vont misser en cache, tu va
> partir en DDR à chaque fois. Avec un trie, on bénéficie du fait que
> l'adressage réseau est hiérarchique pour pouvoir mieux cacher les entrées

C'est pas évident, car çà dépend du nombre de flux actifs. C'est à prévoir, 
mais combien de ns çà prend un accès en DDR ? d'après ce que je comprends, 
c'est environ 10ns a CAS19, ce qui ferait quand même gagner 25ns par lookup.

C'est bourrin comme méthode, mais 25ns par paquet ce n'est pas rien.

Michel.


---
Liste de diffusion du FRnOG
http://www.frnog.org/


RE: [FRnOG] [TECH] lookup dans la FIB d'un routeur logiciel

2019-11-13 Par sujet Michel Py
> Radu-Adrian Feurdean a écrit :
> 3) la mise a jour : imagine deja la mise a jour d'un /16 (65K entrees a
> mettre a jour), ou encore pire d'un /10 :)

Certes, mais à comparer avec ce que çà fait gagner, 85 cycles d'horloge à 
chaque paquet.
Comparativement à plusieurs millions de paquets par seconde, la mise à jour est 
très rare.

En plus, la DDR c'est lent sur des accès individuels, mais pas pour les gros 
blocks. DDR4 récente c'est au moins 40 GO par seconde en écriture.
Un /10 avec 8 Octets par IP çà représente 32 MO de mémoire, moins de 1ms en 
théorie. Il doit bien y avoir des instructions pour gérer çà en DMA ou autres 
sans même avoir une boucle bourrin.

Michel.


---
Liste de diffusion du FRnOG
http://www.frnog.org/


Re: [FRnOG] [TECH] lookup dans la FIB d'un routeur logiciel

2019-11-13 Par sujet Radu-Adrian Feurdean
On Tue, Nov 12, 2019, at 20:08, Benoît Ganne wrote:
> Je ne crois pas que ce soit aussi simple : le soucis avec du direct
> addressing, c'est que :
>  1) d'abord ça va te coûter plus que 32Go : il faut stocker les infos
> nécessaires au routage : interface de sortie, etc. Ca prend plusieurs
> octets, donc on parle plutôt de 100Go-1To. Ca commence à piquer :)
>  2) avec un espace pareil, tous tes lookups vont misser en cache, tu va

3) la mise a jour : imagine deja la mise a jour d'un /16 (65K entrees a mettre 
a jour), ou encore pire d'un /10 :)


---
Liste de diffusion du FRnOG
http://www.frnog.org/


RE: [FRnOG] [TECH] lookup dans la FIB d'un routeur logiciel

2019-11-12 Par sujet Michel Py
>> Michel Py a écrit :
>> Est-ce que çà ne vaudrait pas le coup de gaspiller 32GO de DDR4 pour réduire 
>> ces 35ns 
>> à 1 accès mémoire ? D'après ce que dit Ben le lookup çà serait a peu près la 
>> moitié
>> de la performance, donc on pourrait en théorie doubler la performance d'un 
>> routeur soft.

> Benoît Ganne a écrit :
> Je ne crois pas que ce soit aussi simple : le soucis avec du direct 
> addressing,
> c'est que : 1) d'abord ça va te coûter plus que 32Go : il faut stocker les 
> infos
> nécessaires au routage : interface de sortie, etc. Ca prend plusieurs octets

Combien ? avec 32 GO, j'avais prévu au pif 8 octets : 4 pour l'adresse de la 
passerelle, 2 pour l'interface de sortie, et 2 je sais pas trop pourquoi.

> 2) avec un espace pareil, tous tes lookups vont misser en cache, tu va
> partir en DDR à chaque fois. Avec un trie, on bénéficie du fait que
> l'adressage réseau est hiérarchique pour pouvoir mieux cacher les entrées

C'est pas évident, car çà dépend du nombre de flux actifs. C'est à prévoir, 
mais combien de ns çà prend un accès en DDR ? d'après ce que je comprends, 
c'est environ 10ns a CAS19, ce qui ferait quand même gagner 25ns par lookup.

C'est bourrin comme méthode, mais 25ns par paquet ce n'est pas rien.

Michel.


---
Liste de diffusion du FRnOG
http://www.frnog.org/


Re: [FRnOG] [TECH] lookup dans la FIB d'un routeur logiciel

2019-11-12 Par sujet Benoît Ganne
> Est-ce que çà ne vaudrait pas le coup de gaspiller 32GO de DDR4 pour réduire 
> ces 35ns à 1 accès mémoire ?
> D'après ce que dit Ben le lookup çà serait a peu près la moitié de la 
> performance, donc on pourrait en théorie doubler la performance d'un routeur 
> soft.

Je ne crois pas que ce soit aussi simple : le soucis avec du direct
addressing, c'est que :
 1) d'abord ça va te coûter plus que 32Go : il faut stocker les infos
nécessaires au routage : interface de sortie, etc. Ca prend plusieurs
octets, donc on parle plutôt de 100Go-1To. Ca commence à piquer :)
 2) avec un espace pareil, tous tes lookups vont misser en cache, tu va
partir en DDR à chaque fois. Avec un trie, on bénéficie du fait que
l'adressage réseau est hiérarchique pour pouvoir mieux cacher les
entrées - je spécule un peu et je n'ai pas de de données pour comparer,
mais par exemple si tu as 2 /16 dans ta fib, en direct addressing ce
sera trop éloigné pour être caché, alors qu'avec un trie ils seront
typiquement sur la même cacheline

Et le lookup représente moins de 30% : il y a également la gestion de
l'ECMP et des stats dedans.

ben


---
Liste de diffusion du FRnOG
http://www.frnog.org/


RE: [FRnOG] [TECH] lookup dans la FIB d'un routeur logiciel

2019-11-11 Par sujet Michel Py
> Vincent Tondellier a écrit :
> https://vincent.bernat.ch/fr/blog/2017-progres-ipv4-table-routage-linux

Très intéressant, merci. Donc, environ 35ns.

Est-ce que çà ne vaudrait pas le coup de gaspiller 32GO de DDR4 pour réduire 
ces 35ns à 1 accès mémoire ?
D'après ce que dit Ben le lookup çà serait a peu près la moitié de la 
performance, donc on pourrait en théorie doubler la performance d'un routeur 
soft.

Michel.


---
Liste de diffusion du FRnOG
http://www.frnog.org/


Re: [FRnOG] [TECH] lookup dans la FIB d'un routeur logiciel

2019-11-11 Par sujet Vincent Tondellier
Le Monday 11 November 2019 21:42:08 Michel Py a écrit :
> Question pour Ben et ceux qui ont regardé le code d'un lookup de FIB :
> J'ai toujours imagine que la FIB était stockée dans une espèce d'arbre
> binaire ou une table de hashing. Est-ce que je me trompe ?

C'est un genre d'arbre : PATRICIA tree ou radix tree

Voir l'excellent article de Vincent Bernat pour l'implementation Linux :

https://vincent.bernat.ch/fr/blog/2017-ipv6-table-routage-linux

(et oui il y a aussi la version pour le protocole historique, le lien est dans 
l'intro)

Voir aussi ces articles qui sont dans le sujet du thread :

https://vincent.bernat.ch/fr/blog/2017-progres-ipv6-table-routage-linux
https://vincent.bernat.ch/fr/blog/2017-progres-ipv4-table-routage-linux




---
Liste de diffusion du FRnOG
http://www.frnog.org/


RE: [FRnOG] [TECH] lookup dans la FIB d'un routeur logiciel

2019-11-11 Par sujet Michel Py
Question pour Ben et ceux qui ont regardé le code d'un lookup de FIB :
J'ai toujours imagine que la FIB était stockée dans une espèce d'arbre binaire 
ou une table de hashing. Est-ce que je me trompe ?

Et maintenant question encore plus bête, pourquoi est-ce qu'il n'y a pas de 
lookup a plat ?
Une FIB avec 4 milliards d'entrées. Certes çà va bouffer 32 GO ou plus de 
mémoire, mais un lookup ne prendrait qu'un seul accès mémoire.

Michel.


---
Liste de diffusion du FRnOG
http://www.frnog.org/