Wir führen einen Echtzeitprozess auf einem Nicht-Echtzeit-Kernel (CentOS 6) aus, und dies wird sich wahrscheinlich nicht ändern.
Wir haben eine Streaming-Video-Anwendung, die 1,5 Stunden lang ununterbrochen ca. 500 MB / s PCIe-Datenverkehr von einem benutzerdefinierten FPGA benötigt. Die Anwendung funktioniert ziemlich gut - die meiste Zeit. Es gab jedoch Situationen, in denen der Kernel anscheinend nur bis zu 500 Millisekunden lang nicht mehr auf PCIe- oder Speicheranforderungen reagiert. Dies scheint während der Bursty-Datei-E / A von einem anderen Thread zu geschehen. Ich fand es unmöglich, zu versuchen, dieses Problem zu replizieren, indem ich nur viel Dummy-Datei-E / A aus dem Benutzerbereich ausführte, während die Hauptanwendung ausgeführt wurde.
Gibt es eine Möglichkeit, ein globales "Einfrieren" des Linux-Kernels zu erzwingen (simulieren) (insbesondere das Stoppen von PCIe oder aller DDR3-Speicherzugriffe oder dergleichen), damit wir dieses Problem reproduzieren können?
Wir haben bis zu 10 Millisekunden im internen FPGA-Speicher gepuffert, aber das ist nicht genug. Wir können auf FPGA DDR3 puffern und dann auf den Host sichern, aber wir benötigen eine Methode, um diese neue Funktion unter Zwang zu testen.
Wir möchten nicht, dass der Kernel dauerhaft einfriert oder blockiert. Wir möchten die Möglichkeit, das Zeitintervall einzustellen.
Ich bin auf der Suche nach etwas in der Art, wie man magische Werte /proc/sys/vm
vorübergehend schreibt , um das System virtuell kriechen zu lassen, und dann nach ein paar hundert Millisekunden wieder zurück zu kehren. https://www.kernel.org/doc/Documentation/sysctl/vm.txt ). Vielleicht etwas numactl
Magie?
Antworten:
Eine Möglichkeit, einen Schnelltest durchzuführen, besteht darin, einen KGDB-fähigen Kernel zu verwenden und den Kernel manuell zu stoppen und zu testen ( siehe diesen Link) .
Außerdem erinnere ich mich an Dinge, die Ihre Pausen verursachen könnten:
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_transition_latency
der Wert ist in ns (4000 in meinem AMD FX (tm) -8120 Eight-Core-Prozessor) sollte kein Problem sein, aber überprüfencat /sys/module/pcie_aspm/parameters/policy
)/sys/bus/pci/devices/$DEVICE/power/control
quelle
kdb
anstattkgdb
dasselbe zu tun? Ich habe auch noch nie benutzt. Entspricht dies der "Stop-A" -Befehlssequenz auf Sun-Workstations von gestern? Wenn ich nur ein kurzes SysRq-g mache, dann tippe "go". Habe ich eine hohe Wahrscheinlichkeit, das System nicht zu beschädigen? (Ref: kernel.org/pub/linux/kernel/people/jwessel/kdb/… )Können wir weitere Informationen darüber erhalten, wie Ihre Anwendung mit dem FPGA kommuniziert? Ist es die Anwendung, die den Puffer vom FPGA liest, oder das FPGA, das einen Interrupt an den Kernel sendet (wie Netzwerkkarten)?
Ich erwarte, dass es einen Block / char in / dev öffnet und dann mit ihm kommuniziert. Dies bedeutet, dass für die Kommunikation zwischen der Anwendung und der Datei / dev / XXX ein Treiber verwendet wird.
Ich hätte gerne die Ausgabe von
cat /proc/interrupts
:;lsmod
;ls -al /dev/yourmod
Hier sind die Ideen:
Bitte geben Sie alle Informationen an, die Sie als nützlich erachten.
quelle
Ich bin mir nicht sicher, ob es hilft. Wenn Sie jedoch ein Kernelmodul schreiben können, das die
suspend
Funktion des Kernelmoduls eines anderen Geräts aufruft , ist dies möglicherweise ausreichend.Jedes PCI-Gerät kann gemäß der Header-Datei http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/pci.h#L479 angehalten werden
Hier ist beispielsweise die Suspend-Funktion der Intel e1000-Netzwerkkarte: http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/drivers/net/e1000e/netdev.c#L4643
Soweit ich mich erinnern kann, wurde diese Funktion hauptsächlich verwendet, wenn das System in den Ruhezustand wechselt. Der Gerätetreiber muss den aktuellen Betriebsstatus speichern und sich selbst ausschalten.
quelle
Ich denke, Sie denken in die falsche Richtung. Dein Ziel ist klar.
Der Weg ist nicht, den Rest der Prozesse anzuhalten, sondern Ihren Hauptprozessen eine zeitnahe Priorität einzuräumen. Verwenden Sie dazu nice für Ihre wichtigen User-Space-Prozesse.
Das schwierigere Problem ist die Handhabung von PCIe-Interrupts, die sich im Kernel-Space befindet.
Da es sich um Hardware handelt, sollten Sie sich die betroffene PCIe-Lane auf Ihrem Mainboard genauer ansehen und herausfinden, wie diese möglicherweise mit einem bestimmten CPU-Sockel verbunden ist.
Normalerweise macht irqbalance hier einen guten Job, aber Sie können das Verhalten so konfigurieren, dass es Ihren Bedürfnissen entspricht.
quelle