Meinen Rechner verwende ich seit dem Kauf eines Tablets vorwiegend für die Verwaltung meiner Fotos mit digikam.
Informationen zu meinem System:
Hier die Ergebnisse meiner Analyse:
Total DISK READ: 19.19 K/s | Total DISK WRITE: 2.08 M/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 1121 be/3 root 0.00 B/s 0.00 B/s 0.00 % 83.57 % [jbd2/dm-6-8] 2915 be/4 volker 0.00 B/s 61.42 K/s 0.00 % 27.76 % digikam -caption digiKam --icon digikam 11 be/4 root 0.00 B/s 0.00 B/s 0.00 % 11.43 % [kworker/0:1] 54 be/4 root 3.84 K/s 0.00 B/s 0.00 % 11.06 % [kworker/0:2]
Meine Recherche im Netz ergab, dass es evtl. helfen könnte den Interval zu vergrößern, mit dem das EXT4 Dateisystems seine Metadaten auf die Platte schreibt. Der default ist 5 Sekunden. Ich habe Testweise das Interval auf 30 Sekunden erhöht (mount -o,remount,commit=30 /home). Leider hatte dies keine fühlbaren Verbesserungen gebracht.
Im Netz bin ich dann auf die Möglichkeit gestoßen, das EXT4 Dateisystem zu tracen und zwar folgendermaßen:
# starten des Kernel trace echo 1 > /sys/kernel/debug/tracing/events/ext4/ext4_sync_file_enter/enable # auslesen des traces cat /sys/kernel/debug/tracing/trace
Der obige Trace zeichnet auf, wenn ein fsync auf einem EXT4 Dateisystem ausgeführt wird. Folgendes lieferte der Trace während des Arbeitens in digikam:
[...] # mehrere hundert Zeilen folgender Art: digikam-2898 [000] 167.651034: ext4_sync_file_enter: dev 252,6 ino 3019998 parent 2228273 datasync 0 digikam-2898 [000] 167.651685: ext4_sync_file_enter: dev 252,6 ino 3019257 parent 3019998 datasync 0 digikam-2898 [001] 167.653826: ext4_sync_file_enter: dev 252,6 ino 3020412 parent 3019998 datasync 0 digikam-2898 [000] 167.665824: ext4_sync_file_enter: dev 252,6 ino 3019259 parent 3019998 datasync 0 digikam-2898 [001] 167.674035: ext4_sync_file_enter: dev 252,6 ino 3019998 parent 2228273 datasync 0 digikam-2898 [001] 167.674691: ext4_sync_file_enter: dev 252,6 ino 3019259 parent 3019998 datasync 0 [...]
Mit find habe ich mir dann bei den häufig auftretenden Inode Nummern die dazugehörigen Dateien herausgesucht: z.B.:
find /home -inum 3019257 /home/neuntoeter/Fotos/thumbnails-digikam.db
Ich habe dann festgestellt, dass die sqlite Datenbanken digikam4.db und thumbnails-digikam.db die Auslöser für die fsyncs sind.
Nach ein wenig Recherche habe ich herausgefunden, dass bei sqlite Datenbanken diese fsyncs bei jeder Datenbankänderung normal sind (zumindest bei journal_mode=delete).
Digikam verwendet standardmäßig den Journal Mode “Delete”:
sqlite3 digikam4.db sqlite> pragma journal_mode; delete
Ich habe nun mal den Journal Mode von digikam4.db und thumbnails-digikam.db auf WAL umgestellt:
sqlite3 digikam4.db sqlite> pragma journal_mode=WAL;
Und siehe da! Die Performance ist deutlich besser und es gibt deutlich weniger Festplattenaktivität.
Hier die Vergleichswerte mit journal_mode=wal und journal_mode=delete beim EXIF-Rotate von 4 Bildern in digikam:
Journal_mode=delete:
- Dauer EXIF-Rotate: 12 Sekunden
- Anzahl fsyncs von digikam: 171
Journal_mode=wal:
- Dauer EXIF-Rotate: 7 Sekunden
- Anzahl fsyncs von digikam: 32