RAID1 읽기 액세스가 쓰기 액세스보다 느린 이유는 무엇입니까?


10

몇 가지 간단한 성능 테스트를 수행했으며 RAID1에서 읽는 것이 쓰기보다 느립니다.

root@dss0:~# for i in 1 2 3; do dd if=/dev/zero of=/dev/sda bs=1048576 count=131072; done
137438953472 bytes (137 GB) copied, 192.349 s, 715 MB/s
137438953472 bytes (137 GB) copied, 192.851 s, 713 MB/s
137438953472 bytes (137 GB) copied, 193.026 s, 712 MB/s
root@dss0:~# for i in 1 2 3; do dd if=/dev/sda of=/dev/null bs=1048576 count=131072; done
137438953472 bytes (137 GB) copied, 257.201 s, 534 MB/s
137438953472 bytes (137 GB) copied, 255.522 s, 538 MB/s
137438953472 bytes (137 GB) copied, 259.945 s, 529 MB/s

dd는 성능 테스트 도구는 아니지만이 결과는 여전히 놀랍습니다.

시스템은 공급 업체가 제작했으며 16GB RAM이 장착 된 Supermicro 메인 보드가 있습니다. RAID 컨트롤러는 1GB 캐시가있는 MegaRAID 9271-8i입니다. SAS-933EL1 후면 판에는 8 개의 2 바이트 SAS 디스크가 있습니다. 케이블 연결이 확실하지 않으면 컨트롤러의 한 커넥터는 SAS 후면 판으로 가고 다른 하나는 OS를 보유한 2 개의 SATA 디스크로갑니다.

RAID1은 다음 명령으로 설정되었습니다 :

root@dss0:~# /opt/MegaRAID/MegaCli/MegaCli64 -CfgLdAdd -r1 [8:0,8:1,8:2,8:3,8:4,8:5,8:6,8:7] WB NORA Direct -a0
Adapter 0: Created VD 0
Adapter 0: Configured the Adapter!!
Exit Code: 0x00

root@dss0:~# /opt/MegaRAID/MegaCli/MegaCli64 -LDInfo -LALL -aALL
Adapter 0 -- Virtual Drive Information:
Virtual Drive: 0 (Target Id: 0)
Name                :
RAID Level          : Primary-1, Secondary-0, RAID Level Qualifier-0
Size                : 7.275 TB
Sector Size         : 512
Is VD emulated      : No
Mirror Data         : 7.275 TB
State               : Optimal
Strip Size          : 256 KB
Number Of Drives    : 8
Span Depth          : 1
Default Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Current Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Default Access Policy: Read/Write
Current Access Policy: Read/Write
Disk Cache Policy   : Disk's Default
Encryption Type     : None
PI type: No PI
Is VD Cached: No
Exit Code: 0x00

나는 읽기 액세스가 쓰기 액세스만큼 빠르거나 더 빠를 것으로 기대합니다. 715MByte / sec 쓰기 속도는 단일 SAS / SATA 커넥터의 6GBit 제한에 근접한 것으로 보입니다. SAS 후면 판의 구성 또는 케이블 연결 문제입니까? MegaRAID 명령으로 SAS 후면 판 구성을 쿼리 할 수 ​​있습니까? 조언 부탁드립니다.

최신 정보

poige와 Peter가 설명했듯이, 예상보다 느린 읽기 성능은 아마도 Linux I / O- 서브 시스템의 캐싱에 의한 것입니다.

dd 명령에서 direct 플래그를 사용하면

root@dss0:~# dd if=/dev/sda of=/dev/null bs=1048576 count=131072 iflag=direct
137438953472 bytes (137 GB) copied, 199.862 s, 688 MB/s

쓰기 속도보다 훨씬 우수하지만 여전히 10 % 느립니다. oflag = direct를 사용해도 쓰기 속도에는 영향을 미치지 않았습니다.


간단한 대답 : 읽기는 결과 대기를 요구하지만 쓰기는 요구하지 않습니다.
David Schwartz

답변:


8

poige는 쓰기 캐시에 대해 정확히 맞지만 자세한 내용은 다음과 같습니다.

dd가 0이고 쓰기 캐시를 사용하는 것은 벤치마킹에 올바른 방법이 아닙니다 (물론 쓰기 캐시를 테스트하려는 경우가 아니라면 메타 데이터를 동기화하고 새 파일을 만드는 정도 등 파일 시스템에만 유용 할 것입니다). ) (그리고 dd는 항상 잘못된 유형의 벤치 마크이지만 매우 기본적인 테스트에서는 작동합니다)

다음 옵션 중 하나 이상과 함께 dd를 사용하는 것이 좋습니다.

conv=fdatasync -> this will make it flush to disk before finishing and calculating speed
oflag=direct   -> this will make it skip the OS cache but not the disk cache
conv=sync      -> more like skipping the disk cache too, but not really ... just flushing it every block or something like that.

그리고 0도 사용하지 마십시오. 일부 스마트 하드웨어 / 소프트웨어 / 펌웨어는 데이터를 0으로 예측할 수있는 경우 일부 바로 가기를 사용할 수 있습니다. 내가 사용하지 않는 압축이있는 경우 특히 그렇습니다. 대신 메모리에 임의 파일 (예 : / dev / shm)을 사용하십시오. urandom은 느리므로 다시 읽을 수 있도록 일시적으로 작성해야합니다. 50MB의 임의 파일을 작성하십시오.

dd if=/dev/urandom of=/dev/shm/randfile bs=1M count=50

파일을 여러 번 읽어서 씁니다 (여기서는 cat을 사용하여 6 번 읽습니다).

dd if=<(cat /dev/shm/randfile{,,,,,}) of= ... conv=fdatasync

rm /dev/shm/randfile

또한 병렬 작업에서는 raid1 읽기가 가장 빠르므로 디스크를 독립적으로 사용할 수 있습니다. 다른 디스크로 동일한 작업의 다른 부분을 읽을 수 있도록 디스크를 조정하는 것이 현명하지 않을 수도 있습니다.


10

귀하의 질문에 대한 답변의 핵심은 미리 읽기 입니다. 옛날 옛적에, 나는 또한 그 문제가 발생했습니다 .

IOW는 최적의 순차적 읽기 성능을 위해 모든 디스크를 영구적으로 입력에 포함시켜야합니다.

ddw / o 를 사용하면 directio(참조 man dd) 쓰기 작업이 즉시 수행되지 않고 OS 캐시를 거치므로 모든 디스크를 순차적으로 포함하고 가능한 최대 성능을 얻을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.