Linux에서 NCQ를 비활성화하는 방법 32MiB를 한 번에 수신 할

VHDL에서 자체 직렬 -ATA 호스트 버스 어댑터 (HBA)를 구현하고이를 FPGA에 프로그래밍했습니다. FPGA는 모든 디지털 회로로 프로그래밍 할 수있는 칩입니다. 또한 직렬 트랜시버가 장착되어 SATA 또는 PCIe 용 고속 신호를 생성합니다.

이 SATA 컨트롤러는 SATA 6Gb / s 회선 속도를 지원하고 ATA-8 DMA-IN / OUT 명령을 사용하여 최대 32MiB 청크로 장치와 데이터를주고받습니다. 디자인은 최고 속도 (예 : Samsung SSD 840 Pro-> 550 MiB / s 이상)에서 작동하는 것으로 입증되었습니다.

여러 SSD 및 HDD 장치로 일부 테스트를 한 후 새로운 Seagate 6 TB Archive HDD ( ST6000AS0002 )를 구입했습니다 . 이 HDD는 최대 190MiB / s 읽기 성능에 도달 하지만 쓰기 성능은 30-40MiB / s에 불과합니다!

그래서 더 깊이 파고 전송 된 프레임을 측정했습니다 (그렇습니다. FPGA 디자인으로 가능합니다). 내가 알 수있는 한 Seagate HDD는 전송의 첫 32MiB를 한 번에 수신 할 준비가되었습니다. 이 전송은 최대 라인 속도 580 MiB / s에서 발생합니다. 그 후 HDD는 800ms 이상 남은 바이트를 멈 춥니 다! 그런 다음 HDD는 다음 32MiB를 수신 할 준비가되고 800ms 동안 다시 정지합니다. 대체로 1GiB 전송에는 30 초에 걸쳐 약 35MiB / s에 해당합니다.

이 HDD에는 버스트 사이클 사이에서 플러시되는 32 MiB 쓰기 캐시가 있다고 가정합니다. 32 MiB 미만의 데이터 전송에는이 동작이 표시되지 않습니다.

내 컨트롤러는 DMA-IN 및 DMA-OUT 명령을 사용하여 데이터를 전송합니다. NCQ 가능 AHCI 컨트롤러에서 사용되는 QUEUED-DMA-IN 및 QUEUED-DMA-OUT 명령을 사용하고 있지 않습니다. FPGA 플랫폼에서 AHCI 및 NCQ를 보충하는 것은 매우 복잡하며 애플리케이션 계층에는 필요하지 않습니다.

이 시나리오를 Linux PC에서 재현하고 싶지만 Linux AHCI 드라이버에는 기본적으로 NCQ가 활성화되어 있습니다. 나는 내가 얼마나 기술이 웹 사이트를 발견, 해제 NCQ 필요 해제 NCQ를 , 그러나 그것은 작동하지 않습니다.

Linux PC는 여전히 190 MiB / s 쓰기 성능에 도달합니다.

> dd if=/dev/zero of=/dev/sdb bs=32M count=32
1073741824 bytes (1.1 GB) copied, 5.46148 s, 197 MB/s

위 기사의 결함이 있다고 생각합니다. NCQ 대기열 깊이를 1로 줄이면 NCQ가 비활성화되지 않습니다. 그것은 단지 OS가 하나의 대기열만을 사용하도록 허용합니다. 전송에 여전히 QUEUED-DMA-** 명령을 사용할 수 있습니다. 드라이버가 장치에 DMA-IN / OUT 명령을 실행하도록 NCQ를 실제로 비활성화해야합니다.

내 질문은 다음과 같습니다.

  1. NCQ를 비활성화하려면 어떻게해야합니까?
  2. NCQ 대기열 깊이가 1 인 경우 Linux의 AHCI 드라이버가 QUEUED-DMA-** 또는 DMA-** 명령을 사용합니까?
  3. 변경 사항 /sys/block/sdX/device/queue_depth이보고되지 않기 때문에 NCQ가 비활성화되어 있는지 어떻게 확인할 수 dmesg있습니까?


답변

@frostschutz 덕분에 NCQ 기능이없는 Linux에서 쓰기 성능을 측정 할 수있었습니다. 커널 부팅 매개 변수는 libata.force=noncqNCQ를 완전히 비활성화했습니다.

Seagate 6TB 쓰기 성능 문제와 관련하여 속도에는 변화가 없었습니다. Linux는 여전히 180 MiB / s에 도달합니다.

그러나 나는 또 다른 아이디어를 가지고 있었다 :
리눅스 드라이버는 32 MiB 청크의 전송을 사용하지 않는다. 커널 버퍼는 특히 32 개 큐의 NCQ가 활성화 된 경우 (32 개 큐 * 32MiB => 1GiB AHCI 버퍼) 훨씬 작습니다.

그래서 256KiB 전송과 속도로 SATA 컨트롤러를 테스트했는데 185MiB / s에 도달 할 수있었습니다.

따라서 Seagate ST6000AS0002 펌웨어는 큰 ATA 버스트 전송을 처리 할 수 ​​없습니다. ATA 표준은 최대 65.536 개의 논리 블록을 허용하며 이는 32MiB와 같습니다.

SMR-싱글 자기 기록

쓰기 성능이 나빠질 가능성이있는 또 다른 가능성은 Seagate가 이러한 보관 장치에서 사용 하는 단일 자기 기록 기술 일 수 있습니다. 분명히, 나는 FPGA 구현으로 드문 효과를 냈다.