Linux 커널이 일반적으로 메모리를 할당할 수 있는 것보다 빠르게 RAM 블록 장치를 할당합니다.

Linux 커널이 일반적으로 메모리를 할당할 수 있는 것보다 빠르게 RAM 블록 장치를 할당합니다.

배경

100gbps 네트워크 연결을 사용하여 새로 생성된 Linux 상자(AWS EC2)에 최대 속도(12.5GB/s) 또는 그에 가까운 속도로 약 150GB를 다운로드하려고 합니다. 네트워크 쪽은 잘 작동합니다. 그러나 상자에 192GB RAM이 있음에도 불구하고 상자에서 모든 데이터를 충분히 빠르게 저장할 수 있는 곳을 찾기 위해 애썼습니다.

지금까지 가장 성공적인 시도는 brd커널 모듈을 사용하여 충분히 큰 RAM 블록 장치를 할당하고 해당 장치에 병렬로 쓰는 것이었습니다. 이는 블록 장치가 완전히 기록되면 원하는 속도(직접 io 사용)로 작동합니다.dd if=/dev/zero ...

불행하게도 brd장치가 새로 생성되면 약 2GB/s의 쓰기 속도만 허용됩니다.

내 생각에는 이것이 brd"정상적인" 커널 관리 메모리에 연결되어 있기 때문인 것 같습니다. 따라서 각각의 새 블록이 처음으로 사용될 때 커널은 실제로 이를 할당해야 하며 이는 2GB/s보다 빠르지 않습니다.

지금까지 시도한 모든 것에는 동일한 문제가 있습니다. , , , tmpfs및 기타 모든 항목은 일반 커널 메모리 할당 시스템에 RAM 저장소 후크를 제공하는 것 같습니다 ramfs.brd

질문

Linux에서 블록 장치를 만드는 방법이 있습니까?진짜일반적인 커널 메모리 관리를 거치지 않고 메모리를 관리합니까?

부팅 시 일정량의 메모리를 할당하여 디스크처럼 처리하는 커널 모듈이 있을 수도 있다고 생각했습니다. 이 메모리는 커널에서 일반 메모리로 간주되지 않으므로 다른 용도로 사용하는 데에는 문제가 없습니다.

brd또는 커널이 램디스크(또는 유사한)를 신속하게 완전히 초기화 하도록 하는 방법이 있습니까 ? 디스크의 마지막 블록에 개별적으로 쓰기를 시도했지만 당연히 도움이 되지 않았습니다.

RAM이 아닌 대안

이론적으로 NVMe SSD의 RAID는 필요한 쓰기 속도를 달성할 수 있지만, 전체 I/O가 이렇게 높아지는 것을 막는 일종의 병목 현상이 있을 가능성이 있는 것 같습니다. 8개의 NVMe SSD와 함께 RAID 0을 사용해 보았지만 mdadm성공하지 못했습니다. 부분적으로는 블록 크기 문제 때문인 것 같습니다. 직접 IO를 사용하고 커널 캐시를 우회하려면(필요해 보입니다) 사용할 수 있는 유일한 블록 크기는 4096입니다. SSD 자체를 효과적으로 활용하기에는 분명히 너무 작습니다. 여기에 대한 대안이 있으면 크게 감사하겠습니다.

논평

2GB/s가 많은 것처럼 들리고 해당 데이터를 다운로드하는 데 몇 분 밖에 걸리지 않는다는 것을 알고 있지만 EC2 인스턴스가 전혀 없는 상태에서 로드된 150GB EC2 인스턴스로 1분 이내에 이동해야 합니다. 이론적으로 이것은 전적으로 가능해야 합니다. 네트워크 스택과 물리적 RAM은 완벽하게 데이터를 빠르게 전송할 수 있습니다.

감사해요!

답변1

tmpfs 파일 시스템에서 64개 작업을 병렬로 실행하여 7.8초 만에 1.6GB 파일 64개(총 100GB)를 복사할 수 있었습니다. 이는 100Gbit/s에 매우 가깝습니다.

따라서 병렬로 실행하는 경우(메타코드):

curl byte 1G..2G | write_to file.out position 1G..2G 

ẁrite_to을 구현하는 데 사용할 수 있습니다 mmap.

어쩌면 단순히 다른 파일에 쓰고, 루프 장치를 사용하고, 선형 모드에서 RAID를 사용할 수도 있습니다. https://raid.wiki.kernel.org/index.php/RAID_setup#Linear_mode

양쪽 끝을 제어하는 ​​경우 소스를 150개의 1GB 파일로 설정하여 선형 모드에서 루프 장치 및 RAID로 사용할 수 있습니다. 그런 다음 이를 병렬로 복사하고 선형 RAID를 다시 설정해야 합니다.

관련 정보