Como (realmente) desabilitar o NCQ no Linux

13

Eu implementei meu próprio HBA (Host-Bus-Adapter) Serial-ATA em VHDL e o programou em um FPGA. Um FPGA é um chip que pode ser programado com qualquer circuito digital. Também é equipado com transceptores seriais para gerar sinais de alta velocidade para SATA ou PCIe.

Este controlador SATA suporta taxas de linha SATA de 6 Gb / s e usa comandos ATA-8 DMA-IN / OUT para transferir dados em até 32 blocos MiB de e para o dispositivo. O design está comprovado para funcionar na velocidade máxima (por exemplo, Samsung SSD 840 Pro - > acima de 550 MiB / s).

Após alguns testes com vários dispositivos SSD e HDD, comprei um novo HDD de arquivo do Seagate 6 TB ( ST6000AS0002 ). Este HDD atinge desempenho de leitura de até 190 MiB / s, , mas somente desempenho de gravação de 30 a 40 MiB / s!

Então eu cavei mais fundo e medi os quadros transmitidos (sim, isso é possível com um design FPGA). Tanto quanto eu posso dizer, o Seagate HDD está pronto para receber os primeiros 32 MiB de uma transferência em uma única peça. Essa transferência acontece na velocidade máxima da linha de 580 MiB / s. Depois disso, o HDD bloqueia os bytes restantes por mais de 800 ms! Em seguida, o HDD está pronto para receber os próximos 32 MiB e parará novamente por 800 ms. Ao todo, uma transferência de 1 GiB precisa de mais de 30 segundos, o que equivale a cerca de 35 MiB / s.

Suponho que este HDD tenha um cache de gravação de 32 MiB, que é liberado entre os ciclos de burst. Transferências de dados com menos de 32 MiB não mostram esse comportamento.

Meu controlador usa o comando DMA-IN e DMA-OUT para transferir dados. Eu não estou usando o comando QUEUED-DMA-IN e QUEUED-DMA-OUT, que são usados por controladores AHCI com capacidade NCQ. A implementação de AHCI e NCQ em uma plataforma FPGA é muito complexa e não é necessária para minha camada de aplicativo.

Eu gostaria de reproduzir este cenário no meu PC Linux, mas o driver Linux AHCI tem o NCQ habilitado por padrão. Eu preciso desativar NCQ, então eu encontrei este site descrevendo como desativar NCQ , mas não funciona.

O PC Linux ainda alcança o desempenho de gravação de 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

Eu acho que há uma falha no artigo acima: Reduzir a profundidade da fila do NCQ para 1 não desabilita o NCQ. Apenas permite que o sistema operacional use apenas uma fila. Ele ainda pode usar os comandos QUEUED-DMA - ** para a transferência. Eu preciso realmente desabilitar o NCQ para que o driver emita comandos DMA-IN / OUT para o dispositivo.

Então, aqui estão minhas perguntas:

  1. Como posso desativar o NCQ?
  2. Se a profundidade da fila NCQ = 1, o driver AHCI do Linux estiver usando os comandos QUEUED-DMA - ** ou DMA - **?
  3. Como posso verificar se o NCQ está desabilitado, porque alterar /sys/block/sdX/device/queue_depth não é reportado em dmesg ?
por Paebbels 23.06.2015 / 11:25

1 resposta

11

Graças a @frostschutz, eu pude medir o desempenho de gravação no Linux sem o recurso NCQ. O parâmetro de inicialização do kernel libata.force=noncq desativou completamente o NCQ.

Com relação ao meu problema de desempenho de gravação de 6 TB da Seagate, não houve alteração na velocidade. O Linux ainda alcança 180 MiB / s.

Mas depois tive outra ideia:
O driver do Linux não usa transferências de 32 blocos MiB. O buffer do kernel é muito menor, especialmente se o NCQ com 32 filas estiver habilitado (32 filas * 32 MiB = > 1 buffer GiB AHCI).

Então testei meu controlador SATA com 256 KiB de transferência e voilà, é possível atingir 185 MiB / s.

Então, acho que o firmware do Seagate ST6000AS0002 não é capaz de lidar com grandes transferências de burst ATA. O padrão ATA permite até 65.536 blocos lógicos, o que equivale a 32 MiB.

SMR - Gravação Magnética Shingled

Outra possibilidade para o desempenho de gravação ruim pode ser a técnica de gravação magnética com estilhaçamento , que é usada pela Seagate nesses arquivamentos dispositivos. Obviamente, eu provoquei um efeito raro com minha implementação FPGA.

    
por 23.06.2015 / 14:34