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 |