dpdk presentation
BIN
doc/presentation-dpdk/dpdk.pdf
Normal file
401
doc/presentation-dpdk/dpdk.tex
Normal file
@ -0,0 +1,401 @@
|
||||
\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}
|
BIN
doc/presentation-dpdk/img/architecture.png
Normal file
After Width: | Height: | Size: 138 KiB |
BIN
doc/presentation-dpdk/img/dpdk_logo.png
Normal file
After Width: | Height: | Size: 120 KiB |
BIN
doc/presentation-dpdk/img/kernel_and_dpdk.png
Normal file
After Width: | Height: | Size: 43 KiB |
BIN
doc/presentation-dpdk/img/kernel_without_dpdk.png
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
doc/presentation-dpdk/img/mbuf1.png
Normal file
After Width: | Height: | Size: 81 KiB |
BIN
doc/presentation-dpdk/img/mbuf2.png
Normal file
After Width: | Height: | Size: 148 KiB |
BIN
doc/presentation-dpdk/img/mempool.png
Normal file
After Width: | Height: | Size: 686 KiB |
BIN
doc/presentation-dpdk/img/mempool2.png
Normal file
After Width: | Height: | Size: 133 KiB |
BIN
doc/presentation-dpdk/img/ring1.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
doc/presentation-dpdk/img/tu_ilmenau_logo.png
Normal file
After Width: | Height: | Size: 36 KiB |