Download - Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Transcript
Page 1: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Netzwerk-Programmiermodelle undI/O Optimierungen für Unix

Betriebssyteme

Hagen Paul Pfeifer • Florian [email protected] [email protected]

http://www.protocol-laboratories.net

14. Oktober 2006

Page 2: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Vortragsfahrplan1. Programmiermodelle

I Asynchrone I/O, fork(), threads, select(), poll()/dev/poll, epoll, kqueue, kevent

2. I/O OptimierungenI Zero-Copy, Read-Write, Mmap, Sendfile, Splice und Tee

3. Kernelspace OptimierungenI NAPI

I Dynamic Right Sizing

Hagen Paul Pfeifer • Florian Westphal Programmiermodelle - 2/42

Page 3: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Kapitel 1Programmiermodelle

Hagen Paul Pfeifer • Florian Westphal Programmiermodelle - 3/42

Page 4: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Server/Client ProgrammiermodelleI fork(): Ein Prozess pro Client. Vorteile:

• Einfache Programmierung (z.B.: Fehlerhandling mit_exit())

• Gesamt-System weniger Fehleranfällig

I Design ist von Nachteil, wenn:• . . . Prozesse untereinander kommunizieren müssen

• . . . viele Clients (> 1000) zu erwarten sind

I Overhead durch fork(),_exit(),waitpid()

I Performance sehr vom Scheduler abhängig (Linux 2.4:O(n), 2.6: O(1))

Hagen Paul Pfeifer • Florian Westphal Programmiermodelle - 4/42

Page 5: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Server/Client ProgrammiermodelleI Ein Thread pro Client. Vorteile:

• Threaderzeugung meist schneller als fork()(Linux 2.6:ca. 1

16CPUZyklen)

• Programmiermodell dem zu fork sehr ähnlich

I Nachteile:• Bei gemeinsam genutzten Daten ist Synchronisation

notwendig

I Performance von Scheduler und Thread-Modell (m : n, 1 : 1)abhängig

Hagen Paul Pfeifer • Florian Westphal Programmiermodelle - 5/42

Page 6: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Server/Client ProgrammiermodelleI Multiplexer: Ein Prozess/Thread für mehrere (oder alle)

Clients. Zwei Möglichkeiten:1. Level-Triggered: (”Readiness Notification”)

• fd wird gemeldet, sobald er bereit ist: select, poll,Async I/O, etc.

2. Edge-Triggered: (”Change Notification”)• fd wird nur gemeldet, wenn eine Zustandsänderung

eintrittz.B. Linux RT-Signals; Optional: epoll, kqueue,Async I/O

Hagen Paul Pfeifer • Florian Westphal Programmiermodelle - 6/42

Page 7: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Asynchrone I/OI Vorgehen:

• struct aiocb mit Deskriptor+buffer+Länge

• aio_read, aio_write etc. starten Schreib/Lesevorgang

• I/O läuft ”im Hintergrund” ab, Mitteilung wann beendetentweder mittels Signal oder Polling (aio_suspend)

Nachteil: Auch open() kann blockieren; aio_open nichtexistentAlternative: Worker Threads

Hagen Paul Pfeifer • Florian Westphal Programmiermodelle - 7/42

Page 8: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Multiplexing-Mechanismen: selectI ”Der Klassiker:” 4.2 BSD (1983)

int select(int nfds, fd_set *readfds, fd_set *writefds,

fd_set *exceptfds, struct timeval *timeout);

• Gewöhnungsbedürftiges API (nfds: Anzahl zuuntersuchender Bits)

• nur Deskriptoren kleiner FD_SETSIZE erlaubt

• manche Systeme (Linux) erfordern O_NONBLOCK für allefd

I Am weitesten Verbreitet (Sogar unter Winsock verfügbar. . . )

Hagen Paul Pfeifer • Florian Westphal Programmiermodelle - 8/42

Page 9: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Multiplexing-Mechanismen: pollI SVR3 (1986)

struct pollfd {

int fd;

short events;

short revents;

};

int poll(struct pollfd p[], nfds_t nfds, int timeout);

• manche Systeme (Linux) erfordern O_NONBLOCK für allefd

• Array bei vielen Veränderungen der Größe ungünstig

• pollfd[] muss bei jedem Syscall zweifach kopiertwerden

Hagen Paul Pfeifer • Florian Westphal Programmiermodelle - 9/42

Page 10: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

ProblemeI Probleme:

• ”Doppelte Arbeit”: Applikation und Kernel verwaltendieselben Informationen

• Lineare Suche im pollfds Array (poll)

• Man erhält stets auch alle ”ereignislosen” Deskriptoren

I Wünschenswert:• Man erhält nur noch Deskriptoren, die für die

gewünschte Operation zu Verfügung stehen

Hagen Paul Pfeifer • Florian Westphal Programmiermodelle - 10/42

Page 11: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

SunOS: /dev/pollI /dev/poll:

• setzt auf poll() auf, neue Gerätedatei /dev/poll

• Behandlung mit ”alten” Syscalls: open, read, write

I Vorgehen:• int fd = open("/dev/poll", O_RDWR);

• pollfd Struktur(en) initialisieren und nach fd schreiben

• via ioctl() auf Ereignisse warten

• Relevante pollfd Strukturen werden in UserspaceBuffer kopiert

Hagen Paul Pfeifer • Florian Westphal Programmiermodelle - 11/42

Page 12: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Linux 2.6: epollI Erster Patch: Linux 2.5.44 (2002)

I Neues API: 3 neue Syscalls

struct epoll_event{uint32_t events;

epoll_data_t data;}

I Level oder (optional) Edge Triggered

I letztes close() auf fd entfernt diesen Automatisch

Hagen Paul Pfeifer • Florian Westphal Programmiermodelle - 12/42

Page 13: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

epoll: VorgehenI int efd = epoll_create(hint);

I epoll_event initialisieren;z.B epoll_event e = { .events = EPOLLIN };

I hinzufügen: epoll_ctl(efd, EPOLL_CTL_ADD, fd, &e);

I Mit epoll_wait auf Ereignisse warten

I Edge-Triggered verhalten kann pro fd eingeschaltetwerden: e.events |= EPOLLET;

Hagen Paul Pfeifer • Florian Westphal Programmiermodelle - 13/42

Page 14: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

*BSD: kqueueI FreeBSD 4.1 (2000), OpenBSD 3.5 (2004), NetBSD 2.0

(Dez. 2004)

struct kevent {

uintptr_t ident; /* identifier for this event */

short filter; /* filter for event */

u_short flags; /* action flags for kqueue */

u_int fflags; /* filter flag value */

intptr_t data; /* filter data value */

void *udata; /* opaque user data identifier */

};

I 2 Syscalls, ein Makro

I Filterkonzept: u.a. für Timer und Signale

Hagen Paul Pfeifer • Florian Westphal Programmiermodelle - 14/42

Page 15: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

VorgehenI int kfd = kqueue()

I struct kevent initialisieren, z.B.EV_SET(&kev, fd, EV-FILT_READ,EV_ADD|EV_ENABLE, 0, 0, 0);

I kevent()aktualisiert fd set und/oder wartet auf Ereignisse

Hagen Paul Pfeifer • Florian Westphal Programmiermodelle - 15/42

Page 16: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

KeventI Linux hat kein einheitlichen Mechanismus auf Events zu

reagieren

I Ziel: möglichst viele Event so schnell wie möglich zubearbeiten mit wenig System-Overhead

I Probleme bei asynchronen I/O

I Evgeniy Polyakov Patch - kevent

I Kombination und Ideen aus AIO/kqueue Interface

I Ringpuffer welcher gemmap()ed wird

I kvent kann auf folgende Ereignisse reagieren:• Alles was poll() abdeckt KEVENT_POLL

• Neue Netzwerk-Daten oder VerbindungenKEVENT_SOCKET

Hagen Paul Pfeifer • Florian Westphal Programmiermodelle - 16/42

Page 17: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

• inotify() Ereignisse KEVENT_INODE

• Netzwerk asynchrone I/O Ereignisse KEVENT_NAIO

• Timer Ereignisse KEVENT_TIMER

I Erste Zahlen (httperf, 40K Verbindungen):• kevent: 3388.4 req/s

• epoll und kevent_poll 2200-2500 req/s

Hagen Paul Pfeifer • Florian Westphal Programmiermodelle - 17/42

Page 18: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

ZusammenfassungI Alternativen gegeneinander abwägen

• Protokoll, Zugriffsmuster

• Betriebssystem(e), Portabilität

I select: portabelste Schnittstelle, aber Problematisch beivielen Deskriptoren

I poll : Array; lineare Suche; Array muss verwaltet werden

I Alternativen sind Systemspezifisch (Wrapperbibliothekenwie libevent exisitieren)

I KISS – fork() kann Durchaus Mittel der Wahl sein!

Hagen Paul Pfeifer • Florian Westphal I/O Optimierungen - 18/42

Page 19: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Kapitel 2I/O Optimierungen

Hagen Paul Pfeifer • Florian Westphal I/O Optimierungen - 19/42

Page 20: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Zero-CopyI Typische Lehrbuch-Serveranwendung:

while((cnt = read(filefd, buf, buflen)) > 0) {

char *bufptr = buf;

do {

ssize_t written = write(socket, bufptr, cnt);

/* handle errors, if any ... */

cnt -= written;

bufptr += written;

} while (cnt > 0);

}

Hagen Paul Pfeifer • Florian Westphal I/O Optimierungen - 20/42

Page 21: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Zero-CopyI Positiv: einfach und portabel

I Negativ: nicht wirklich Performant1. Kopieraktion hohe Kosten

2. Syscalls verursachen weiteren Overhead

3. Kontext-Wechsel:• Register sichern

• Cache konsistent mit VM-Mappings, bei neuenVM-Mapping -> TLB flushen, (invXpg)

• Kein neues VM-Mapping: Kernel-Thread oderUS-Threads

• Einige Architekturen müssen auch Cache flushen(x86: NULL-Makro)

Hagen Paul Pfeifer • Florian Westphal I/O Optimierungen - 21/42

Page 22: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

• Cold Caches

4. Information Bonbon:(microseconds, lmbench, v2.6.10)

cpu clock speed context switch

pentium-M 1.8GHz 0.890

dual-Xeon 2GHz 7.430

Xscale 700MHz 108.2

dual 970FX 1.8GHz 5.850

ppc 7447 1GHz 1.720

Hagen Paul Pfeifer • Florian Westphal I/O Optimierungen - 22/42

Page 23: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Read() - Write()I Read-Write näher betrachtet:

I Speicher muss vier mal kopiert werden (nicht nötig)

I Vier Kontext-Switches

I Von Festplatte und nach NIC normalerweise via DMA

Hagen Paul Pfeifer • Florian Westphal I/O Optimierungen - 23/42

Page 24: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Mmap()I Mmap-Write näher betrachtet:

I Auch vier Kontext-Switches

I Aber: Kernelpuffer wird geteilt mit Userspace

I Zwei mal DMA Transfer, Ein mal CPU-Transfer

I Problem: anderer Prozeß stutzt Datei (SIGBUS,RT_SIGNAL_LEASE)

Hagen Paul Pfeifer • Florian Westphal I/O Optimierungen - 24/42

Page 25: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

SendfileI ssize_t sendfile(int out_fd, int in_fd, off_t *off-set, size_t count);

I Ein Kontextwechsel

I Zwei mal DMA Transfer, Ein mal CPU-Transfer

I Nicht portabel (Prototyp unterscheidet sich)

I Wenige Anwendungen nutzen sendfileHagen Paul Pfeifer • Florian Westphal I/O Optimierungen - 25/42

Page 26: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

(man munkelt Linux hat sendfile nur Aufgrund von Druckder Apache-Gemeinde ;-)

Hagen Paul Pfeifer • Florian Westphal I/O Optimierungen - 26/42

Page 27: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Sendfile (Scatter/Gather IO)I Wie vanilla sendfile, aber CPU-Kopie entfällt

I Kein kontinuirlicher Speicherbereich benötigt (Header,Payload)

I sk_buff enthählt Zeiger auf Datenbereich (FS-Cache)(Analogie: writev)

I dev->feature |= NETIF_F_SG (linux/netdevice.h)

I Vorteile:• komplette Kopiervorgang kann eingespart werden

• *-Cache wird nicht „verunreinigt“

I 3Com (3CR990 Family): 16 SG-Einträge

Hagen Paul Pfeifer • Florian Westphal I/O Optimierungen - 27/42

Page 28: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Sendfile unter Solaris/BSD/WindowsI Solaris

• sendfile() und sendfilev()

I Microsoft Windows• TransferFile()

Hagen Paul Pfeifer • Florian Westphal I/O Optimierungen - 28/42

Page 29: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Abstecher: madviseI int madvise(void *start, size_t length, int advi-ce);

I Gibt BS Tipp wie Speicherbereich gelesen/verwendet wird

I MADV_RANDOM, MADV_SEQUENTIAL, MADV_DONTNEED

I fadvise() Pendant für Dateien

I readahead()

Hagen Paul Pfeifer • Florian Westphal I/O Optimierungen - 29/42

Page 30: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Sendfile und TCP_CORKI Oft: generierter Header und Datei als Daten (HTTP)

I Zwei write() generieren zwei Pakete (oft)

setsockopt(fd, IPPROTO_TCP, TCP_CORK, &on, sizeof(on));

write(fd, http_header, strlen(header));

sendfile(fd, file_fd, &offset, nbytes);

setsockopt(sock, IPPROTO_TCP, TCP_CORK, &off, sizeof(off));

I TCP_CORK off: Flushed Puffer sofort

I BSD, OS X: TCP_NOPUSH

I Portabler: (und nur ein Systemaufruf)

struct iovec { void *iov_base;size_t iov_len; };

ssize_t writev(int fd, const struct iovec *vector,

int count);

Hagen Paul Pfeifer • Florian Westphal I/O Optimierungen - 30/42

Page 31: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Splice und TeeI Splice

• long splice(int, loff_t, int, loff_t, si-ze_t, unsigned int);

• Kernelspeicher im KS für US (Userpipe im KS)

• Userspace hat Kontrolle über diesem Bereich

• Bewegt Daten von/nach dem Puffer nach/vonDeskriptor

• Im-Kernel Ersatz für read/write zum Puffer

• Nur wenn keine Bearbeitung am Daten

• Steigerung der Datentransferrate um bis 70% und 50%CPU

• Asynchron: SIGIO via fcntl(2)Hagen Paul Pfeifer • Florian Westphal I/O Optimierungen - 31/42

Page 32: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

• Neu in 2.6.17-rc1

• Anwendungen:- Socket zu Socket (redirect)

- Datei nach Datei

I Tee• long tee(int, int, size_t, unsigned int);

• Kopiert Daten im KS-Puffer

• memcpy() von Kernelpuffer zu Kernelpuffer

• Anwendungen:- MPEG-Stream nach Datei und Socket

• tee(1) Pseudo-Implemntierung

while(1) {

tee(STDIN_FILENO, STDOUT_FILENO, ...);

Hagen Paul Pfeifer • Florian Westphal I/O Optimierungen - 32/42

Page 33: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

splice(STDIN_FILENO, filefd, ...)

}

Hagen Paul Pfeifer • Florian Westphal Kernelspace Optimierungen - 33/42

Page 34: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Kapitel 3Kernelspace Optimierungen

Hagen Paul Pfeifer • Florian Westphal Kernelspace Optimierungen - 34/42

Page 35: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

NAPII Ansatz um Netzwerkperformance Performance zu erhöhen

I Problem: Overhead bei Interrupts

I Ansatz:• Interrupt startet Verarbeitungsroutine

• Interrupts werden gesperrt (Softirq

• dev->poll() verarbeitet alle Pakete im Ring-Puffer

I Weniger Interrupts, weniger Unterbrechungen

I 1Gbit NIC: 12 µs

I Aber: moderne NIC’s Interrups Moderation

I Tipp: e1000 Implementierung

Hagen Paul Pfeifer • Florian Westphal Kernelspace Optimierungen - 35/42

Page 36: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Dynamic Right SizingI Empfangspuffer konservative Größe (Embedded Geräte)

I Anpassungen des Empfang- und Sendpuffer

I Problem bei LFN (Bandbreiten-Verzöerungs Produkt)

I Weg von manuellen anpassen der Puffer (setsockopt())

I Ziel:• Netzwerk-Pipe voll

• Möglichst wenig Kernelspeicher (Problem: 10kVerbindungen)

Hagen Paul Pfeifer • Florian Westphal Kernelspace Optimierungen - 36/42

Page 37: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Tunnig TippsI Für die Netzwerkhacker mit GE

ifconfig eth0 mtu 9000

sysctl -w net.ipv4.tcp_sack=0

sysctl -w net.ipv4.tcp_timestamps=0

sysctl -w net.core.rmem_max=524287

sysctl -w net.core.wmem_max=524287

sysctl -w net.core.optmem_max=524287

sysctl -w net.core.netdev_max_backlog=300000

sysctl -w net.ipv4.tcp_rmem="10000000 10000000 10000000"

sysctl -w net.ipv4.tcp_wmem="10000000 10000000 10000000"

sysctl -w net.ipv4.tcp_mem="10000000 10000000 10000000"

sysctl -w net.ipv4.tcp_tw_recycle=1

sysctl -w net.ipv4.tcp_tw_reuse=1

Hagen Paul Pfeifer • Florian Westphal Prolog - 37/42

Page 38: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Kapitel 4Prolog

Hagen Paul Pfeifer • Florian Westphal Prolog - 38/42

Page 39: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Optimierungs BaustellenI TCP Metrics (Linux)

I Plugable TCP Congestion Control

I TOE - TCP Offload Engine

I TCP Segmentation Offloading (TSO)

I Net Channels - Van Jacobson

I FireEngine (Solaris)

Hagen Paul Pfeifer • Florian Westphal Prolog - 39/42

Page 40: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

Weitererführende Links, QuellenI man select poll epoll kqueue ...

I Dan Kegels ”The C10K problem”http://www.kegel.com/c10k.html

I libevent, http://www.monkey.org/~provos/libevent/

I http://people.freebsd.org/~jlemon/papers/kqueue.pdf

I Stevens, Rago: ”Advanced Programming in the UnixEnvironment”

I Stevens: ”UNIX Network Programming, The SocketsNetworking”

I McKusick, Neville-Neil ”The Design and Implementation ofthe FreeBSD Operating System”

I Dynamic Right Sizing:Hagen Paul Pfeifer • Florian Westphal Prolog - 40/42

Page 41: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

http://woozle.org/~mfisk/papers/tcpwindow-lacsi.pdf

I INVLPG:http://www.cs.tut.fi/~siponen/upros/intel/instr/invlpg.html

Hagen Paul Pfeifer • Florian Westphal Prolog - 41/42

Page 42: Netzwerk-Programmiermodelle und I/O Optimierungen für …Vortragsfahrplan 1. Programmiermodelle I Asynchrone I/O, fork(), threads, select(), poll() /dev/poll, epoll, kqueue, kevent

FINI Danke für eure Aufmerksamkeit!

I Fragen – Anregungen – Bemerkungen?I EMail: [email protected]

• Key-ID: 0x98350C22

• Fingerprint: 490F 557B 6C48 6D7E 5706 2EA2 4A22 8D45 9835 0C22

I EMail: [email protected]• Key-ID: 0xF260502D

• Fingerprint: 1C81 1AD5 EA8F 3047 7555 E8EE 5E2F DA6C F260 502D

Hagen Paul Pfeifer • Florian Westphal Prolog - 42/42