402 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			402 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
| \documentclass{beamer}
 | |
| \usetheme{focus}
 | |
| % Add option [numbering=none] to disable the footer progress bar
 | |
| % Add option [numbering=fullbar] to show the footer progress bar as always full with a slide count
 | |
| % Uncomment to enable the ice-blue theme
 | |
| %\definecolor{main}{RGB}{92, 138, 168}
 | |
| %\definecolor{background}{RGB}{240, 247, 255}
 | |
| \usepackage{booktabs} % Required for better table rules
 | |
| \usepackage{enumerate}
 | |
| \usepackage{xcolor, listings}
 | |
| 
 | |
| \title{\includegraphics[scale=.45]{img/dpdk_logo.png}}
 | |
| %\subtitle{ein kurzer Überblick}
 | |
| \titlegraphic{\includegraphics[scale=.1]{img/tu_ilmenau_logo.png}}
 | |
| %\institute{Institute Name \\ Institute Address}
 | |
| \date{6.5.2021}
 | |
| 
 | |
| \begin{document}
 | |
| \begin{frame}
 | |
|     \maketitle % Automatically created using the information in the commands above
 | |
| \end{frame}
 | |
| 
 | |
| \begin{frame}{Überblick über DPDK}
 | |
|     \begin{itemize}
 | |
|         \item Sammlung von Bibliotheken
 | |
|         \item 2010 von Intel veröffentlicht
 | |
|         \item freie OpenSource Lizenz
 | |
|         \item unterstützt alle wichtigen CPU-Architekturen und NICs
 | |
|     \end{itemize}
 | |
|     \note{
 | |
|         NIC = Network Interface Card  á Netzwerkkarte
 | |
|     }
 | |
| \end{frame}
 | |
| 
 | |
| \begin{frame}{Grundlegendes Problem}
 | |
|     \begin{itemize}
 | |
|         \item viele Engpässe verhindern Verarbeitung von Paketen
 | |
|         \item Bottleneck im Linux Kernel selbst
 | |
|         \item[$\rightarrow$] Kernel-Bypass
 | |
|         \item[$\rightarrow$] Anwendungen kommunizieren direkt mit Netzwerkgeräten
 | |
|     \end{itemize}
 | |
| \end{frame}
 | |
| 
 | |
| \begin{frame}{Fahrplan für Heute}
 | |
|     \tableofcontents
 | |
| \end{frame}
 | |
| 
 | |
| %----------------------------------------------------------------------------------------
 | |
| %	 SECTION
 | |
| %----------------------------------------------------------------------------------------
 | |
| \section{DPDK vs. Kernel Processing}
 | |
| \begin{frame}{Linux Kernel ohne DPDK}
 | |
|     \begin{columns}
 | |
|         \column{0.4\textwidth}
 | |
|         \begin{figure}[h]
 | |
|             \centering
 | |
|             \includegraphics[width=\linewidth]{img/kernel_without_dpdk.png}
 | |
|         \end{figure}
 | |
|         \column{0.5\textwidth}
 | |
|         \begin{itemize}
 | |
|             \item Netzwerkkarte sendet Paket zu Warteschlange
 | |
|             \item per DMA in Hauptspeicher kopieren
 | |
|             \item Kernel weißt Puffer zu \alert{Interrupts!}
 | |
|             \item Paket aus Puffer in User Space übertragen
 | |
|         \end{itemize}
 | |
|     \end{columns}
 | |
|     \note{
 | |
|         - Empfängt eine Netzwerkkarte ein Paket sendet sie es an eine Empfangswarteschlange
 | |
|         - Von dort wird das Paket über DMA-Mechanismus (Direct Memory Access) in den Hauptspeicher kopiert.
 | |
|         - Danach wird das System über das neue Paket benachrichtigt und das Paket von Linux einem Puffer (sk\_buff) zugewiesen. Für jedes neue Paket wird im System ein oder mehrere Interrupts erzeugt.
 | |
|         - Das Paket muss dann noch in den User Space übetragen (kopiert) werden
 | |
|     }
 | |
| \end{frame}
 | |
| 
 | |
| \begin{frame}{Linux Kernel mit DPDK}
 | |
|     \begin{columns}
 | |
|         \column{0.4\textwidth}
 | |
|         \begin{figure}[h]
 | |
|             \centering
 | |
|             \includegraphics[width=\linewidth]{img/kernel_and_dpdk.png}
 | |
|         \end{figure}
 | |
|         \column{0.5\textwidth}
 | |
|         \begin{itemize}
 | |
|             \item Netzwerkports vom Kernel getrennt/ungebunden
 | |
|             \item Eingehende Pakete gehen in Ringpuffer
 | |
|             \item Wenn Puffer neue Paketdeskriptoren enthält, verweis auf die DPDK-Paketpuffer
 | |
|             \item Wenn Ringpuffer keine Pakete enthält, stelle Netzwerkgeräte in Warteschlange
 | |
|             \item erfordert Konfiguration von \alert{hugepages}
 | |
|         \end{itemize}
 | |
|     \end{columns}
 | |
|     \note{
 | |
|         - DPDK durch Treiber direkt mit Port gebunden
 | |
|         - Um die Bindung eines Geräts an einen Treiber aufzuheben, muss die Busnummer des Geräts in die unbind-Datei geschrieben werden. Um ein Gerät an einen anderen Treiber zu binden, muss die Busnummer in dessen Bind-Datei geschrieben werden.
 | |
|         - Ports von den Treibern vfio_pci, igb_uio oder uio_pci_generic verwaltet
 | |
|         - Treiber ermöglichen es, mit Geräten im User-Space zu interagieren
 | |
|         - Kommunikation über DPDK-Poll-Mode-Treiber (PMD); für alle unterstützten Netzwerkkarten und virtuellen Geräte möglich
 | |
|         1. Eingehende Pakete gehen in einen Ringpuffer. Die Anwendung prüft diesen Puffer periodisch auf neue Pakete.
 | |
|         2. Wenn der Puffer neue Paketdeskriptoren enthält, verweist die Anwendung mit Hilfe der Zeiger in den Paketdeskriptoren auf die DPDK-Paketpuffer im speziell zugewiesenen Speicherpool.
 | |
|         3. Wenn der Ringpuffer keine Pakete enthält, wird die Anwendung die Netzwerkgeräte unter dem DPDK in eine Warteschlange stellen und dann erneut auf den Ring verweisen.
 | |
|     }
 | |
| \end{frame}
 | |
| 
 | |
| %----------------------------------------------------------------------------------------
 | |
| %	 SECTION
 | |
| %----------------------------------------------------------------------------------------
 | |
| \section{DPDK Aufbau}
 | |
| \begin{frame}{DPDK-Core}
 | |
|     \centering\huge
 | |
|     \begin{tabular}{|c|}
 | |
|         \hline
 | |
|         EAL     \\\hline
 | |
|         MBUF    \\\hline
 | |
|         MEMPOOL \\\hline
 | |
|         RING    \\\hline
 | |
|         TIMER   \\\hline
 | |
|     \end{tabular}
 | |
| \end{frame}
 | |
| 
 | |
| \begin{frame}{Environment Abstraction Layer (EAL)}
 | |
|     \begin{itemize}
 | |
|         \item Satz von Programmierwerkzeugen
 | |
|         \item bindet Anwendungen an DPDK
 | |
|         \item alle Anwendungen müssen Header Dateien der EAL enthalten
 | |
|     \end{itemize}
 | |
| \end{frame}
 | |
| 
 | |
| \begin{frame}{Environment Abstraction Layer (EAL)}
 | |
|     die häufigsten/wichtigsten Header\footnote{\href{http://dpdk.org/doc/guides/prog_guide/env_abstraction_layer.html}{http://dpdk.org/doc/guides/prog\_guide/env\_abstraction\_layer.html}}:
 | |
|     \begin{description}
 | |
|         \item[rte\_lcore.h] verwaltet Prozessorkerne und Sockel
 | |
|         \item[rte\_memory.h] verwaltet Speicher
 | |
|         \item[rte\_pci.h] Schnittstelle für den Zugriff auf PCI-Adressraum
 | |
|         \item[rte\_debug.h] Trace- und Debug-Funktionen
 | |
|         \item[rte\_interrupts.h] verarbeitet Interrupts
 | |
|     \end{description}
 | |
| \end{frame}
 | |
| 
 | |
| %----------------------------------------------------------------------------------------
 | |
| %	 SECTION
 | |
| %----------------------------------------------------------------------------------------
 | |
| \section{Paketrepräsentation}
 | |
| \begin{frame}{Kurz und knapp}
 | |
|     \begin{itemize}
 | |
|         \item Nutzung von PMDs (Poll Mode Drivers)\footnote{\href{http://doc.dpdk.org/guides/prog_guide/poll_mode_drv.html}{http://doc.dpdk.org/guides/prog\_guide/poll\_mode\_drv.html}}
 | |
|         \item Pakete werden in Speicherblöcken untergebracht
 | |
|         \item diese Blöcke nennt man "Buffer" (konkret: Mbuf)\footnote{\href{http://doc.dpdk.org/guides/prog_guide/mbuf_lib.html}{http://doc.dpdk.org/guides/prog\_guide/mbuf\_lib.html}}
 | |
|               \begin{itemize}
 | |
|                   \item nicht zu verwechseln mit Ring Buffer!
 | |
|               \end{itemize}
 | |
|     \end{itemize}
 | |
|     \note{
 | |
|         * Wie kann man auf Paket vom Code zugreifen --> PMD (ganz grob)
 | |
|         * Wie wird Paket in Code repräsentiert? --> Buffer, ist ein Speicher
 | |
|         * Nun Mbuf, Mempool näher erklären
 | |
|     }
 | |
| \end{frame}
 | |
| 
 | |
| \begin{frame}{Mempool}
 | |
|     \includegraphics[width=\linewidth]{img/mempool.png}
 | |
|     \vspace*{\fill}
 | |
|     \href{https://en.wikipedia.org/wiki/Memory_pool}{https://en.wikipedia.org/wiki/Memory\_pool}\\
 | |
|     \href{http://doc.dpdk.org/guides/prog_guide/mempool_lib.html}{http://doc.dpdk.org/guides/prog\_guide/mempool\_lib.html}
 | |
|     \note{
 | |
|         * Bevor: brauchen Speicherplatz
 | |
|         * Möglichk. Allok.:
 | |
|         --> dynamisch (new, malloc)
 | |
|         --> fixed-sized, mempool genannt
 | |
|         * Memory pool alloc ist besser... (fragmentierung)
 | |
|         * dazu Mempool Library in dpdk.
 | |
|         * beinhaltet sog. Mempool allocator, also ein Ding was diese Mempool allokation durchführt
 | |
|         * Speicher müssen wir selbst holen, mithlife dieser Bibliothek
 | |
|         * für zB. Mbuf nutzen
 | |
|     }
 | |
| \end{frame}
 | |
| 
 | |
| \begin{frame}{Mempool: Ring}
 | |
|     \begin{itemize}
 | |
|         \item Mempool \textbf{nutzt} intern \textbf{rte\_ring} (Queue)
 | |
|               \begin{itemize}
 | |
|                   \item speichert dort Referenzen auf Speicherbereiche
 | |
|               \end{itemize}
 | |
|     \end{itemize}
 | |
| \end{frame}
 | |
| 
 | |
| \begin{frame}{Mempool: Local Cache}
 | |
|     \includegraphics[width=\linewidth]{img/mempool2.png}
 | |
|     \note{
 | |
|         * local cache für jeden CPU-Kern
 | |
|         * bulk requests
 | |
|         * weniger locks des hauptrings
 | |
|         * selbst konfigurieren: THIS INTERNAL CACHE CAN BE ENABLED ... AT CREATION OF POOL
 | |
|     }
 | |
| \end{frame}
 | |
| 
 | |
| \begin{frame}{Mbuf}
 | |
|     \includegraphics[width=\linewidth]{img/mbuf1.png}
 | |
|     \note{
 | |
|         * Adressraum (Buffer), der Metadaten und Paketdaten selbst enthält.
 | |
|         * Metadaten und Paketdaten in einem Buffer
 | |
|         * Für Buffer wird Datenstruktur mbuf verwendet.
 | |
|     }
 | |
| \end{frame}
 | |
| 
 | |
| \begin{frame}{Mbuf: Indirect buffer}
 | |
|     \includegraphics[width=\linewidth]{img/mbuf2.png}
 | |
|     \note{
 | |
|         * Für goße Pakete kann man mehrere Buffer aneinanderhängen
 | |
|         * normalerweise Buffer: Zwischenspeicher. Trifft hier ja auch zu, weil Pakete kurz gespeichert und dann weitergegeben werden
 | |
|     }
 | |
| \end{frame}
 | |
| 
 | |
| \begin{frame}{Verwalten von Warteschlangen}
 | |
|     \begin{itemize}
 | |
|         \item Queue durch Bibliothek \textbf{rte\_ring}\footnote{\href{https://doc.dpdk.org/guides-16.07/prog_guide/ring_lib.html}{https://doc.dpdk.org/guides-16.07/prog\_guide/ring\_lib.html}} implementiert
 | |
|         \item aus FreeBSD Ringpuffer\footnote{\href{https://svnweb.freebsd.org/base/release/8.0.0/sys/sys/buf_ring.h}{https://svnweb.freebsd.org/base/release/8.0.0/sys/sys/buf\_ring.h}} entwickelt
 | |
|         \item sperrfreier Ringpuffer nach FIFO-Prinzip
 | |
|         \item Zeiger mit vier Kategorien
 | |
|               \begin{itemize}
 | |
|                   \item prod\_tail
 | |
|                   \item prod\_head
 | |
|                   \item cons\_tail
 | |
|                   \item cons\_head
 | |
|               \end{itemize}
 | |
|     \end{itemize}
 | |
|     \note{
 | |
|         - Ringpuffer ist eine Tabelle mit Zeigern für Objekte, die im Speicher abgelegt werden können
 | |
|         - Prods ist Abkürzung für Producer, cons für Consumer
 | |
|         - Producer ist Prozess, der zu bestimmten Zeitpunkt Daten in den Puffer schreibt
 | |
|         - Consumer ist Prozess, der Daten aus dem Puffer entfernt
 | |
|         - Tail ist der Ort, an dem Schreiben auf den Ringpuffer stattfindet
 | |
|         - Kopf ist der Ort, von dem der Puffer gelesen wird
 | |
|     }
 | |
| \end{frame}
 | |
| 
 | |
| \begin{frame}{Verwalten von Warteschlangen}
 | |
|     \begin{columns}[T, onlytextwidth]
 | |
|         \column{0.5\textwidth}
 | |
|         Vorteile
 | |
|         \begin{itemize}
 | |
|             \item Daten extrem schnell in Puffer schreiben
 | |
|             \item viel seltener Cache-Misses
 | |
|         \end{itemize}
 | |
|         \column{0.5\textwidth}
 | |
|         Nachteil
 | |
|         \begin{itemize}
 | |
|             \item feste unveränderliche Größe
 | |
|             \item höherer Speicherverbrauch
 | |
|         \end{itemize}
 | |
|     \end{columns}
 | |
|     \note{
 | |
|         Vorteile:
 | |
|         - viel seltener Cache-Misses, da Zeiger in einer Tabelle gespeichert werden
 | |
|         Nachteile:
 | |
|         - feste unveränderliche Größe, die nicht im laufenden Betrieb erhöht werden kann
 | |
|         - bei der Arbeit mit der Ringstruktur viel mehr Speicher verbraucht als bei einer verknüpften Warteschlange, da der Puffer immer die maximale Anzahl von Zeigern verwendet
 | |
|     }
 | |
| \end{frame}
 | |
| 
 | |
| \begin{frame}{Revision: Pakete verarbeiten}
 | |
|     Programmierer sorgt dafür, dass:
 | |
|     \begin{enumerate}
 | |
|         \item alles richtig \textbf{konfiguriert} ist
 | |
|         \item \textbf{PMD} die Pakete holt
 | |
|         \item Speicher vom \textbf{Mempool} geholt wird
 | |
|         \item Mithilfe des Mempool ein \textbf{Mbuf} erzeugt wird
 | |
|         \item in den Pakete reingesteckt werden
 | |
|     \end{enumerate}
 | |
|     \vspace{.5cm} Details stehen in der Dokumentation! \\
 | |
|     Es gibt viele verschiedene Wege, Beispielprogramme geben Orientierung.
 | |
|     \note{
 | |
|         * PMD holt Pakete
 | |
|         * Programmierer:
 | |
|         * holt Speicher vom Mempool
 | |
|         * intern stehen Speicheradressen in einem Ring
 | |
|         * erstellt mithilfe dessen einen Mbuf
 | |
|         * steckt Pakete in Mbuf hinein
 | |
|         * Mit Paketen arbeiten
 | |
|     }
 | |
| \end{frame}
 | |
| 
 | |
| \begin{frame}{Zusammenhang der Komponenten}
 | |
|     \centering
 | |
|     \includegraphics[width=.9\textheight]{img/architecture.png}
 | |
| \end{frame}
 | |
| 
 | |
| \begin{frame}{Was sind Hugepages?}
 | |
|     \begin{itemize}
 | |
|         \item Memory management unit (\textbf{MMU}):
 | |
|               \begin{itemize}
 | |
|                   \item Teil der CPU,
 | |
|                   \item realisiert Zuordnung VA \(\mapsto\) PA
 | |
|               \end{itemize}
 | |
|         \item Translation lookaside buffer (\textbf{TLB}):
 | |
|               \begin{itemize}
 | |
|                   \item Speichert oft genutzte Einträge
 | |
|                   \item schneller Zugriff auf Einträge
 | |
|                   \item bei vielen Einträgen ineffizient
 | |
|               \end{itemize}
 | |
|         \item größere Pages $\rightarrow$ weniger Einträge
 | |
|         \item[\(\rightarrow\)] Inhalt ändert sich weniger oft
 | |
|         \item[\(\Rightarrow\)] Zeiteffizienz erhöht!
 | |
|     \end{itemize}
 | |
|     \note{
 | |
|         - Memory management unit (MMU): Teil der CPU, realisiert Zuordnung VA -> PA (Vorstellen als große Tabelle)
 | |
|         - Translation lookaside buffer (TLB): Speichert oft genutzte Einträge dieser Tabelle (Cache)
 | |
|         - -> an diese Einträge kommt man schneller ran
 | |
|         - wenn viele Einträge benötigt werden, ändert sich Inhalt des TLBs ständig -> ineffizient
 | |
|         - Verringerung der Einträge durch vergrößern der Pages (Pages werden huge) -> Inhalt des TLBs ändert sich nicht mehr so oft
 | |
|         - Zeiteffizienz erhöht!
 | |
|     }
 | |
| \end{frame}
 | |
| 
 | |
| %----------------------------------------------------------------------------------------
 | |
| %	 SECTION
 | |
| %----------------------------------------------------------------------------------------
 | |
| \section{Empfang und Senden von Paketen}
 | |
| \begin{frame}{Vorbereitung}
 | |
|     \begin{enumerate}
 | |
|         \item runtime enviroment initialisieren
 | |
|         \item mempool anwenden
 | |
|         \item initialisiere NIC ports um tx/rx-Warteschlangen\footnote{\href{https://doc.dpdk.org/dts/test_plans/dynamic_queue_test_plan.html}{DPDK - Dynamic Queue Test}} zu erhalten und diesen Speicher zuweisen
 | |
|         \item Definieren von mbuf und Anfordern von Speicher aus dem mempool
 | |
|     \end{enumerate}
 | |
|     \note{
 | |
|         - wie zuvor beschrieben
 | |
|         - konfigurieren: CPU Core, Netzwerkgeräte
 | |
|         - falls Netzwerkgerät stoppt, stoppen alle Warteschlangen
 | |
|     }
 | |
| \end{frame}
 | |
| 
 | |
| \begin{frame}{Empfang Ablauf}
 | |
|     \begin{enumerate}
 | |
|         \item holt Paket vom NIC-Port zu mbuf
 | |
|         \item analysiere mbuf und hole Paket
 | |
|         \item Paket in Anwendung verwenden z.B. Inhalt des Paket drucken
 | |
|     \end{enumerate}
 | |
| \end{frame}
 | |
| 
 | |
| \begin{frame}{Senden Ablauf}
 | |
|     \begin{enumerate}
 | |
|         \item Paket in mbuf schreiben
 | |
|         \item bewege mbuf zu tx Warteschlange
 | |
|         \item Paket senden durch dpdk-api
 | |
|     \end{enumerate}
 | |
| \end{frame}
 | |
| 
 | |
| \begin{frame}{die wichtigsten Quellen}
 | |
|     \begin{itemize}
 | |
|         \item \href{http://doc.dpdk.org/guides/linux_gsg/}{DPDK Linux Guide} (Installation, Getting started)
 | |
|         \item \href{http://doc.dpdk.org/guides/prog_guide/}{DPDK Programmer Guide} (für ausführliche Erklärungen)
 | |
|               \begin{itemize}
 | |
|                   \item \href{http://doc.dpdk.org/guides/prog_guide/ring_lib.html}{Ring Library}
 | |
|                   \item \href{http://doc.dpdk.org/guides/prog_guide/mempool_lib.html}{Mempool Library}
 | |
|                   \item \href{http://doc.dpdk.org/guides/prog_guide/mbuf_lib.html}{Mbuf Library}
 | |
|                   \item \href{http://doc.dpdk.org/guides/prog_guide/poll_mode_drv.html}{Poll Mode Driver Library}
 | |
|                   \item ...
 | |
|               \end{itemize}
 | |
|         \item \href{http://doc.dpdk.org/api/}{DPDK API Documentation} (zum Programmieren)
 | |
|     \end{itemize}
 | |
| \end{frame}
 | |
| 
 | |
| %----------------------------------------------------------------------------------------
 | |
| %	 CLOSING/SUPPLEMENTARY SLIDES
 | |
| %----------------------------------------------------------------------------------------
 | |
| \begin{frame}[focus]
 | |
|     Vielen Dank fürs Zuhören
 | |
| \end{frame}
 | |
| \appendix
 | |
| \begin{frame}{Quellen}
 | |
|     \href{https://www.dpdk.org/}{DPDK.org}
 | |
| 
 | |
|     \href{https://github.com/DPDK/dpdk}{github.com/DPDK/dpdk}
 | |
| 
 | |
|     \href{https://blog.selectel.com/introduction-dpdk-architecture-principles/}{blog.selectel.com}
 | |
| 
 | |
|     \href{https://www.net.in.tum.de/fileadmin/TUM/NET/NET-2014-08-1/NET-2014-08-1_15.pdf}{net.in.tum.de}
 | |
| 
 | |
|     \href{https://www.privateinternetaccess.com/blog/2016/01/linux-networking-stack-from-the-ground-up-part-1}{privateinternetaccess.com}
 | |
| 
 | |
|     \href{http://www.slideshare.net/garyachy/dpdk-44585840}{slideshare.net}
 | |
| 
 | |
|     \href{http://www.it-sobytie.ru/system/attachments/files/000/001/102/original/LinuxPiter-DPDK-2015.pdf}{it-sobytie.ru}
 | |
| 
 | |
|     \href{https://github.com/AltraMayor/gatekeeper/wiki}{github.com/AltraMayor/gatekeeper}
 | |
| 
 | |
|     \href{https://svnweb.freebsd.org}{svnweb.freebsd.org}
 | |
| 
 | |
|     \href{https://pcapplusplus.github.io/}{pcapplusplus.github.io}
 | |
| 
 | |
|     \href{https://en.wikipedia.org/wiki/Memory_pool}{wikipedia.org/wiki/Memory\_pool}
 | |
| 
 | |
|     \nocite{*} % Display all references regardless of if they were cited
 | |
|     \bibliography{example.bib}
 | |
|     \bibliographystyle{plain}
 | |
| \end{frame}
 | |
| 
 | |
| \begin{frame}[focus]
 | |
|     Zeit für eure Fragen
 | |
| \end{frame}
 | |
| 
 | |
| \end{document}
 |