Làm cách nào để buộc kernel Linux đóng băng cứng (hoặc gần như đóng băng) trong vài trăm mili giây


17

Chúng tôi đang chạy một quy trình thời gian thực trên nhân không phải thời gian thực (CentOS 6) và điều này có lẽ sẽ không thay đổi.

Chúng tôi có một ứng dụng phát video trực tuyến yêu cầu khoảng 500 MB / s lưu lượng PCIe từ một GPU tùy chỉnh liên tục trong 1,5 giờ một lần. Ứng dụng này hoạt động khá tốt - hầu hết thời gian. Tuy nhiên, chúng tôi đã gặp phải tình huống hạt nhân chỉ dừng đáp ứng phục vụ các yêu cầu bộ nhớ hoặc PCIe trong tối đa 500 mili giây mỗi lần. Điều này dường như xảy ra trong tập tin IO nổ từ một luồng khác. Tôi thấy không thể cố gắng sao chép vấn đề này bằng cách thực hiện nhiều tệp giả IO từ không gian người dùng trong khi ứng dụng chính đang chạy.

Có cách nào để buộc (mô phỏng) toàn cầu "đóng băng" hạt nhân Linux (đặc biệt là dừng PCIe hoặc tất cả các truy cập bộ nhớ DDR3 hoặc một cái gì đó tương tự) để chúng tôi có thể tái tạo vấn đề này không?

Chúng tôi có bộ đệm lên tới 10 mili giây được triển khai ngay bây giờ vào bộ nhớ trong, nhưng điều đó là không đủ. Chúng ta có thể đệm vào DDR3 DDR3 và sau đó kết xuất vào máy chủ, nhưng chúng ta cần một phương pháp để kiểm tra tính năng mới này trong thời gian ngắn.

Chúng tôi không muốn hạt nhân đóng băng hoặc khóa vĩnh viễn. Chúng tôi muốn khả năng thiết lập khoảng thời gian.

Tôi đang tìm kiếm thứ gì đó dọc theo dòng viết các giá trị ma thuật để /proc/sys/vmtạm thời làm cho hệ thống gần như bò, và sau đó quay trở lại sau vài trăm mili giây, nhưng nhìn vào số cách có thể để phá vỡ nó không dành cho người mới như tôi ( https://www.kernel.org/doc/Documentation/sysctl/vm.txt ). Có lẽ là một số numactlphép thuật?


Linh cảm của tôi là điều này đòi hỏi phải viết một mô-đun hạt nhân. Bạn sẽ cần phải đóng băng tất cả các luồng trên tất cả các CPU bằng cách nào đó và sắp xếp để khởi động lại trên ngắt hẹn giờ.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi không muốn đóng băng các chủ đề, tôi muốn đóng băng kernel! Ý tôi là, tôi muốn ngăn truy cập vào phần cứng (bộ nhớ và / hoặc PCIe và / hoặc đĩa) trong một thời gian ngắn. Nếu điều đó không hiệu quả, tôi không ngại làm cho mọi thứ trở nên không tối ưu hóa, vô hiệu hóa bộ đệm L1, v.v. Tôi chỉ không biết làm thế nào để làm điều này.
Đánh dấu Lakata

1
À, vậy bạn không muốn đóng băng kernel, bạn chỉ muốn đóng băng phần kernel đáp ứng với một số phần cứng? Điều đó cũng vậy, sẽ yêu cầu lặn khá sâu vào nhân.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi không ngại đóng băng hạt nhân hoàn toàn, miễn là phần cứng bị đóng băng như một phần của nó.
Đánh dấu Lakata

1
Hóa ra, vấn đề liên quan đến việc đập TLB khi CPU chủ xóa một số bộ đệm IO (chúng tôi đang sử dụng HDF5 để ghi tệp) và việc đập TLB này đang khiến bộ đồng xử lý cũng bị đập, vì đó là hệ thống NUMA. Tôi đoán tất cả những gì chúng ta cần bây giờ là một cách đáng tin cậy về mặt lập trình gây ra việc đập TLB trong một khoảng thời gian được kiểm soát.
Đánh dấu Lakata

Câu trả lời:


9

Một tùy chọn để thực hiện kiểm tra nhanh có thể là sử dụng kernel kích hoạt KGDB và dừng kernel theo cách thủ công và kiểm tra, xem liên kết này .

Một lưu ý khác, những điều tôi nhớ có thể khiến bạn tạm dừng:

  • cpufreq, cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_transition_latencygiá trị tính bằng ns (4000 trong Bộ xử lý tám lõi AMD FX (tm) -8120 của tôi) không phải là vấn đề, nhưng hãy kiểm tra
  • Điều chỉnh nhiệt hoặc chính cpu hoặc mô-đun điều chỉnh điện áp.
  • NAPI và / hoặc lưu lượng truy cập mạng nặng
  • PCIe ASPM ( cat /sys/module/pcie_aspm/parameters/policy)
  • Sự tham gia vào bộ đệm của thiết bị đích của bạn (đĩa cứng, nic ...)
  • Lỗi trong phần sụn của một số thiết bị trong bus PCIe (ngay cả khi bạn không sử dụng nó), bạn có thể thử tắt nguồn chúng bằng /sys/bus/pci/devices/$DEVICE/power/control

Tôi có thể sử dụng kdbthay vì kgdbđể làm như vậy? Tôi cũng chưa từng sử dụng. Đây có giống như chuỗi lệnh "Dừng-A" trên các máy trạm của năm qua không? Nếu tôi chỉ thực hiện SysRq-g nhanh chóng, sau đó gõ "go", tôi có xác suất cao không phá vỡ hệ thống không? (ref: kernel.org/pub/linux/kernel/people/jwessel/kdb/iêu )
Mark Lakata

1
Có lẽ bạn sẽ có thể sử dụng kdb. Xin lưu ý rằng nó nên hoạt động với bàn phím được kết nối usb, nhưng hãy cố gắng có một PS / 2 tiện dụng chỉ trong trường hợp. Và đây là một trình gỡ lỗi cấp độ rất thấp (kernel kernel), vì vậy, như mọi khi, hãy giữ các bản sao lưu và nếu nó bị hỏng, bạn có thể giữ cả hai phần :).
Jorge Nerín

Trước khi sử dụng tinh chỉnh kernel, trước tiên tôi sẽ thử dỡ các mô-đun hạt nhân không sử dụng cho các thiết bị PCIe có thể sử dụng bus (đáng chú ý nhất là trình điều khiển đồ họa) và loại bỏ vật lý khỏi thiết bị khỏi hệ thống hoặc tắt nguồn. PCIe 1.0 x1 có băng thông 250MB / s và PCIe 2.0 x1 lên tới 500MB / s, cả hai thiết bị gốc và đích đều có thể chấp nhận tốc độ duy trì như vậy mà không bị gián đoạn hoặc chúng có nhiều làn đường hơn để cho phép nhiều khoảng không hơn?
Jorge Nerín

Một nguồn có thể khác của độ trễ có thể là một số trình xử lý quản lý nguồn ACPI của một số thiết bị hoặc thậm chí có thể là một trình xử lý CPU SMM đang chờ một sự kiện bên ngoài.
Franki

2

Chúng tôi có thể có thêm thông tin chi tiết về cách ứng dụng của bạn giao tiếp với FPGA không? Đây có phải là ứng dụng đọc bộ đệm từ FPGA hay là FPGA gửi ngắt đến kernel (như card mạng) không?

Tôi hy vọng nó sẽ mở một khối / char in / dev và sau đó giao tiếp với nó. Điều này có nghĩa là nó sử dụng trình điều khiển để thực hiện giao tiếp giữa ứng dụng và tệp / dev / XXX.

Tôi muốn có đầu ra của : cat /proc/interrupts; lsmod;ls -al /dev/yourmod

Đây là ý tưởng:

  • Nếu nó bị gián đoạn, bạn có thể đặt PIC CPU để vô hiệu hóa IRQ tương ứng, sau đó kích hoạt lại nó. Điều này sẽ khiến mọi yêu cầu của thẻ bị bỏ qua (không có thẻ để biết về nó).
  • nếu nó giống như một bộ đệm đọc, bạn có thể:
    • Đặt ứng dụng của bạn ở trạng thái ngủ, để dữ liệu từ FPGA sẽ không được đọc và bộ đệm của bạn sẽ lấp đầy, sau đó đánh thức ứng dụng của bạn và tiếp tục đọc.
    • Sử dụng "crash" hoặc "kgdb" để thay đổi giá trị "đọc" thành "noop" trong vài giây, sau đó đặt nó trở lại chức năng mặc định.

Vui lòng cung cấp tất cả thông tin bạn có thể thấy là hữu ích.


FPGA không ghi DMA vào bộ nhớ máy chủ và trong những khoảng thời gian ngừng hoạt động này, FPGA không thể ghi vào bộ nhớ máy chủ, do đó, sao lưu FIFO bên trong của nó. Có một giao diện dựa trên thông báo cho quá trình máy chủ (xảy ra trên PCIe), nhưng tôi chắc chắn rằng điều này không liên quan. Đối với mục đích xác nhận, về cơ bản, tôi cần một cách cấm phần cứng FPGA ghi vào bộ nhớ trong vài trăm mili giây. Tôi không muốn giải quyết vấn đề bộ nhớ, nhưng tôi muốn đảm bảo rằng việc triển khai trên đồ họa của chúng tôi có thể giải quyết tình trạng hết bộ nhớ (tối đa 1000 ms).
Đánh dấu Lakata

Ok, nếu nó đang sử dụng DMA, bạn có thể xem qua: kernel.org/doc/Documentation/DMA-ISA-LPC.txt cụ thể trên các yêu cầu về phần tử_dim_ma () và dma_disable (). Tuy nhiên, bạn sẽ cần biết các địa chỉ được sử dụng bởi FPGA của bạn.
Adrien M.

1

Không chắc chắn nếu nó giúp. Nhưng nếu bạn có thể viết một mô-đun hạt nhân gọi suspendchức năng của mô-đun hạt nhân của thiết bị khác, điều đó có thể làm được.

Mỗi thiết bị PCI có thể bị treo theo tệp tiêu đề http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/pci.h#L479

Ví dụ: đây là chức năng tạm dừng của Intel e1000 NIC http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/drivers/net/e1000e/netdev.c#L4643

Từ những gì tôi có thể nhớ lại, chức năng này chủ yếu được sử dụng khi hệ thống chuyển sang chế độ ngủ đông, trình điều khiển thiết bị cần lưu trạng thái chạy hiện tại và tự tắt.


cảm ơn, nhưng tôi không nghĩ rằng nó sẽ làm việc Tôi thực sự không muốn đình chỉ một thiết bị, đó là hạt nhân báo cho thiết bị chuẩn bị ngủ đông; Tôi muốn hạt nhân bỏ qua thiết bị cụ thể (trong trường hợp này là bảng con gái FPGA) mà không biết (ngoài thời gian trễ hoặc thời gian chờ dài) - hoặc tôi muốn dừng tất cả các lần chuyển bộ nhớ SDRAM.
Đánh dấu Lakata

0

Tôi nghĩ rằng bạn đang suy nghĩ dọc theo dòng sai. Mục tiêu của bạn là rõ ràng.

Cách không phải là dừng các quy trình còn lại mà là đưa ra các quy trình chính của bạn gần mức ưu tiên của quy trình thời gian thực. Sử dụng tốt cho các quy trình không gian người dùng quan trọng của bạn cho điều đó.

Vấn đề khó khăn hơn là việc xử lý ngắt PCIe, nằm trong không gian kernel.

Vì phần cứng có liên quan, bạn nên bắt đầu xem xét kỹ hơn về làn PCIe có liên quan trên bo mạch chính của bạn và cách nó có thể được kết nối với một ổ cắm CPU cụ thể.

irqbalance thường làm tốt công việc ở đây, nhưng bạn có thể định cấu hình bahaviour của nó để phù hợp với nhu cầu của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.