NCQ
1. 개요
NCQ(Native Command Queuing)는 하드 디스크 드라이브의 성능을 향상시키는 기술이다. PATA 및 SCSI의 TCQ(Tagged Command Queuing)에서 파생되었으며, 최대 32개의 명령을 큐에 저장하여 헤드 움직임을 최적화한다. NCQ는 SATA 호스트 버스 어댑터와 하드 드라이브에서 지원되어야 하며, 운영 체제에서 적절한 드라이버가 로드되어야 한다. AHCI를 지원하는 최신 칩셋을 통해 운영 체제가 NCQ를 제어할 수 있으며, Windows, Linux, FreeBSD 등 다양한 운영 체제에서 지원된다. NCQ는 I/O 부하가 많은 환경에서 성능을 향상시키지만, 낮은 I/O 부하에서는 성능 저하를 유발할 수 있으며, I/O 스케줄러를 방해하여 성능을 저하시키는 경우도 있다. SSD에서도 사용되며, NVMe 표준은 SSD에 최적화된 명령 대기열을 지원한다.
-
직렬 ATA -
M.2
M.2는 와이파이, 블루투스, SSD 등을 통합하는 폼 팩터로, SATA 3.2 사양에 따라 표준화되었으며, 다양한 크기의 모듈을 지원하고, mSATA의 후속 규격이다. -
직렬 ATA -
고급 호스트 컨트롤러 인터페이스
고급 호스트 컨트롤러 인터페이스(AHCI)는 직렬 ATA(SATA) 장치와 시스템 간 통신을 담당하는 인터페이스로, 병렬 ATA(PATA)의 한계를 극복하고 더 높은 데이터 전송 속도와 향상된 효율성, 핫 플러그 및 NCQ와 같은 고급 기능을 제공한다. -
컴퓨터 버스 -
NMEA 0183
NMEA 0183은 선박용 GPS, 자동식별장치(AIS) 등 항해 장비에서 데이터를 송수신하는 데 사용되는 ASCII 기반의 직렬 통신 프로토콜로, RS-422 전기 표준을 사용하며, 문장 형태의 데이터를 통해 정보를 전달하고, 물리 계층, 데이터 링크 계층, 애플리케이션 계층의 3가지 레이어로 구성되어 다양한 소프트웨어에서 지원된다. -
컴퓨터 버스 -
인피니밴드
인피니밴드는 고성능 컴퓨팅 환경에서 서버, 스토리지, 네트워크 장치 간 고속 데이터 전송을 위한 직렬 통신 기술로, 슈퍼컴퓨터나 데이터 센터에서 주로 사용되지만 이더넷 기반 기술과의 경쟁 및 새로운 컴퓨팅 환경에 대한 적응이라는 과제를 안고 있다. -
기억 장치 -
EPROM
EPROM은 자외선을 사용하여 내용을 지울 수 있는 읽기 전용 메모리이며, MOSFET의 부유 게이트를 사용하여 데이터를 저장하고, 펌웨어 업데이트가 용이하여 소량 생산에 사용되었으나 EEPROM과 플래시 메모리에 의해 대체되었다. -
기억 장치 -
정적 램
정적 램(SRAM)은 전원이 공급되는 동안 데이터를 저장하며, 갱신 회로가 필요 없고 빠른 접근 속도를 가지는 휘발성 메모리 유형이다.
2.1. PATA TCQ의 한계
병렬 ATA의 태그 명령 큐잉(TCQ)은 ATA 호스트 버스 어댑터가 운영 체제와 상호 작용하기 위해 ISA 버스 장치 프로토콜을 사용해야 한다는 요구 사항 때문에 제약을 받았다. 그 결과 CPU 오버헤드가 높아지고 성능 향상이 미미하여 ATA TCQ는 시장에서 성공하지 못했다.
2.2. NCQ의 등장
병렬 ATA의 태그 명령 큐잉(TCQ)보다 네이티브 명령 큐잉(NCQ)이 먼저 나왔다. ATA가 TCQ를 통합하려는 시도는 ATA 호스트 버스 어댑터가 운영 체제와 상호 작용하기 위해 ISA 버스 장치 프로토콜을 사용해야 한다는 요구 사항 때문에 제약을 받았다. 그 결과, 높은 CPU 오버헤드와 미미한 성능 향상으로 인해 ATA TCQ는 시장에서 받아들여지지 않았다.
NCQ는 TCQ와 달리 각 명령의 중요도가 동일하지만, NCQ의 호스트 버스 어댑터는 CPU가 제공한 자체 DMA 엔진을 명령 시퀀스 동안 CPU가 제공한 DMA 매개변수로 프로그래밍한다. 반면 TCQ는 명령 쿼리 동안 CPU를 인터럽트하고 ATA 호스트 버스 어댑터의 타사 DMA 엔진을 조정해야 한다. NCQ의 구현이 선호되는 이유는 드라이브가 성능 특성에 대한 보다 정확한 지식을 갖고 회전 위치를 고려할 수 있기 때문이다. NCQ와 TCQ는 모두 최대 32개의 대기 명령 큐 길이를 갖는다. ATA TCQ는 거의 사용되지 않기 때문에 병렬 ATA(및 일부 칩셋의 IDE 모드)는 일반적으로 포트당 하나의 대기 명령만 지원한다.
NCQ를 사용하려면 SATA 호스트 버스 어댑터와 하드 드라이브 자체에서 지원하고 활성화해야 한다. 호스트 버스 어댑터에서 NCQ를 활성화하려면 적절한 드라이버가 운영 체제에 로드되어야 한다.
2.3. 운영체제 지원
많은 최신 칩셋은 고급 호스트 컨트롤러 인터페이스(AHCI)를 지원하여 운영 체제가 이를 보편적으로 제어하고 NCQ를 활성화할 수 있다. DragonFly BSD는 2009년 2.3부터 NCQ를 사용하여 AHCI를 지원했고, 리눅스 커널은 버전 2.6.19부터, FreeBSD는 버전 8.0부터 AHCI를 기본적으로 지원한다. Windows Vista 및 Windows 7도 기본적으로 AHCI를 지원하지만, 컨트롤러 지원이 초기 설치 중에 없었던 경우 레지스트리 편집을 통해 AHCI 지원(msahci 서비스를 통해)을 수동으로 활성화해야 한다. Windows 7의 AHCI는 NCQ뿐만 아니라 SSD 드라이브에서 TRIM 지원도 활성화한다(해당 펌웨어 포함). Windows XP와 같은 이전 운영 체제는 AHCI가 호스트 버스 어댑터에 존재하더라도 벤더별 드라이버를 설치해야 한다(RAID 또는 SCSI 컨트롤러를 설치하는 것과 유사). 이로 인해 초기 설정이 더 번거로워지고, 대부분의 컨트롤러가 포트를 혼합 AHCI-SATA/IDE/레거시 모드로 작동할 수 없기 때문에 기존 설치를 변환하기가 상대적으로 어렵다.
3. 원리
NCQ는 I/O 요청을 큐에 보관하고, 전체 헤드의 움직임을 최소화하는 최적의 경로로 재배열하여 실행한다. 최대 큐 길이는 32개 명령어이다(실제로 이용되는 것은 31개).
4.1. 성능
NCQ는 많은 I/O 수의 부하에서는 성능에 상당히 긍정적인 효과가 있다. 그러나 순수 대역폭에 손해를 보며 개인용 컴퓨터 수준의 낮은 I/O 수의 부하에서는 성능이 떨어지는 경우가 많아서 기본적으로 사용하지 않는 경우가 많다.
2004년 초창기 NCQ 드라이브(Seagate 7200.7 NCQ)를 대상으로 한 테스트 결과, NCQ가 IOMeter 성능은 향상시켰지만, 데스크톱 애플리케이션 성능은 감소하는 것으로 나타났다. 2010년의 한 리뷰에서는 일련의 윈도우 멀티태스킹 테스트에서 NCQ를 활성화했을 때 평균 9% 정도의 성능 향상이 있었다.
NCQ는 운영 체제의 I/O 스케줄러를 부정적으로 방해하여 성능을 저하시킬 수 있다. 이는 리눅스의 RAID-5 환경에서 실제로 관찰되었다. NCQ에는 호스트가 I/O에 대한 마감 시간을 지정할 수 있는 메커니즘이 없으며, 다른 요청을 우선하기 위해 요청을 무시할 수 있는 횟수도 지정할 수 없다. 이론적으로, 대기열에 있는 요청은 I/O 부하가 걸린 상태에서 다른 (아마도 새로운) 요청을 처리하는 동안 드라이브에 의해 임의의 시간 동안 지연될 수 있다. NCQ 디스패치 순서를 위해 드라이브 펌웨어 내부에서 사용되는 알고리즘은 일반적으로 공개되지 않으므로, 이는 하드웨어/펌웨어 성능에 대한 또 다른 수준의 불확실성을 도입한다. 2008년경 구글에서 실시한 테스트에 따르면 NCQ는 I/O를 최대 1~2초 동안 지연시킬 수 있다. 제안된 해결 방법은 운영 체제가 낮은 대기 시간 애플리케이션을 적시에 충족시키기 위해 NCQ 큐를 인위적으로 더 빨리 기아 상태로 만드는 것이다.
2007년경의 웨스턴 디지털 랩터(WD Raptor)와 같은 일부 드라이브 펌웨어에서는 NCQ가 활성화되면 리드-어헤드가 비활성화되어 순차적 성능이 저하된다.
SATA 솔리드 스테이트 드라이브는 병렬 워크로드를 위해 여러 명령을 큐에 넣을 수 있다는 이점을 크게 누린다. PCIe 기반 NVMe SSD의 경우, 큐 깊이가 최대 65,535개의 큐와 각 큐당 최대 65,535개의 명령을 지원하도록 더욱 증가했다.
4.2. I/O 스케줄러와의 간섭
NCQ는 운영 체제의 I/O 스케줄러를 방해하여 성능을 저하시킬 수 있다. 이는 리눅스의 RAID-5 환경에서 실제로 관찰되었다. NCQ에는 호스트가 I/O에 대한 마감 시간을 지정하거나, 다른 요청을 우선하기 위해 요청을 무시할 수 있는 횟수를 지정하는 메커니즘이 없다. 이론적으로, 대기열에 있는 요청은 I/O 부하가 걸린 상태에서 다른 (아마도 새로운) 요청을 처리하는 동안 드라이브에 의해 임의의 시간 동안 지연될 수 있다. NCQ 디스패치 순서를 위해 드라이브 펌웨어 내부에서 사용되는 알고리즘은 일반적으로 공개되지 않으므로, 이는 하드웨어/펌웨어 성능에 대한 또 다른 수준의 불확실성을 도입한다. 2008년경 구글에서 실시한 테스트에 따르면 NCQ는 I/O를 최대 1~2초 동안 지연시킬 수 있다. 제안된 해결 방법은 운영 체제가 낮은 대기 시간 애플리케이션을 적시에 충족시키기 위해 NCQ 큐를 인위적으로 더 빨리 기아 상태로 만드는 것이다.
4.3. 안전성 (FUA)
NCQ의 덜 알려진 기능 중 하나는 ATA TCQ의 전신과 달리, 호스트가 데이터가 디스크의 플래터에 도달했을 때 알림을 받을지, 아니면 디스크의 버퍼(온보드 캐시)에 도달했을 때 알림을 받을지를 지정할 수 있다는 것이다. 올바른 하드웨어 구현을 가정하면, 이 기능을 통해 디스크의 온보드 캐시가 fsync와 같은 시스템 호출과 함께 사용될 때 데이터 일관성을 보장할 수 있다. SCSI에서 차용한 관련 쓰기 플래그는 강제 유닛 접근 (FUA)이라고 한다.
5. 솔리드 스테이트 드라이브 (SSD)
NCQ는 솔리드 스테이트 드라이브(SSD)에서도 사용된다. 인텔 X25-E 익스트림 SSD는 NCQ를 통해 호스트 시스템이 CPU 작업을 처리하는 동안 드라이브가 명령을 처리하도록 돕는다. SSD 컨트롤러는 장치 내부 구조에 따라 명령을 동시에 또는 부분적으로 완료할 수 있다.
5.1. NVMe
NVM 익스프레스(NVMe) 표준은 SSD에 최적화된 형태의 명령 대기열을 지원한다. NVMe는 단일 컨트롤러 및 장치에 대해 여러 개의 대기열을 허용하며, 각 대기열에 대해 훨씬 더 높은 수준의 깊이를 허용하여 기본 SSD 하드웨어 작동 방식에 더 가깝게 일치시킨다.