Linux에서 NCQ를 비활성화하는 방법


13

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있습니까?

3
커널 매개 변수 libata.force=noncq?
frostschutz 2016 년

감사합니다. NCQ를 완전히 비활성화하는 데 많은 도움이되었습니다. 또한 쓰기 성능 문제를 해결했습니다.
Paebbels

1
> dd if=/dev/zero of=/dev/sdb bs=32M count=32당신이 그 일을하려고했던 것을 Dunno; 그러나 그것은 것 erase둘 다 MBR 이후 블록의 gazillions를. 주 시스템이 실행중인 드라이브에서 (그리고 grub내 경우와 같이 MBR에 설치된) 드라이브 에서이 작업을 수행하는 것은 상당히 위험합니다.)이 경험이 적은 사람들이 실험하지 못하도록 여기에 의견으로 쓰겠습니다. "cool"line ...;)
syntaxerror

@syntaxerror HDD가 FPGA 보드에 연결되어 있습니다. 이러한 환경에서는 MBR 및 파일 시스템 액세스를 완벽하게 처리하는 하드웨어 루틴을 작성하는 것이 훨씬 복잡합니다. 그래서 HDD를 양면에 원시 미디어로 사용하고 있습니다. FPGA보기에서 그것은 큰 선형 메모리입니다. Linux에서는 계속 데이터를 읽고 쓰는 데 / dev / sdg 및 C 프로그램을 사용하고 있습니다.
Paebbels

@Paebbels 죄송합니다. FPGA 비트를 간과해서는 안됩니다. 글쎄, 이것은 실제로 데스크탑 PC 또는 노트북의 메인 보드 버스에 연결된 일반적인 HDD와는 완전히 다른 것입니다. ;-) "이러한 환경에서 MBR 및 파일 시스템 액세스를 완벽하게 처리하는 하드웨어 루틴을 작성하는 것은 너무 복잡합니다 . " 진실. HDL 없이는 할 수 없습니다 . 그리고 Wikipedia 코드 예제가 그것이 공원에서 완전히
걸렸다 고

답변:


11

@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 구현으로 드문 효과를 냈다.


1
내 경험상 NCQ를 비활성화하면 성능이 크게 향상됩니다. 나는 이것을 데스크탑 시스템, 서버에서 시도했다. NCQ의 이점으로 생각되는 100 % "서버"고성능 하드웨어를 사용하더라도. 아니, 그것은 단지 그것을 비활성화하는 것보다 최악입니다. IMHO NCQ는 하드 드라이브에서 발생하는 최악의 상황 중 하나입니다. 전용 RAID 카드 또는 온보드 칩셋이든 어떤 상황에서도 이점을 제공하는 것을 본 적이 없습니다.
CR.

버스트 작업이나 임의 액세스를 수행 했습니까? NCQ는 버스트 작업에는 영향을 미치지 않지만 임의 액세스를 향상시킵니다.
Paebbels

죄송하지만 내 질문에 답변하지 않았습니다. 또 다른 질문은 간단한 소비자 메인 보드 또는 워크 스테이션 / 서버 메인 보드 또는 전용 RAID 컨트롤러를 사용한 하드웨어입니다. 많은 구현은 NCQ / AHCI에서 설계 한 미해결 요청을 지원하지 않습니다.
Paebbels
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.