Citește mai atent, e vorba de
remote DMA.
DMA permite copierea de zone de memorie (memory to memory) fără intervenția CPU-ului. Ce înseamnă asta (din câte îmi aduc aminte):
Aplicația X1 de pe PC1 vrea să trimită un bloc de 8KB aplicației X2 de pe PC2. Ce se întâmplă, în mare:
- aplicația X1 are datele într-o zonă de memorie (a aplicației)
- aplicația apelează o funcție care zice kernel-ului: "trimite-mi blocul ăsta la X2"
- se copiază blocul din zona de memorie a aplicației în zona de memorie a kernel-ului (adică stă kernel-ul să copieze memorie)
- kernel-ul trimite NIC-ului comanda de transfer
- NIC-ul ia (prin DMA) datele din RAM și le trimite pe țeavă (împachetate, adresate, etc)
- pe PC2: NIC-ul ia de pe țeavă și trimite (prin DMA) în RAM (kernel)
- NIC-ul trimite kernel-ului un semnal că-s date de măcinat
- kernel-ul copiază datele din memoria kernel și le trimite aplicației
- aplicația X2 are, în sfârșit*, blocul de date
* în sfârșit = uzual când e nevoie de mai mult de-atât ai peste 10Gbit între PC-uri și începe să conteaze al naibii de mult latența.
Ideea
RDMA: hai să dăm acces direct NIC-ului la memoria aplicației, fără să mai trecem prin kernel memory. Același transfer de mai sus devine:
- aplicația X1 are datele într-o zonă de memorie M1 (a aplicației)
- aplicația apelează o funcție care zice kernel-ului: "trimite-mi blocul ăsta la X2"
- kernel-ul zice NIC-ului "ia din adresa M1
a aplicației X1 și trimite la adresa M2
a aplicației X2 de pe PC2"
- NIC-ul PC1 ia datele direct din RAM-ul aplicației și le trimite pe țeavă (împachetate, adresate diferit - ideea de port TCP nu prea mai are rost)
- NIC-ul PC2 ia datele de pe țeavă și le injectează direct în memoria aplicației X2
- NIC-ul anunță kernel-ul că s-au copiat datele
- kernel-ul anunță aplicația că are date noi în memorie
Ideea e excelentă, scapi de multe call-ul de CPU and stuff, și
mai ales de copieri prin CPU, care bușesc cache-ul (de când cu tone de core-uri per CPU s-a trecut la cache-uri cât mai mari, ca să aibă ce lucra core-urile, însă asta înseamnă și că un context switching "costă" mult, nu doar ciclii de CPU cât se execută copierea ci și faptul că s-a murdărit cache-ul cu prostii). În zona asta de aplicații întâlnești idei de tipul "hai să aliniem datele la adrese în memorie astfel încât să fie aduse toate într-un singur transfer".
Problema e că dai acces
remote și
direct la memorie, ceea ce înseamnă că ești aproximativ în fundu' gol, pentru că nu mai trec datele prin aceleași filtre ca înainte (ideea de antivirus sau stateful firewall nu mai există în acest mod).
LE: Cred că ideea de coșmar la configurare de care zice
Adi e reprezentată cel mai bine de figura 4 de
aici:
linia din stânga (sockets->TCP) e un transfer "normal", stack-ul din dreapta e o implementare RDMA
.