mptscsih: ioc0: Taskabbruch: ERFOLG (rv = 2002) führt zu einem Einfrieren von 30 Sekunden

11

Die E / A meiner Software RAID6 friert häufig etwa 30 Sekunden lang ein. Danach ist alles wieder normal.

Nachdem das Einfrieren vorbei ist, wird dies in syslog gestellt:

Mar 14 18:43:57 server kernel: [35649.816060] sd 5:0:23:0: [sdy] CDB: Read(10): 28 00 6c 52 68 58 00 04 00 00
Mar 14 18:43:58 server kernel: [35651.149020] mptbase: ioc0: LogInfo(0x31140000): Originator={PL}, Code={IO Executed}, SubCode(0x0000) cb_idx mptscsih_io_done
Mar 14 18:43:58 server kernel: [35651.151962] mptscsih: ioc0: task abort: SUCCESS (rv=2002) (sc=ffff8807b02dfe80)
Mar 14 18:43:58 server kernel: [35651.151967] mptscsih: ioc0: attempting task abort! (sc=ffff88002a7f30c0)
Mar 14 18:43:58 server kernel: [35651.151972] sd 5:0:23:0: [sdy] CDB: Read(10): 28 00 6c 52 6c 58 00 04 00 00
Mar 14 18:43:58 server kernel: [35651.151981] mptscsih: ioc0: task abort: SUCCESS (rv=2002) (sc=ffff88002a7f30c0)
Mar 14 18:43:58 server kernel: [35651.151984] mptscsih: ioc0: attempting task abort! (sc=ffff8804120e5ec0)
Mar 14 18:43:58 server kernel: [35651.151988] sd 5:0:23:0: [sdy] CDB: Read(10): 28 00 6c 52 70 58 00 04 00 00
Mar 14 18:43:58 server kernel: [35651.151996] mptscsih: ioc0: task abort: SUCCESS (rv=2002) (sc=ffff8804120e5ec0)
Mar 14 18:43:58 server kernel: [35651.151999] mptscsih: ioc0: attempting task abort! (sc=ffff880154afb280)
Mar 14 18:43:58 server kernel: [35651.152020] sd 5:0:23:0: [sdy] CDB: Read(10): 28 00 6c 52 74 58 00 04 00 00
Mar 14 18:43:58 server kernel: [35651.152029] mptscsih: ioc0: task abort: SUCCESS (rv=2002) (sc=ffff880154afb280)

Ich habe den Fehler gegoogelt und jemand schlug vor, 1,5 Gbit / s anstelle von 3,0 Gbit / s zu verwenden. Mit lsiutilIch habe die Verbindungsgeschwindigkeit geändert:

# lsiutil -p 1 -i 

Firmware Settings
-----------------
SAS WWID:                       500605b002c0f680
Multi-pathing:                  Disabled
SATA Native Command Queuing:    Enabled
SATA Write Caching:             Enabled
SATA Maximum Queue Depth:       32
Device Missing Report Delay:    0 seconds
Device Missing I/O Delay:       0 seconds
Phy Parameters for Phynum:      0    1    2    3    4    5    6    7
  Link Enabled:                 Yes  Yes  Yes  Yes  Yes  Yes  Yes  Yes
  Link Min Rate:                1.5  1.5  1.5  1.5  1.5  1.5  1.5  1.5
  Link Max Rate:                1.5  1.5  1.5  1.5  1.5  1.5  1.5  1.5
  SSP Initiator Enabled:        Yes  Yes  Yes  Yes  Yes  Yes  Yes  Yes
  SSP Target Enabled:           No   No   No   No   No   No   No   No
  Port Configuration:           Auto Auto Auto Auto Auto Auto Auto Auto
Target IDs per enclosure:       1
Persistent mapping:             Enabled
Physical mapping type:          None
Target ID 0 reserved for boot:  No
Starting slot (direct attach):  0
Target IDs (physical mapping):  8
Interrupt Coalescing:           Enabled, timeout is 16 us, depth is 4

Das hat nicht geholfen.

Ich habe versucht, "Device Missing I / O Delay" auf 32 zu ändern. Das hat auch nicht geholfen.

Ich habe versucht, / sys / class / scsi_device / * / device / timeout von 30 auf 100 und dann auf 3 zu ändern. Alle fehlgeschlagen.

$ uname -a
Linux server 3.2.0-0.bpo.1-amd64 #1 SMP Sat Feb 11 08:41:32 UTC 2012 x86_64 GNU/Linux
$ grep LSISAS1068E /var/log/messages
Mar 13 15:47:44 server kernel: [   21.082363] scsi5 : ioc0: LSISAS1068E B3, FwRev=01210000h, Ports=1, MaxQ=483, IRQ=45
$ modinfo mptscsih
filename:       /lib/modules/3.2.0-0.bpo.1-amd64/kernel/drivers/message/fusion/mptscsih.ko
version:        3.04.20
license:        GPL
description:    Fusion MPT SCSI Host driver
author:         LSI Corporation
srcversion:     85D42A00FEBA3C95555E3AF
depends:        scsi_mod,mptbase
intree:         Y
vermagic:       3.2.0-0.bpo.1-amd64 SMP mod_unload modversions 
$ cat /sys/block/sdae/device/model
ST3000DM001-9YN1
$ cat /sys/block/sdae/device/rev
CC4C

Das Problem tritt äußerst selten auf, wenn nur Lese- oder Schreibvorgänge ausgeführt werden: Ich kann 1 TB ohne Probleme lesen oder schreiben. Das Problem scheint aufzutreten, wenn sowohl Lese- als auch Schreibvorgänge ausgeführt werden. Bei einem RAID6 geschieht dies, wenn Sie eine Datei schreiben, die kleiner als die Stripe-Größe ist und der Stripe noch nicht zwischengespeichert ist (in diesem Fall muss der Stripe gelesen werden, um eine neue Prüfsumme zu berechnen).

Das System ist keine virtuelle Maschine.

Was verursacht das Problem? Wie werde ich die 30 Sekunden des Einfrierens los?

Bearbeiten: zusätzliche Tests

Ich habe ein schönes Test-Set gefunden, das das Problem zu provozieren scheint. Es enthält Dateien, die kleiner als die Streifengröße sind, wodurch eine Neuberechnung der Parität erzwungen wird, wodurch viele Lesevorgänge in Kombination mit den Schreibvorgängen erzwungen werden.

Ich muss zugeben, dass ich nicht gedacht habe, dass der Warteschlangenplaner Auswirkungen auf dieses Problem haben würde. Ich hab mich geirrt. Es ist klar, dass deadlinedas viel schlimmer ist als die anderen. Keiner von ihnen löst das Problem.

# cat /sys/block/sdaa/queue/scheduler
noop deadline [cfq]

Wenn Sie den Scheduler so ändern, noopdass das Problem nach 100 bis 120 Sekunden auftritt.

parallel echo noop \> {} ::: /sys/block/sd*/queue/scheduler

Wenn Sie den Scheduler so ändern, deadlinedass das Problem nach 20 bis 30 Sekunden auftritt.

parallel echo deadline \> {} ::: /sys/block/sd*/queue/scheduler

cfqWenn Sie den Scheduler so ändern , dass das Problem nach 120-300 Sekunden auftritt.

parallel echo cfq \> {} ::: /sys/block/sd*/queue/scheduler

Edit2

Da der Scheduler eine Auswirkung hat, denke ich, ob das Problem durch zu viele Anforderungen in einem Zeitrahmen verursacht wird. Kann ich die Anzahl der pro Sekunde gesendeten Anfragen irgendwie drosseln?

Ole Tange
quelle

Antworten:

5

Die MPTSCSIH-Treiber-Versionshinweise von LSI sehen interessant aus.

Major Changes For Version 2.06.75.00-1
Release Date:  12/10/2007

General Changes
Functionality
•   Task Aborts for commands to a Volume are returned as FAILED and not sent to FW.

Welche Version ist dein Treiber? ( modinfo mptscsih)

Verwenden Sie diesen Link, um Informationen zur Seagate- Firmware für Ihr Barracuda 3 TB-Laufwerk zu erhalten. Sie müssen die Seriennummer eingeben, um Details zu erhalten.

Update: Anprobieren smartctl -i /dev/sdaaIch habe es gerade auf SCSI und SATA getestet und auf diese Weise die Seriennummer erhalten.

Nils
quelle
Welche Teile der Treiberversionshinweise sind für dieses Problem relevant? Wie finde ich die Seriennummer mit GNU / Linux auf Festplatten, die in Produktion sind? Und was würden Sie von Seagate dazu erwarten? Die Version von mptscsih wird in der Frage aktualisiert.
Ole Tange
@OleTange Ich habe den "interessanten" Abschnitt eingefügt. Obwohl Ihr Treiber neuer zu sein scheint, könnte es ein altes Problem sein, das hier erneut auftritt. Was die Seriennummer betrifft ... Seagate bietet nur Windows-Tools an. Unter Linux würde ich einen inqBefehl versuchen - vielleicht von einigen EMC-Treibern (sollte frei herunterladbar sein) - aber dies ist nur eine Vermutung.
Nils
2
@OleTange RE: "Wie finde ich die Seriennummer mit GNU / Linux auf Festplatten, die in Produktion sind?" Wenn Sie dmidecodedies ausführen, wird die Beschreibung der Hardwarekomponenten aus dem Speicher abgerufen. Bei Artikeln auf Verbraucherebene gibt es häufig keine Einträge für Festplatten-SNs. Bei Enterprise-Geräten wird dies jedoch normalerweise hinzugefügt, oder die Laufwerke verfügen über mehr Informationen. Es gibt spezielle --typeCodes für MFR-Geräte, falls diese verfügbar gemacht wurden. Unternehmen, die Arrays bereitstellen, stellen diese Informationen normalerweise bereit, damit zurückgerufene Laufwerke gefunden werden können.
2bc
@LinuxlyChallenged dmidecodesieht keine Laufwerke - weder intern noch extern. Ich konnte inqDebian nicht finden .
Ole Tange
@OleTange verwenden smartctlsiehe meine aktualisierte Antwort ...
Nils
2

Haben Sie versucht, Ihre E / A-Planer zu ändern?

   mccoy:/sys/block/sdb/queue # cat scheduler 
   noop anticipatory deadline [cfq] 
   mccoy:/sys/block/sdb/queue # echo noop > scheduler 
   mccoy:/sys/block/sdb/queue # cat scheduler 
   [noop] anticipatory deadline cfq 

Die Standardeinstellung ist CFQ, normalerweise für die meisten Systeme "derzeit".

Gehen Sie wie folgt vor, um E / A-Planer zu vergleichen:

Lesen Sie die Tests:

# echo 3 > /proc/sys/vm/drop_caches

Dadurch wird sichergestellt, dass Sie die Festplatte testen und keine zwischengespeicherten RAM-Seiten. Dadurch wird der Cache geleert.

Schreibtests:

Kopieren Sie Ihre Dateien mehrmals gleichzeitig. Sobald die Schreibvorgänge abgeschlossen sind, geben Sie async

Wenn Sie beide testen, möchten Sie möglicherweise drop_cachesanrufen, syncwenn der Kopiervorgang abgeschlossen ist. Zusätzlich zum Scheduler gibt es Tunables für jeden Scheduler. Ein schneller Test wäre jedoch, den Scheduler zu ändern und es erneut zu versuchen. Wenn Sie einen guten Controller haben, noopwird die "E / A-Planung" darauf verlagert und keine Datenplanung auf Betriebssystemebene durchgeführt.

Auf jeden Fall ist es einen Versuch wert und es dauert nur einen echo, um es zurückzusetzen.

2bc
quelle
Siehe aktualisierte Frage für die Ergebnisse.
Ole Tange
2

Ich habe das Problem durch den Kauf einer SAS2008-Karte gelöst. Es beschwert sich immer noch ein wenig im Protokoll, blockiert jedoch nie die Festplatten-E / A. Ich habe auch getestet, dass es 4 TB SATA-Laufwerke unterstützt, während der LSI-SAS1068E nur 2 TB unterstützt.

Da ich den LSI-SAS1068E an den Verkäufer zurücksenden werde, kann ich keine anderen Vorschläge ausprobieren. Deshalb schließe ich die Frage hier.

Ole Tange
quelle