Perché un router hardware funziona meglio di un router Linux con specifiche migliori (RAM e CPU)?

Ho un minimo CentOS 6.3, 64 bit che agisce come gateway con 4 NIC (1 Gbps), ciascuno legato uno per il traffico pubblico e altri per privati, che esegue NATing. Ha 6 GB di RAM e 4 core logici. Lo abbiamo usato per due anni, senza problemi.

Non ho alcuna esperienza con i router hardware, ma ho sentito che hanno less RAM e CPU e usano dischi flash. Come può una cassetta con bassa configuration hardware eseguire meglio (come in, gestire più connessioni simultanee) di una macchina con più RAM e CPU?

Quali sono i fattori limitanti, diversi dai sisthemes IOS che utilizzano diversi methods per gestire questo problema?

  • Servizi DHCP di host sul server o sul firewall / router?
  • Flusso di pacchetti in networking
  • È ansible che un errore di configuration del router causa un guasto alla linea telefonica?
  • iptables intercettano il traffico locale
  • Indirizzo IP Alias
  • Come faccio a percorrere tutto il traffico dai client connessi al DD-WRT al tunn0 di tunnel OpenVPN?
  • Come configurare il router sotto l'altro per evitare problemi di NAT?
  • Generazione e cattura di Netflow su un router Linux
  • 6 Solutions collect form web for “Perché un router hardware funziona meglio di un router Linux con specifiche migliori (RAM e CPU)?”

    ASIC .

    Invece di utilizzare una CPU a scopo generale e un software specifico per le attività, è ansible saltare il software e fare solo il silicio gestire direttamente l'attività.

    L'hardware di networking ad alte performance utilizza ASIC invece di software per compiti computazionali pesanti (ma relativamente logicamente semplici) di qualcosa di simile a confrontare un indirizzo IP con un'enorme tabella di routing di Internet, controllare una tabella CAM per una decisione di commutazione o controllare un pacchetto contro un ACL . Ciò comport un'enorme differenza nella velocità di quelle operazioni sensibili al tempo, offrendo un notevole vantaggio rispetto a una CPU general purpose.

    Un router dedicato di fascia alta può sovraperformare un PC con una CPU più veloce e più RAM perché può fare di più il routing in hardware.

    È lo stesso motivo per cui un interruttore Gigabit Ethernet da 60 dollari può sovraperformare un PC di 2.000 dollari con 4 tabs GigE a due porte che agiscono come switch Ethernet. L'interruttore è costruito dal suolo fino ad essere un interruttore.

    "Altro che IOS"?

    IOS fa quasi tutta la differenza. CentOS è un sistema operativo generico. È progettato per eseguire abbastanza bene in una vasta gamma di scenari, utilizzando una vasta gamma di diverse configurazioni hardware. IOS, invece, è estremamente fine per gestire solo i tipi di carichi di lavoro che ci si aspetterebbe da un pezzo di apparecchiature di networking, utilizzando i tipi specifici di hardware che si troverebbero in Cisco.

    Sapere esattamente quali pezzi di hardware che stai programmando ti porterà un modo molto lungo in termini di performance rispetto alla compatibilità.

    Sia il software che l'hardware hanno qualcosa da dire. Ho il confronto tra Intel e TP-Link NIC (che utilizza un chip Realtek nel suo cuore) su hardware del server generico, nonché software di routing destinato a scopo e generico.

    Sul lato hardware, se l'ASIC a bordo può fare una gestione del traffico IP, il carico del processre può essere più basso e quindi più veloce. Ho notato i due chip INtel NIC a bordo che comunicano direttamente da DMA, escludendo la CPU principale nel gestire l'invio di pacchetti; nel frattempo il chip Realtek interrompe each volta che arriva un pacchetto.

    Sul lato software, se il software è stato progettato per essere utilizzato in routing, può essere reso più efficiente. Ho usato entrambi pfSense + PF (un FreeBSD modificato destinato ad essere utilizzato come router) e Ubuntu 12.04 + iptables generico come software di routing e il primo chiaramente commuta il traffico molto più velocemente. (Ubuntu 14.04 è ormai quasi così veloce, grazie ai nuovi nftables nel kernel Linux 3.13.)

    Tuttavia il router dedicato ha un grave inconveniente: non può eseguire molto altro che commutare il traffico e non può essere virtualizzato. Il mio router di bordo corrente è una macchina virtuale all'interno del mio cluster ESXi che esegue Ubuntu 14.04, e funge anche da sistema di rilevamento delle intrusioni e di bilanciamento del carico.

    AFAIK, è il sovraccarico di un sistema operativo general purpose; indipendentemente dal modo veloce delle connessioni, i pacchetti sono trattati in base a pacchetti-per-pacchetto all'interno del context del kernel, aumentando la latenza e il ceppo sul sistema. Credo che sia stato già spiegato nelle altre risposte meglio di quanto potessi fare.

    Detto questo, ci sono promettenti nuove tecnologie "ish" in aumento nella popolarità e nella fattibilità che potrebbero creare un concorrente più formidabile dai sisthemes Linux in questo e in altri aspetti; cioè InfiniBand

    Date un'occhiata al seguente Q & A su StackOverflow: Come è implementato il kernel-bypass TCP

    Ulteriori letture:

    • Un tutorial a CCGrid '11: Infiniband e 10 Gigabit Ethernet per i Dummies
    • InfiniBand e Linux in un articolo di LinuxJournal
    • Accesso a InfiniBand da Linux – Intel DeveloperZone
    • Progetto OpenSource di InfiniBand

    Di solito a causa della mancanza di configuration di stack / dispositivi di networking fuori-box in Linux. In quasi il 90% dei casi il traffico di networking viene elaborato dalla CPU0 mentre altri sono inattivi. Se risolverai questa differenza di problema con i router hardware non sarà così drastica come si potrebbe pensare. Dovresti impostare alless RSS o RPS (distribuzione del pacchetto basato su driver / stack tra le CPU).

    Se ti interessa veramente le performance del router di Linux e hai abbastanza tempo ti consiglio di leggere questo articolo nel blog di packagecloud (c'è anche articolo sulla trasmissione dei pacchetti).

    Se hai bisogno di dare un'occhiata alla distribuzione e pensi che guardi while sleep 1; do cat $some_file_in_procfs; done while sleep 1; do cat $some_file_in_procfs; done while sleep 1; do cat $some_file_in_procfs; done , la valutazione della maschera CPU e la scrittura manuale smp_affinity è noiosa, avresti probabilmente trovato il mio progetto pet- netutils-linux estremamente utile.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.