h1

./Geringer Schreibdurchsatz NAS mit Linux?

Mai 30, 2008

Vielleicht war es auch fahrlässig zu denken, dass man mit 1Gbit mehr Durchsatz bekommt als mit 100 Mbit FastEthernet. Eine klassische Situation:

2*100 Mbit (trunked) via NFSv3 … gemessener Durchsatz:

[root@sinux01 root]# hdparm -Tt /dev/sda
Timing buffered disk reads:   72 MB in  3.03 seconds =  23.76 MB/sec

Ein guter Wert, nahe der Bruttogrenze von FastEthernet.

1*Gbit via NFSv3 … gemessener Durchsatz:

[root@sinux01 root]# hdparm -Tt /dev/sda
Timing buffered disk reads:  100 MB in  3.00 seconds =  33.33 MB/sec

Auf den ersten Blick schön, jedoch fängt man dann doch zu rechnen an:

1000 Mbit / 8 = 125 MByte

Klar, dies ist ein reiner Bruttowert. In der Praxis unerreichbar. Abzüglich Physik, Collisions, IP, Protokolloverhead, Delay, Broadcasts usw. ist wahrscheinlich in einem gemischten Netzwerk mit eher 60 – 70 MB/s zu rechnen. Ich schaffe aber beim Schreibzugriff nur 33 MB.

Woran liegt das?

Nach vielen Versuchen mit alternativen Netzwerkkartentreibern, Switchwechsel, NAS-Update ohne spürbar höherem Durchsatz, gings auf Dateisystemebene…

Die NAS schreibt auf ihrem Filesystem mit 4K Blöcken, mein ext3 ebenfalls. Passt eigentlich hervorragend, ausser: Partial Writes

ClientFS: | 4K Block | 4K Block | 4K Block | 4k Block

BLANdKLAABServerFS: BLAN | 4K Block | 4K Block | 4K Block | 4k Block

Zu sehen sind die verschobenen Blöcke. Wird vom Client content von der NAS geholt, benötigt man zwei 4K Blöcke, um einen 4K Block auszulesen. => Bandbreite halbiert sich.

Ideal wäre:

ClientFS:  | 4K Block | 4K Block | 4K Block | 4k Block

ServerFS: | 4K Block | 4K Block | 4K Block | 4k Block

Einfluss auf die Synchronität der Blöcke zwischen den Filesystemen ist tatsächlich auf Blockebene zu suchen. Durch das Partitionieren + MBR + Bootloader usw. beginnen die Filesysteme in unterschiedlichen Bereichen. Einzusehen ist dies am Partition Offset.

fdisk /dev/sdx => x (für Expertenmenü) => x
Expert command (m for help): p
Disk /dev/sda: 255 heads, 63 sectors, 19452 cylinders
Nr AF  Hd Sec  Cyl  Hd Sec  Cyl     Start Size ID
1 80   1   1    0 254  63 1023         63 81915372 07
2 00 254  63 1023 254  63 1023  163846935 3903795 82
3 00   0   1 1023 254  63 1023   81915435 81931500 07
4 00 254  63 1023 254  63 1023  167750730 144745650 05
5 00 254  63 1023 254  63 1023         63 39070017 83
6 00 254  63 1023 254  63 1023         63 105675507 83

Die Spalte “Start” definiert die Blockanzahl.

Teilen wir diese durch die Blockgröße, sehen wir das diese nicht perfekt durch 4K teilbar ist.

Bei potenten NAS-System werden wir diese Differenz nicht spüren, da die Anbindung und das Cacheverhalten genau diese Asynchronitäten abdeckt. Bei Consumergeräten mit knapp kalkulierten CPUs bzw. Storagecontrollern merken wir dies leider direkt am am Durchsatz, sodass wir von Hand mögliche Partial Writes verhindern.

Benchmark mit angepasstem Offset:

[root@sinux01 root]# hdparm -Tt /dev/sda
/dev/sda:
Timing buffered disk reads:  200 MB in  3.01 seconds =  66.53 MB/sec

Fast der doppelte Durchsatz… dabei deutlich weniger CPU Belastung auf der NAS.

Viel Spass beim Tunen ;)

Kommentar schreiben