Nous exécutons un processus en temps réel sur un noyau non temps réel (CentOS 6), et cela ne va probablement pas changer.
Nous avons une application de streaming vidéo qui nécessite environ 500 Mo / s de trafic PCIe à partir d'un FPGA personnalisé en continu pendant 1,5 heure à la fois. L'application fonctionne plutôt bien - la plupart du temps. Cependant, nous avons eu des situations où il semble que le noyau cesse de répondre aux demandes de maintenance PCIe ou de mémoire pendant jusqu'à 500 millisecondes à la fois. Cela semble se produire pendant les E / S de fichiers en rafale à partir d'un autre thread. J'ai trouvé impossible d'essayer de reproduire ce problème en faisant simplement beaucoup d'E / S de fichiers factices à partir de l'espace utilisateur pendant que l'application principale est en cours d'exécution.
Existe-t-il un moyen de forcer (simuler) un "gel" global du noyau Linux (en particulier, arrêter PCIe ou tous les accès à la mémoire DDR3 ou quelque chose comme ça) afin que nous puissions reproduire ce problème?
Nous avons mis en mémoire tampon jusqu'à 10 millisecondes en ce moment dans la mémoire FPGA interne, mais ce n'est pas suffisant. Nous pouvons mettre en mémoire tampon sur FPGA DDR3 puis vider sur l'hôte, mais nous avons besoin d'une méthode pour tester cette nouvelle fonctionnalité sous la contrainte.
Nous ne voulons pas que le noyau se fige ou se bloque définitivement. Nous aimerions pouvoir définir l'intervalle de temps.
Je cherche quelque chose dans le sens d'écrire /proc/sys/vm
temporairement des valeurs magiques qui rend le système pratiquement ramper, puis revenir en arrière après quelques centaines de millisecondes, mais regarder le nombre de façons possibles de le casser n'est pas pour un débutant comme moi ( https://www.kernel.org/doc/Documentation/sysctl/vm.txt ). Peut-être un peu de numactl
magie?
Réponses:
Une option pour faire un test rapide pourrait être d'utiliser un noyau compatible KGDB et d'arrêter le noyau manuellement et de tester, voir ce lien .
Sur une autre note, les choses dont je me souviens qui pourraient provoquer vos pauses:
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_transition_latency
la valeur est en ns (4000 dans mon processeur AMD FX (tm) -8120 à huit cœurs) ne devrait pas être un problème, mais vérifiezcat /sys/module/pcie_aspm/parameters/policy
)/sys/bus/pci/devices/$DEVICE/power/control
la source
kdb
au lieu dekgdb
faire de même? Je n'en ai jamais utilisé non plus. Est-ce comme la séquence de commandes "Stop-A" sur les postes de travail Sun d'antan? Si je fais juste un SysRq-g rapide, puis tape "go", aurai-je une forte probabilité de ne pas casser le système? (ref: kernel.org/pub/linux/kernel/people/jwessel/kdb/… )Pouvons-nous avoir plus de détails sur la façon dont votre application communique avec le FPGA? Est-ce l'application qui lit le tampon du FPGA, ou le FPGA qui envoie une interruption au noyau (comme les cartes réseau)?
Je m'attends à ce qu'il ouvre un bloc / char dans / dev puis communique avec lui. Cela signifie qu'il utilise un pilote pour établir la communication entre l'application et le fichier / dev / XXX.
J'aimerais avoir la sortie de
cat /proc/interrupts
:;lsmod
;ls -al /dev/yourmod
Voici les idées:
Veuillez fournir toutes les informations que vous jugerez utiles.
la source
Je ne sais pas si cela aide. Mais si vous pouvez écrire un module noyau qui appelle la
suspend
fonction du module noyau d'un autre périphérique, cela peut le faire.Chaque périphérique PCI peut être suspendu conformément au fichier d'en-tête http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/pci.h#L479
Par exemple, voici la fonction de suspension de la carte réseau Intel e1000 http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/drivers/net/e1000e/netdev.c#L4643
D'après ce dont je me souviens, cette fonction était principalement utilisée lorsque le système passe en veille prolongée, le pilote de périphérique doit enregistrer l'état de fonctionnement actuel et s'éteindre.
la source
Je pense que vous pensez dans le mauvais sens. Votre objectif est clair.
Le moyen n'est pas d'arrêter le reste des processus mais de donner à vos principaux processus une priorité de planification en temps réel. Utilisez nice pour vos processus d'espace utilisateur importants pour cela.
Le problème le plus difficile est la gestion des interruptions PCIe, qui réside dans l'espace noyau.
Étant donné que le matériel est impliqué, vous devriez commencer à regarder de plus près la voie PCIe impliquée sur votre carte mère et comment elle est éventuellement connectée à un socket CPU spécifique.
irqbalance fait normalement du bon travail ici, mais vous pouvez configurer son comportement en fonction de vos besoins.
la source