다른 벤치마크를 고려할 때 소프트웨어 RAID에서 병렬로 읽는 것이 "해야 하는" 것보다 느립니다.

다른 벤치마크를 고려할 때 소프트웨어 RAID에서 병렬로 읽는 것이 "해야 하는" 것보다 느립니다.

메모: 여기에서 다소 비슷한 질문을 보았지만 다음과 같습니다.

  1. 그 중 어느 것도 많은 파일을 병렬로 읽는 것과 관련이 없으며
  2. 대부분은 10년 이상 된 것이며 더 이상 관련이 없는 하드웨어 및 커널 버전과 관련이 있습니다.

배경:

저는 128코어 CPU 2개와 128GB RAM을 갖춘 Linux 시스템(Ubuntu, 커널 5.15.0-82-generic)을 가지고 있습니다. SATA를 통해 연결된 10개의 SSD로 구성된 RAID 5 어레이가 있으며, 각각 최대 530MB/s의 읽기 속도를 갖습니다. 이는 사용 중에 사실상 읽기 전용입니다(주로 낮에 사용되며 매일 밤 새 데이터가 추가됩니다). 내 일반적인 문제는 디스크의 데이터를 수십 개의 코어에 병렬로 공급하는 것입니다.

벤치마킹 절차

인스턴스를 실행하여 읽기를 벤치마킹하고 있습니다.

dd if=/path/to/large/file of=/dev/null bs=1024 count=1048576

iostat와 병행하여 iotop. 실행 사이에 다음을 실행하여 캐시를 지웁니다.

sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"

그렇게 하지 않으면 이후 핫 파일 읽기가 거의 즉시 완료되고 일단 해당 파일을 읽으면 이전과 동일한 성능으로 돌아가기 때문에 이것이 올바르게 작동한다고 확신합니다.

벤치마크 결과

소프트웨어 RAID를 통해 단일 파일을 읽으면 500 - 700MB/s 사이의 읽기 속도를 얻습니다. 출력을 보면 iostat이것이 수행되는 방식이 10개의 드라이브 각각에서 읽는다는 것을 알 수 있습니다. 기본적으로 병렬로 정확히 동일한 속도입니다.

드라이브에서 직접 읽는 경우(예: , 등을 에 대한 인수로 제공하는 경우 /dev/sda) /dev/sdbif=드라이브 dd에서 각각 530MB/s의 속도로 병렬로 읽을 수 있습니다(예: 10개 모두에서 1GB를 읽는 데 걸리는 시간은 정확히 동일합니다). 그 중 하나에서 1GB를 읽는 데 걸리는 시간입니다.)

그러나 소프트웨어 RAID를 통해 여러 파일을 병렬로 읽으려고 하면 성능이 매우 저하됩니다. 소프트웨어 RAID를 통해 10개의 파일을 병렬로 읽으면 개별 파일의 읽기 속도는 150MB/s에서 350MB/s 사이가 되며, 드라이브에서 직접 동일한 양의 데이터를 복사하는 데 걸리는 시간은 전체 프로세스에 약 4배 정도 걸립니다.

더욱이 소프트웨어 읽기에서 읽는 것은 iotop에서 보고한 대로 약 2.7GB/s의 총 읽기 속도에서 절대적인 벽에 부딪힌 것 같습니다.

낭비되지 않을 만큼 충분한 디스크 데이터를 모든 코어에 공급하려면 아마도 SATA 대신 NVMe로 이동해야 할 것 같지만, 소프트웨어 RAID나 다른 것처럼 보이기 때문에 이 문제를 먼저 해결하고 싶습니다. 그것의 업스트림은 이 디스크에서 읽을 수 있는 속도에 제한을 두는 것입니다.

질문:

  1. 병목 현상이 발생하는 위치를 어떻게 진단할 수 있나요?
  2. 여기서 구성 옵션을 어떻게 확인하고 다른 옵션은 무엇입니까?
  3. 내가 하려는 일을 불가능하게 만드는 설정의 근본적인 한계가 있습니까? 그렇다면 사용할 수 있는 대체 구성이 있습니까?

이미 시도한 것들

  • 의 블록 크기를 가지고 더 dd크거나 작게 만드는 것은 아무런 효과가 없습니다.
  • RAID 미리 읽기 및/또는 스트라이프 캐시 크기 설정은 효과가 없습니다.
  • 커널을 약간 더 새로운 버전으로 업그레이드하면 벤치마크 결과가 크게 저하되어 기본적으로 총 처리량을 500MB/s IIRC로 제한합니다.

부록:

iostat -k 1벤치마크 실행 중 샘플 출력 :https://pastebin.com/yuWwWbRU

내용 /proc/mdstat:

Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10] 
md127 : active raid5 sdj1[10] sdh1[7] sdi1[8] sdf1[5] sdd1[3] sdc1[2] sdg1[6] sde1[4] sdb1[1] sda1[0]
      70325038080 blocks super 1.2 level 5, 4k chunk, algorithm 2 [10/10] [UUUUUUUUUU]
      bitmap: 0/59 pages [0KB], 65536KB chunk

unused devices: <none>

관련 정보