Hauptseite » Status 418 » Wo liegen die Vorteile einer gepufferten Ausgabe?

Wo liegen die Vorteile einer gepufferten Ausgabe?

Man sollte eigentlich nach Möglichkeit alles puffern.

was passiert dabei?



Datei schreiben.

ungepuffert byteweise:

- Sektor(512Byte) in einen Puffer lesen(dieser Puffer ist immer für den Treiber da).
- das zu schreibende Byte ändern.
- den Puffer auf den Sektor schreiben.
das ganze erfolgt jetzt 512 mal, dabei kann es sogar passieren, daß in der Zwischenzeit ein anderes Programm von einer anderen Stelle der Platte liest, so daß deine 512 Schreibvorgänge im schlimmsten Fall 1024 mal den Arm der Festplatte bewegen müssen(das dauert).

gepuffert byteweise:

- Byte in einen Puffer schreiben(512 mal)
- wenn der Puffer voll ist, Sektor schreiben.

das ist genau eine Armbewegung und ein Schreibzugriff.
Wenn dein Puffer größer oder kleiner als ein Festplattensektor ist, kommen noch einige Lese/Schreibvorgänge dazu.(aber auf keinen Fall 512).

Wie ist das jetzt bei Netzwerkzugriffen?

ein Netzwerkpaket sieht vereinfacht so aus.

|-SYN-|--Kopf--|--Kopf--|--Daten --|-CRC-|

ungepuffert(Schlimmster Fall)

|-SYN-|--Kopf--|--Kopf--|-- 1 Byte --|-CRC-|

gepuffert (bester Fall)

|-SYN-|--Kopf--|--Kopf--|-- 1500 Byte --|-CRC-|

Jetzt muss man noch wissen, daß jedes Paket einzeln geroutet, und im schlimmsten Fall auch noch einzeln bestätigt, bzw. auf die Bestätigung gewartet werden muss.

Zusätzlich ist bei gepuffertem Betrieb noch die Anzahl der Systemaufrufe deutlich niedriger.

Allerdings hat man bei Pufferung ein Problem wenn bestimmte Daten zeitiger erscheinen sollen(und nicht erst mit einem Schlag). Dafür gibt es bei den meisten Systemen eine 'flush' - Routine, mit der der Puffer gezielt geleert(gesendet/geschrieben) werden kann.

Mit PHP kann man folgendes ausprobieren:


--- Variante1 ---

# Mit PHP eigener Pufferung
ob_start();# PHP eigene Pufferung einschalten
for($i=1;$i<100;$i++){
	print "a";
}
ob_flush();# flush siehe oben
for($i=1;$i<100;$i++){
	print "b";
}
ob_end_flush(); # flush und Pufferung abschalten

--- Variante2 ---

# ohne Pufferung
for($i=1;$i<100;$i++){
	print "a";
}

for($i=1;$i<100;$i++){
	print "b";
}

und die Zeiten messen.

Wenn die Möglichkeit besteht, dabei den Netzwerkverkehr mitzuschneiden, ist der Unterschied sehr schön zu beobachten.

TrackBack

TrackBack-URL zu diesem Eintrag: http://vsrv.de/mt-cgi/mt-tb.cgi/53

Kommentare

unter /proc/sys/net/core kann man für TCP Anwendungen sehr schön die Puffergrößen erhöhen. damit kann man einer etwas komplizierten php Anwendung noch zusätzlichen Schwung geben. (man muss jedoch die Gesamtheit beachten)
z.Bsp:
wmem_max=Schreibpuffer
rmem_max=lesepuffer
net/ipv4/tcp_rmem=siehe tcp_wmem
net/ipv4/tcp_wmem=schreibpuffer für TCP Anwendungen.
1. Wert minimal
2. initialer Wert
3, maximaler Wert
Berechnet wird das über das Bandwith-Delay Produkt.
Dann machen Puffer nochmehr Spass.

cya

Kommentar schreiben

(Ihr Kommentar wird zeitverzögert freigeschaltet. Danke für Ihre Geduld.)














Sitemap


no software patents


Home
ott meint:
unter /proc/sys/net/core kann man für TCP Anwendun...

Tu dich fei besinne
bleib immer emol stieh,
kimmst ah dorten hie
wu de hie willst.
Denn miet Eil un Hast
hat manicher in senn Labn
oft's Schennste verpasst.

Powered by
Movable Type 3.2