
./Geringer Schreibdurchsatz NAS mit Linux?
Mai 30, 2008Vielleicht 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 MByteKlar, 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 ID1 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