데이터가 처리되고, 압축되고, 4TB 메모리 매핑 파일에 기록되는 동안 DMA 전송을 사용하여 하드웨어 장치에서 ~4 * 50MB/s의 속도로 데이터를 읽는 프로세스가 있습니다.
각 DMA 전송은 평균적으로 20밀리초 미만이 소요됩니다. 그러나 5분마다 여러 번 DMA를 전송하면 최대 300밀리초가 걸릴 수 있는데 이는 큰 문제입니다.
우리는 이것이 커널이 더티 메모리 매핑 페이지를 디스크로 플러시하는 것과 관련이 있을 수 있다고 생각합니다. 매핑된 메모리에 대한 쓰기를 중지하면 DMA 전송 기간은 괜찮기 때문입니다. 그러나 이것이 DMA 전송에 어떻게/왜 영향을 미치는지 혼란스러워하며 이를 방지할 수 있는 방법이 있습니까?
하드웨어 장치에는 데이터를 버퍼링할 메모리가 있지만 DMA 전송 속도가 너무 느리면 데이터가 손실됩니다.
현재 우리는 4.1.10 lts 커널을 사용하여 Arch Linux에서 테스트하고 있지만 Ubuntu 14.04에서도 대부분 좋지 않은 결과를 얻었습니다. 하드웨어는 HP z820 워크스테이션, 32GB RAM 및 듀얼 Xeon E5-2637 @ 3.50Ghz(http://www8.hp.com/h20195/v2/GetPDF.aspx/c04111177.pdf).
우리는 또한 Windows 버전의 소프트웨어를 시험해 보았지만 이 특정 문제는 없었지만 다른 많은 문제가 있었습니다.
답변1
리눅스에는 약간의실시간옵션이지만 그 자체로는 실시간 커널은 아닙니다. 이를 통해 프로세스는 준비가 되자마자 비실시간 프로세스보다 먼저 예약되도록 요청하여 필요한 경우 CPU를 예약할 수 있습니다.
기본적으로 프로세스에는 SCHED_OTHER 스케줄링 정책이 제공됩니다. 실행 중인 pid가 주어지면 이를 실시간 SCHED_FIFO로 설정하거나 시작할 때 chrt -f -p prio pid
명령 앞에 접두사를 붙일 수 있습니다. chrt -f prio
우선순위는 prio
일반 프로세스와는 아무런 관련이 없으며 실시간 프로세스가 리소스를 놓고 경쟁하는 경우에만 사용됩니다. ps
이러한 우선순위를 음수 값으로 표시합니다(예: 실시간 우선순위 20의 경우 -21).
ionice --class 1 -p pid
또한 실시간 IO 대기열의 우선순위를 지정하여 프로세스를 예약하는 데 도움이 됩니다.
답변2
장치가 몇 분 동안 계속 작동합니까, 아니면 전송 중에 주기적으로 일시 중지됩니까?
일시 중지가 있으면 커널을 강제로 실행할 수 있습니다빈 버퍼 및 캐시이 시간 동안 이 활동은 DMA 전송을 방해하지 않습니다. 또는 BDFLUSHR
커널이 버퍼를 플러시하기로 결정할 때마다 더 적은 양의 데이터를 쓰도록 커널을 1초 간격으로 구성할 수 있습니다 .
지속적인 작업을 보장해야 하는 경우 CPU와 장치가 동시에 메모리에 액세스할 수 있도록 더 많은 채널이 있는 RAM이 필요합니다(이미 4채널 메모리 컨트롤러가 있음이 밝혀졌습니다). RAM이 다음과 같이 구성되어 있는지 확인하십시오.비연계 모드, 이 옵션을 사용할 수 있는 경우. 메모리 컨트롤러가 실제로 4채널 모드에서 실행될 수 있도록 메모리 채널에 해당하는 4개 슬롯에 유사한 DRAM 모듈을 설치했는지 확인하십시오.
답변3
아직 커널 더티 페이지 설정을 수정하지 않은 것 같습니다. 귀하의 사용 사례에 대해서는 다음과 같이 시도해 보겠습니다.
/proc/sys/vm/dirty_background_bytes:50000000
/proc/sys/vm/dirty_bytes:4000000000
/proc/sys/vm/dirty_expire_centisecs:100
/proc/sys/vm/dirty_writeback_centisecs:20
(바라보다https://www.kernel.org/doc/Documentation/sysctl/vm.txt더 알아보기. )
문제는 기본적으로 시스템에 RAM이 많고 저장 장치가 느리고 최악의 대기 시간을 낮추려는 경우 기본 커널 제한에 문제가 있다는 것입니다. 실제로 시스템 IO 하위 시스템 버퍼가 꽉 차서 블록 장치에 충분한 데이터가 기록될 때까지("더티 페이지 플러시") 쓰기 프로세스가 강제로 절전 모드로 전환되어야 합니다.