Neulich hatte ich ein System unter den Fingern welches mit einer fiesen
Schreiblast zu kämpfen hatte. Schon in Nebenzeiten sah "iostat" nicht mehr wirklich gesund aus:
Mount Optionen: rw,acl,user_xattr) $ iostat -d -x 240 ... Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util sda 0.01 5.28 0.07 2.00 1.33 60.57 29.89 0.01 3.48 0.72 0.15 sdb 2.92 717.37 71.91 293.34 1333.90 8087.83 25.80 65.40 179.04 2.15 78.63
Zu den Hochlastzeiten kletterte die Utilization dann locker auf 95%.
Dieser Webserver schreibt in einer etwas ungesunder Art und Weise *sigh* dauerhaft sehr viele kleine Dateien. Also habe ich mir mal die
Mountoptionen des verwendeten Ext3-Dateisystem angeschaut und ein paar Kandidaten für eine Optimierung ausgemacht:
data={journal|ordered|writeback}
Specifies the journalling mode for file data. Metadata is always journaled. To use modes other than ordered on the root filesystem, pass
the mode to the kernel as boot parameter, e.g. rootflags=data=journal.
journal
All data is committed into the journal prior to being written into the main filesystem.
ordered
This is the default mode. All data is forced directly out to the main file system prior to its metadata being committed to the jour?
nal.
writeback
Data ordering is not preserved - data may be written into the main filesystem after its metadata has been committed to the journal.
This is rumoured to be the highest-throughput option. It guarantees internal filesystem integrity, however it can allow old data to
appear in files after a crash and journal recovery.
commit=nrsec
Sync all data and metadata every nrsec seconds. The default value is 5 seconds. Zero means default
noatime
Access timestamps are not updated when a file is read.
Ein paar Tests mit den verschiedenen Mountoptionen haben folgendes ergeben:
- Die Mountoption "noatime" brachte in Spitzenzeiten bei lokalen Mounts maximal 1-2 % Besserung
- Die zusätzliche Mountoption "commit=120" - also das Flushen der Schreib-Buffer alle 120 Sekunden hat in Nebenzeiten fast keine Besserung gebracht, in Hochlastzeiten war der Unterschied bei ca. 25% Utilization
- Die zusätzliche Mountoption "data=writeback" brachte ebenfalls in den Nebenzeit ebenfalls keine Besserung - in Hochlastzeiten war der Unterschied dann nochmals bei 25% Utilization
Natürlich bringen derartige Optimierungen nicht nur Vorteile - die Nachteile (nach einem Linux-Crash würden veraltete Daten im Filesystem auftauchen) waren aber in meiner Situation aber kein Problem...
Nun sieht es selbst in Spitzenzeiten noch ganz annehmbar aus:
$ iostat -d -x 240 Time: 20:56:12 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util sda 0.00 5.91 0.02 2.14 0.13 66.83 31.03 0.01 4.95 1.76 0.38 sdb 2.58 351.85 54.17 182.47 1063.50 8283.43 22.59 34.01 143.72 2.29 54.17

