我們在非實時核心(CentOS 6)上運行實時進程,這可能不會改變。
我們有一個串流視訊應用程序,需要來自定制 FPGA 的大約 500 MB/s 的 PCIe 流量,每次持續 1.5 小時。該應用程式在大多數情況下都運行得很好。然而,我們也遇到過這樣的情況:核心似乎一次停止回應 PCIe 服務或記憶體請求長達 500 毫秒。這似乎發生在來自另一個線程的突發文件 IO 期間。我發現不可能透過在主應用程式運行時從用戶空間執行大量虛擬檔案 IO 來嘗試複製此問題。
有沒有辦法強制(模擬)Linux 核心的全域「凍結」(特別是停止 PCIe 或所有 DDR3 記憶體存取或類似的操作),以便我們可以重現此問題?
我們現在在內部 FPGA 記憶體中實現了長達 10 毫秒的緩衝,但這還不夠。我們可以緩衝到 FPGA DDR3,然後轉儲到主機,但我們需要一種方法來在脅迫下測試這個新功能。
我們不希望核心永久凍結或鎖定。我們希望能夠設定時間間隔。
我正在尋找類似於編寫魔法值的東西/proc/sys/vm
暫時寫入魔法值的東西,使系統幾乎爬行,然後在幾百毫秒後恢復回來,但是查看打破它的可能方法的數量並不適合像我這樣的新手(https://www.kernel.org/doc/Documentation/sysctl/vm.txt)。也許有些numactl
魔法?
答案1
進行快速測試的一種選擇是使用啟用 KGDB 的核心並手動停止核心並進行測試,看到這個連結。
另一方面,我記得可能會導致你停頓的事情:
- cpufreq,,
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_transition_latency
該值以 ns 為單位(在我的 AMD FX(tm)-8120 八核心處理器中為 4000)應該不是問題,但請檢查 - 對 CPU 本身或穩壓器模組進行熱節流。
- NAPI 和/或網路流量大
- PCIe ASPM (
cat /sys/module/pcie_aspm/parameters/policy
) - 目標設備(硬碟、網卡...)的緩衝區中存在爭用
- PCIe匯流排中某些裝置的韌體存在錯誤(即使您沒有使用它),您可以嘗試使用以下命令關閉它們的電源
/sys/bus/pci/devices/$DEVICE/power/control
答案2
我們能否了解有關您的應用程式如何與 FPGA 通訊的更多詳細資訊?是應用程式從 FPGA 讀取緩衝區,還是 FPGA 向核心發送中斷(如網卡)?
我希望它在 /dev 中打開一個塊/字符,然後與其通信。這意味著它使用驅動程式在應用程式和 /dev/XXX 檔案之間進行通訊。
我想要的輸出:
cat /proc/interrupts
; lsmod
;ls -al /dev/yourmod
這是想法:
- 如果是中斷驅動的,可以設定CPU PIC來停用對應的IRQ,然後重新啟用它。這將導致卡的每個請求被忽略(卡不知道它)。
- 如果它像緩衝區一樣讀取,您可以:
- 將您的應用程式置於睡眠狀態,這樣來自 FPGA 的資料將不會被讀取,並且您的緩衝區將填滿,然後喚醒您的應用程式並繼續讀取。
- 使用“crash”或“kgdb”將“read”值變更為“noop”幾秒鐘,然後將其設定回預設功能。
請提供您可能認為有用的所有資訊。
答案3
不確定是否有幫助。但是,如果您可以編寫一個核心模組來呼叫suspend
另一個裝置的核心模組的功能,那就可以了。
每個PCI設備都可以根據頭檔暫停http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/pci.h#L479
例如,這裡是Intel e1000網卡的掛起功能http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/drivers/net/e1000e/netdev.c#L4643
據我所知,這個功能主要是在系統進入休眠狀態時使用,裝置驅動程式需要保存目前的運作狀態並自行關閉。
答案4
我認為你的想法是錯的。你的目標很明確。
方法不是停止其餘進程,而是為主要進程提供接近即時調度的優先權。使用好的對於您重要的使用者空間流程。
更困難的問題是 PCIe 中斷處理,它駐留在核心空間。
由於涉及硬體,您應該開始仔細查看主機板上涉及的 PCIe 通道以及它如何連接到特定的 CPU 插槽。
中斷平衡通常在這裡做得很好,但您可以配置其行為以滿足您的需求。