Prowadzimy proces w czasie rzeczywistym na jądrze nie działającym w czasie rzeczywistym (CentOS 6) i prawdopodobnie nie ulegnie to zmianie.
Mamy aplikację do przesyłania strumieniowego wideo, która wymaga około 500 MB / s ruchu PCIe z niestandardowego układu FPGA przez 1,5 godziny bez przerwy. Aplikacja działa całkiem dobrze - przez większość czasu. Jednak zdarzały się sytuacje, w których wydaje się, że jądro po prostu przestaje odpowiadać na obsługę żądań PCIe lub pamięci przez maksymalnie 500 milisekund na raz. Wydaje się, że tak się dzieje podczas IO pliku bursty z innego wątku. Nie udało mi się spróbować replikować tego problemu, po prostu wykonując wiele fałszywych operacji we / wy pliku z przestrzeni użytkownika podczas działania głównej aplikacji.
Czy istnieje sposób na wymuszenie (symulację) globalnego „zamrożenia” jądra systemu Linux (w szczególności zatrzymanie dostępu do pamięci PCIe lub całego DDR3 itp.), Abyśmy mogli odtworzyć ten problem?
Buforujemy do 10 milisekund zaimplementowanych teraz w wewnętrznej pamięci FPGA, ale to nie wystarczy. Możemy buforować do FPGA DDR3, a następnie zrzucić do hosta, ale potrzebujemy metody przetestowania tej nowej funkcji pod przymusem.
Nie chcemy, aby jądro zawiesiło się lub zablokowało na stałe. Chcielibyśmy możliwość ustawienia odstępu czasu.
Szukam czegoś w stylu pisania magicznych wartości, które /proc/sys/vm
tymczasowo powodują, że system wirtualnie się czołga, a następnie wraca do poprzedniego poziomu po kilkuset milisekundach, ale patrząc na liczbę możliwych sposobów jego złamania, nie jest to dla początkujących jak ja ( https://www.kernel.org/doc/Documentation/sysctl/vm.txt ). Może trochę numactl
magii?
Odpowiedzi:
Jedną z opcji szybkiego testu może być użycie jądra z włączoną funkcją KGDB i ręczne zatrzymanie jądra i przetestowanie, zobacz ten link .
Z drugiej strony, rzeczy, które pamiętam, które mogą powodować twoje przerwy:
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_transition_latency
wartość jest w ns (4000 w moim ośmiordzeniowym procesorze AMD FX (tm) -8120) nie powinno stanowić problemu, ale sprawdźcat /sys/module/pcie_aspm/parameters/policy
)/sys/bus/pci/devices/$DEVICE/power/control
źródło
kdb
zamiastkgdb
tego samego? Nigdy też nie użyłem. Czy to jest jak sekwencja poleceń „Stop-A” na stacjach roboczych firmy Sun w przeszłości? Jeśli po prostu zrobię szybki SysRq-g, a następnie wpisz „go”, czy będę mieć duże prawdopodobieństwo, że nie zepsuje systemu? (zob .: kernel.org/pub/linux/kernel/people/jwessel/kdb/… )Czy możemy uzyskać więcej informacji na temat sposobu, w jaki Twoja aplikacja komunikuje się z FPGA? Czy to aplikacja odczytuje bufor z FPGA, czy FPGA, która wysyła przerwanie do jądra (jak karty sieciowe)?
Oczekuję, że otworzy blok / char w / dev, a następnie się z nim komunikuje. Oznacza to, że używa sterownika do komunikacji między aplikacją a plikiem / dev / XXX.
Chciałbym mieć wynik
cat /proc/interrupts
:;lsmod
;ls -al /dev/yourmod
Oto pomysły:
Podaj wszystkie informacje, które mogą okazać się przydatne.
źródło
Nie jestem pewien, czy to pomaga. Ale jeśli możesz napisać moduł jądra, który wywołuje
suspend
funkcję modułu jądra innego urządzenia, może to zrobić.Każde urządzenie PCI można zawiesić zgodnie z plikiem nagłówka http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/pci.h#L479
Na przykład, oto funkcja zawieszenia karty Intel e1000 NIC http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/drivers/net/e1000e/netdev.c#L4643
Z tego co pamiętam, ta funkcja była używana głównie, gdy system przechodzi w stan hibernacji, sterownik urządzenia musi zapisać bieżący stan działania i sam się wyłączyć.
źródło
Myślę, że myślisz niewłaściwie. Twój cel jest jasny.
Sposób nie polega na zatrzymaniu reszty procesów, ale nadaniu głównym procesom priorytetu scedulowania w czasie rzeczywistym. Użyj miły dla swoich użytkowników ważnych procesów przestrzenią za to.
Trudniejszym problemem jest obsługa przerwań PCIe, która znajduje się w przestrzeni jądra.
Ponieważ w grę wchodzi sprzęt, powinieneś bliżej przyjrzeć się zaangażowanemu paskowi PCIe na płycie głównej i sposobowi, w jaki jest on podłączony do określonego gniazda procesora.
irqbalance zazwyczaj wykonuje dobrą robotę, ale możesz skonfigurować jego zachowanie, aby odpowiadało twoim potrzebom.
źródło