Linux çekirdeğini birkaç yüz milisaniye boyunca “dondurmaya” (veya neredeyse donmaya) zorlama


17

Gerçek zamanlı olmayan bir çekirdekte (CentOS 6) gerçek zamanlı bir süreç yürütüyoruz ve bu muhtemelen değişmeyecek.

Bir seferde 1,5 saat boyunca sürekli olarak özel bir FPGA'dan yaklaşık 500 MB / s PCIe trafiği gerektiren bir akış video uygulamamız var. Uygulama oldukça iyi çalışıyor - çoğu zaman. Ancak, çekirdeğin bir seferde 500 milisaniyeye kadar PCIe veya bellek isteklerine hizmet vermeyi yanıtlamayı bıraktığı göründüğü durumlar oldu. Bu başka bir iş parçacığından gelen bursty dosya GÇ sırasında gerçekleşiyor gibi görünüyor. Ben ana uygulama çalışırken sadece kullanıcı alanından kukla dosya IO bir sürü yaparak bu sorunu çoğaltmak için imkansız buldum.

Bu sorunu yeniden üretebilmemiz için Linux çekirdeğinin küresel bir “donmasını” (özellikle, PCIe veya tüm DDR3 bellek erişimlerini veya bunun gibi bir şeyi durdurma) zorlamanın (simüle etmenin) bir yolu var mı?

Şu anda dahili FPGA belleğe 10 milisaniyeye kadar tamponlama uyguladık, ancak bu yeterli değil. FPGA DDR3'e arabelleğe alabilir ve daha sonra ana bilgisayara dökebiliriz, ancak bu yeni özelliği baskı altında test etmek için bir yönteme ihtiyacımız var.

Çekirdeğin donmasını veya kalıcı olarak kilitlenmesini istemiyoruz. Zaman aralığını ayarlama yeteneği istiyoruz.

/proc/sys/vmGeçici olarak sihirli değerler yazma çizgisi boyunca bir şey arıyorum , bu da sistemi neredeyse tarar ve birkaç yüz milisaniyeden sonra geri döner, ancak kırmanın olası yollarının sayısına bakmak benim gibi bir acemi için değil ( https://www.kernel.org/doc/Documentation/sysctl/vm.txt ). Belki biraz numactlsihir?


Benim önsezim bunun bir çekirdek modülü yazmayı gerektirmesidir. Bir şekilde tüm CPU'lardaki tüm iş parçacıklarını dondurmanız ve bir zamanlayıcı kesintisinde yeniden başlamayı ayarlamanız gerekir.
Gilles 'SO- kötü olmayı bırak

Konuları dondurmak istemiyorum, çekirdeği dondurmak istiyorum! Yani, donanıma (bellek ve / veya PCIe ve / veya disk) kısa bir süre için erişimi önlemek istiyorum. Bu işe yaramazsa, işleri çok optimize etmeyi, L1 önbelleğini vb. Devre dışı bırakmayı umursamıyorum. Bunu nasıl yapacağımı bilmiyorum.
Mark LAKATA

1
Ah, yani çekirdeği dondurmak istemiyorsunuz, çekirdeğin sadece bazı donanıma yanıt veren kısmını dondurmak mı istiyorsunuz? Bu da çekirdeğin derinliklerine dalmayı gerektiriyordu.
Gilles 'SO- kötü olmayı bırak'

Donanım bir parçası olarak donmuş olduğu sürece çekirdeği tamamen dondurmayı umursamıyorum.
Mark Lakata

1
Anlaşılan, ana CPU, bazı IO tamponlarını temizlediğinden (dosyaları yazmak için HDF5 kullanıyoruz) TLB thrashing ile ilgilidir ve bu TLB thrashing, bir NUMA sistemi olduğu için yardımcı işlemcinin de thrash yapmasına neden oluyor. Sanırım şimdi ihtiyacımız olan tek şey programlı bir şekilde TLB'nin kontrollü bir süre boyunca çökmesine neden olmanın güvenilir bir yoludur.
Mark Lakata

Yanıtlar:


9

Hızlı bir test yapmak için bir seçenek, KGDB etkin bir çekirdek kullanmak ve çekirdeği manuel olarak durdurmak ve test etmek olabilir, bu bağlantıya bakın .

Başka bir notta, duraklamalarınıza neden olabileceğini hatırladığım şeyler:

  • cpufreq, cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_transition_latencydeğer ns (AMD FX (tm) -8120'de Sekiz Çekirdekli İşlemcide 4000) değerinde bir sorun olmamalı, ancak kontrol edin
  • İşlemcinin kendisini veya voltaj regülatör modülünü termal kısma.
  • NAPI ve / veya yoğun ağ trafiği
  • PCIe ASPM ( cat /sys/module/pcie_aspm/parameters/policy)
  • Hedef aygıtınızın arabelleklerinde koruma (sabit disk, nic ...)
  • PCIe veri yolundaki bazı aygıtların belleniminde hata (kullanmıyorsanız bile), bunları kapatmayı deneyebilirsiniz /sys/bus/pci/devices/$DEVICE/power/control

Aynı şeyi yapmak kdbyerine kullanabilir miyim kgdb? Ben de hiç kullanmadım. Dünkü Sun iş istasyonlarındaki "Stop-A" komut dizisi gibi mi? Sadece hızlı bir SysRq-g yaparsam, "go" yazıp, sistemi bozmama ihtimalim yüksek mi? (ref: kernel.org/pub/linux/kernel/people/jwessel/kdb/… )
Mark Lakata

1
Muhtemelen kdb'yi kullanabileceksiniz. USB bağlantılı klavyelerle çalışması gerektiğini unutmayın, ancak her durumda bir PS / 2'ye sahip olmayı deneyin. Ve bu çok düşük seviyeli bir hata ayıklayıcıdır (çekirdek arazi), bu nedenle her zaman olduğu gibi yedekleri saklayın ve kırılırsa her iki parçayı da saklayabilirsiniz :).
Jorge Nerín

Çekirdeğe ince ayar yapmadan önce, ilk önce veriyolunu (PCI sürücüleri) (ve en dikkat çekici şekilde grafik sürücüleri) kullanabilen kullanılmayan çekirdek modüllerini boşaltmaya ve aygıtları sistemden fiziksel olarak çıkarmaya ya da kapatmaya çalışıyordum. PCIe 1.0 x1'in 250MB / s'lik bir bant genişliği var ve PCIe 2.0 x1 500MB / s'ye kadar çıkıyor, hem başlangıç ​​noktası hem de hedef cihaz kesintisiz kesintisiz hızı kabul etmekte serbest mi veya daha fazla tavan boşluğu sağlamak için daha fazla şeridi var mı?
Jorge Nerín

Gecikmenin bir başka olası kaynağı, bazı cihazların bazı ACPI güç yönetimi işleyicileri veya hatta harici bir olay bekleyen bazı SMM CPU işleyicileri olabilir.
Franki

2

Başvurunuzun FPGA ile nasıl iletişim kurduğuyla ilgili daha fazla ayrıntı alabilir miyiz? FPGA'dan veya çekirdeğe (ağ kartları gibi) kesinti gönderen FPGA'dan arabelleği okuyan uygulama mı?

Ben / dev bir blok / char açmak ve sonra onunla iletişim bekliyoruz. Bu, uygulama ile / dev / XXX dosyası arasındaki iletişimi yapmak için bir sürücü kullandığı anlamına gelir.

Ben çıktı almak istiyorum cat /proc/interrupts:; lsmod;ls -al /dev/yourmod

İşte fikirler:

  • Kesmeye bağlıysa, CPU'ları PIC'yi karşılık gelen IRQ'yu devre dışı bırakacak şekilde ayarlayabilir ve ardından yeniden etkinleştirebilirsiniz. Bu, kartın her isteğinin göz ardı edilmesine neden olur (kartın farkında olmadan).
  • bir arabellek okuması gibi ise, şunları yapabilirsiniz:
    • Uygulamanızı uyku durumuna getirin, böylece FPGA'daki veriler okunmaz ve ara belleğiniz dolar, ardından uygulamanızı uyandırır ve okumaya devam eder.
    • "Okumak" değerini birkaç saniye "noop" olarak değiştirmek için "crash" veya "kgdb" kullanın, sonra varsayılan işleve geri ayarlayın.

Lütfen faydalı bulabileceğiniz tüm bilgileri sağlayın.


FPGA, DMA'yı ana belleğe yazar ve bu kesinti dönemlerinde, FPGA ana belleğe yazamaz, bu nedenle dahili FIFO yedeklenir. Ana bilgisayar işlemi için ileti tabanlı bir arabirim var (PCIe üzerinden gerçekleşir), ancak bunun dahil olmadığından eminim. Doğrulama amacıyla, temelde FPGA donanımının birkaç yüz milisaniyede ana belleğe yazmasını yasaklamanın bir yoluna ihtiyacım var. Bellek sorununu çözmek istemiyorum, ancak FPGA'daki uygulamamızın bir bellek kesintisi (1000 ms'ye kadar) ile başa çıkabildiğinden emin olmak istiyorum.
Mark Lakata

Tamam, eğer DMA kullanıyorsa, aşağıdakilere bir göz atabilirsiniz : kernel.org/doc/Documentation/DMA-ISA-LPC.txt özellikle request_dma_lock () ve dma_disable (). Ancak, FPGA'nız tarafından kullanılan adresleri bilmeniz gerekir.
Adrien M.

1

Yardımcı olup olmadığından emin değilim. Ancak suspend, başka bir aygıtın çekirdek modülünün işlevini çağıran bir çekirdek modülü yazabilirseniz , bunu yapabilir.

Her PCI aygıt http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/pci.h#L479 başlık dosyasına göre askıya alınabilir

Örneğin, Intel e1000 NIC'nin askıya alma işlevi http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/drivers/net/e1000e/netdev.c#L4643

Hatırlayabildiğim kadarıyla, bu işlev esas olarak sistem hazırda bekletme moduna geçtiğinde kullanıldı, aygıt sürücüsünün geçerli çalışma durumunu kaydetmesi ve kendini kapatması gerekiyor.


teşekkürler, ama bunun işe yarayacağını sanmıyorum. Gerçekten, cihazı hazırda bekletme moduna hazırlamasını söyleyen çekirdek olan bir aygıtı askıya almak istemiyorum; Çekirdeğin bilmeden belirli bir cihazı (bu durumda FPGA ek kartı) yok saymasını istiyorum (uzun gecikmeler veya zaman aşımları dışında) - veya tüm SDRAM bellek aktarımlarını durdurmak istiyorum.
Mark Lakata

0

Bence yanlış çizgiler üzerinde düşünüyorsun. Hedefiniz açık.

Yol, işlemlerin geri kalanını durdurmak değil, ana süreçlerinize gerçek zamanlı geçiş önceliğine yakın vermektir. Bunun için önemli kullanıcı alanı süreçleriniz için nice kullanın .

Daha zor olan sorun, çekirdek alanında bulunan PCIe kesme işlemidir.

Donanım söz konusu olduğundan, anakartınızdaki ilgili PCIe şeridine ve bunun belirli bir CPU soketine nasıl bağlandığına daha yakından bakmaya başlamalısınız.

irqbalance normalde burada iyi bir iş çıkarır , ancak davranışını ihtiyaçlarınıza göre yapılandırabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.