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를 실제로 비활성화해야합니다.
내 질문은 다음과 같습니다.
- NCQ를 비활성화하려면 어떻게해야합니까?
- NCQ 대기열 깊이가 1 인 경우 Linux의 AHCI 드라이버가 QUEUED-DMA-** 또는 DMA-** 명령을 사용합니까?
- 변경 사항
/sys/block/sdX/device/queue_depth
이보고되지 않기 때문에 NCQ가 비활성화되어 있는지 어떻게 확인할 수dmesg
있습니까?
> dd if=/dev/zero of=/dev/sdb bs=32M count=32
당신이 그 일을하려고했던 것을 Dunno; 그러나 그것은 것 erase
둘 다 MBR 이후 블록의 gazillions를. 주 시스템이 실행중인 드라이브에서 (그리고 grub
내 경우와 같이 MBR에 설치된) 드라이브 에서이 작업을 수행하는 것은 상당히 위험합니다.)이 경험이 적은 사람들이 실험하지 못하도록 여기에 의견으로 쓰겠습니다. "cool"line ...;)
libata.force=noncq
?