8.3. Panoramica sulla ricezione dei pacchetti
Per analizzare nel modo migliore le problematiche relative alle prestazioni della rete, è necessario comprendere il funzionamendo della ricezione dei pacchetti. Il processo di ricezione è molto importante per l'ottimizzazione delle prestazioni di una rete, poichè spesso i frame vengono persi nel percorso di ricezione. Tale perdita può causare seri problemi di prestazione per una rete.
Figura 8.1. Diagramma del percorso di ricezione della rete
Il kernel di Linux riceve un frame ed esegue un processo di quattro fasi:
- Ricezione Hardware: il network interface card (NIC) riceve il frame sul cavo. In base alla configurazione del driver il NIC trasferisce il frame ad una memoria del buffer hardware interna o ad un buffer circolare specificato.
- Hard IRQ: il NIC indica la presenza di un frame della rete interrompendo la CPU. Questo processo causa la ricezione da parte dell'unità NIC di questa interruzione e programma a sua volta una operazione soft IRQ.
- Soft IRQ: questa fase implementa il processo vero e proprio di ricezione del frame, eseguendolo in un contesto
softirq
. Ciò sognifica che questa fase anticipa tutte le applicazioni in esecuzione sulla CPU specificata, permettendo di avere processi hard IRQIn questo contesto (esecuzione sulla stessa CPU come hard IRQ, minimizzando un sovraccarico di blocco), il kernel rimuove il frame dai NIC Hardware Buffer e lo processa attraverso lo stack di rete. Da qui il frame viene inoltrato, scartato o passato ad un socket in ascolto di destinazione.Se passato ad un socket, il frame viene associato ad una applicazione che detiene il socket stesso. Questo processo viene eseguito in modo interattivo fino a quando il NIC Hardware Buffer non possiede alcun frame, o fino al raggiungimento del device weight (dev_weight
). Per maggiori informazioni sul device weight consultare Sezione 8.4.1, «NIC Hardware Buffer» - Ricezione applicazione: l'applicazione riceve il frame e lo rimuove dalla coda di qualsiasi socket posseduto tramite le chiamate POSIX standard (
read
,recv
,recvfrom
). A questo punto i dati ricevuti tramite la rete non saranno più presenti nello stack.
Affinità CPU/cache
Per un output netto elevato sul percorso di ricezione è consigliato mantenere la cache L2 attiva. Come precedentemente indicato, i buffer di rete vengono ricevuti sulla stessa CPU dell'IRQ che ha indicato la loro presenza. Ciò significa che i dati del buffer saranno presenti sulla cache L2 della CPU di ricezione.
Per trarre vantaggio da questa impostazione, implementate una affinità del processo su applicazioni che dovranno ricevere la quantità maggiore di dati sul NIC che condivide lo stesso core della cache L2. Così facendo aumenterete le possibilità di una cache hit e quindi di migliorare sensibilmente le prestazioni.