Como (realmente) desativar o NCQ no Linux

13

Eu implementei meu próprio HBA (Serial-ATA Host-Bus-Adapter) em VHDL e o programa 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. É comprovado que o design funciona 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 de 6 TB da Seagate ( ST6000AS0002 ). Este HDD atinge até 190 MiB / s de desempenho de leitura, mas apenas 30 a 40 MiB / s de desempenho de gravação!

Então, eu cavei mais fundo e medi os quadros transmitidos (sim, isso é possível com um design FPGA). Pelo que sei, o Seagate HDD está pronto para receber os primeiros 32 MiB de uma transferência em uma única peça. Essa transferência ocorre na velocidade máxima da linha de 580 MiB / s. Depois disso, o HDD interrompe os bytes restantes por mais de 800 ms! O HDD está pronto para receber os próximos 32 MiB e pára 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. As transferências de dados com menos de 32 MiB não mostram esse comportamento.

Meu controlador usa os comandos DMA-IN e DMA-OUT para transferir dados. Não estou usando os comandos QUEUED-DMA-IN e QUEUED-DMA-OUT, que são usados ​​pelos controladores AHCI compatíveis com NCQ. A implementação do AHCI e do NCQ em uma plataforma FPGA é muito complexa e não é necessária para a minha camada de aplicação.

Gostaria de reproduzir esse cenário no meu PC Linux, mas o driver AHCI do Linux tem o NCQ ativado por padrão. Preciso desabilitar o NCQ, por isso encontrei este site descrevendo como desabilitar o NCQ , mas ele não funciona.

O PC Linux ainda atinge 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

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

Então, aqui estão as minhas questões:

  1. Como posso desativar o NCQ?
  2. Se profundidade da fila NCQ = 1, o driver AHCI do Linux está usando os comandos QUEUED-DMA - ** ou DMA - **?
  3. Como posso verificar se o NCQ está desativado, porque as alterações /sys/block/sdX/device/queue_depthnão são relatadas dmesg?
Paebbels
fonte
3
parâmetro do kernel libata.force=noncq?
Frostschutz 23/06
Obrigado, isso ajudou muito, para desativar completamente o NCQ. Também resolvi o problema de desempenho de gravação.
Paebbels
1
> dd if=/dev/zero of=/dev/sdb bs=32M count=32Não sei o que você pretendia fazer com isso; mas será eraseo MBR e bilhões de blocos além. Fazer isso em uma unidade com o sistema principal em execução (e grubinstalado no MBR, como no meu caso) seria bastante perigoso;) Pensei em escrever isso aqui como um comentário, para impedir que pessoas menos experientes experimentem sua linha "legal" ...;)
syntaxerror 12/08
@syntaxerror O HDD está conectado a uma placa FPGA. Nesse ambiente, é muito complexo escrever rotinas de hardware que lidam perfeitamente com MBRs e acessos ao sistema de arquivos. Então, eu estou usando o HDD como mídia bruta nos dois lados. Na visão do FPGA, é uma grande memória linear. No Linux, estou usando / dev / sdg e um programa C para ler e gravar os dados contínuos.
Paebbels 12/08/2015
@Paebbels Ops, eu não deveria ter esquecido o bit FPGA. Bem, isso é algo completamente diferente dos nossos HDDs comuns conectados a barramentos de placas-mãe de PCs ou notebooks ;-) "Nesse ambiente, é muito complexo escrever rotinas de hardware que lidam perfeitamente com MBRs e acessos ao sistema de arquivos" . Verdade. Você não será capaz de passar sem um HDL . E eu posso imaginar que a programação tal coisa não é para os fracos de coração ... mesmo que o exemplo de código Wikipedia sugere que é uma caminhada absoluta no parque ;-)
SyntaxError

Respostas:

11

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

Em relação ao meu problema de desempenho de gravação do Seagate de 6 TB, não houve alteração na velocidade. O Linux ainda atinge 180 MiB / s.

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

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

Portanto, acho que o firmware da 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 com Telhas

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

Paebbels
fonte
1
Na minha experiência, desabilitar o NCQ dá um grande impulso no desempenho. Eu tentei isso em sistemas de desktop, servidores, o nome dele. Mesmo usando 100% de hardware de alto desempenho "servidor" que você pensaria se beneficiaria do NCQ. Não, é tudo pior do que apenas desativá-lo. O IMHO NCQ é uma das piores coisas que acontecem nos discos rígidos. Nunca vi um benefício em nenhuma circunstância, seja cartão RAID dedicado ou chipset on-board.
CR.
Você já fez operações de rajada ou acesso aleatório? O NCQ não tem impacto nas operações de intermitência, mas melhora o acesso aleatório.
Paebbels 01/01
Desculpe, mas você não respondeu minha pergunta. Outra pergunta é: qual hardware você usou uma placa principal simples de consumidor ou uma estação principal de trabalho / servidor ou um controlador RAID dedicado. Muitas implementações não suportam tantas solicitações pendentes quanto as projetadas pelo NCQ / AHCI.
Paebbels