Quão bem as gravações simultâneas são dimensionadas com io_uring?

Quão bem as gravações simultâneas são dimensionadas com io_uring?

Fundo:Estou muito intrigado com os ganhos potenciais de desempenho do io_uring, mas não tenho familiaridade suficiente com C, o kernel do Linux ou o funcionamento interno dos dispositivos de bloco para implementar benchmarks significativos. Não estou procurando números concretos, apenas uma visão geral da arquitetura que informará minha pesquisa contínua.


Imagine que eu tenho um programa que anexa repetidamente lotes de dez números inteiros de 4 bytes a um arquivo e depois o sincroniza. Quero mudar para um modelo em que acrescento cada número inteiro do lote ao seu próprio arquivo. Ou seja: escreverei um único int de 4 bytes em cada um dos 10 arquivos e sincronizarei todos eles.

Usando E/S síncrona, o esquema original usa 2 syscalls (1 gravação + 1 sincronização), e a abordagem int por arquivo usa impressionantes 20 (10 gravações + 10 sincronizações). Em termos de syscalls, a io_uringeconomia seria enorme: posso conseguir o equivalente a 20 syscalls com um único io_uringenvio. O que não está claro para mim é como odescansardo maquinário Linux writeserá dimensionado assim que o envio ocorrer.

  • A maioria dos discos tem algum suporte de hardware para gravações paralelas? Ou talvez os SSDs funcionem, mas os discos giratórios não?
  • As gravações são canalizadas (pelo barramento?) para o disco para que o kernel não precise esperar por uma resposta de ida e volta para cada uma?
  • O próprio kernel acaba enfileirando todas as syscalls solicitadas via io_uring?
  • Existem outros gargalos que não considerei?

Pode muito bem ser que meu modelo mental esteja errado. Qualquer indicação é muito apreciada!

Responder1

A maioria dos discos tem algum suporte de hardware para gravações paralelas? Ou talvez os SSDs funcionem, mas os discos giratórios não?

Quase todos os discos funcionam, independentemente de estarem girando ou em estado sólido (mesmo os discos giratórios têm caches, portanto, para pequenas quantidades de dados, eles podem parecer não muito lentos). Chaves USB ou cartões SD baratos alcançarão uma simultaneidade ruim, mas também haverá algum nível de paralelismo... Em termos de comandos paralelos máximos para um único dispositivo, o SATA pode ter até 32, o SCSI tende a variar de 10 a 100, O NVMe pode chegar a 1000 (acho que as especificações limitam você a um máximo de 65536, mas não conheço nenhum dispositivo que chegue tão alto ainda).

As gravações são canalizadas (pelo barramento?) para o disco para que o kernel não precise esperar por uma resposta de ida e volta para cada uma?

Sim, várias gravações (ou leituras) podem ser enviadas em paralelo. No entanto, se isso acontecerá depende de muitas coisas (por exemplo, o kernel pode agrupá-los para maior eficiência, a sincronização pode ser necessária para que a fila tenha que ser drenada, etc.)

O próprio kernel acaba enfileirando todas as syscalls solicitadas via io_uring?

Talvez. io_uringcompletará a E/S em linha se não bloquear, caso contrário, entrará na fila. DeIO eficiente com io_uring: "Mais importante ainda, para operações que não serão bloqueadas, os dados serão servidos em linha".

Existem outros gargalos que não considerei?

Sim. Também não está claro se você está realizando E/S suficiente por segundo para realmente ver o benefício de algo como io_uring... Além disso, sincronizações frequentes provavelmente limitarão o paralelismo dependendo da frequência e de como estão sendo feitas. Se você estiver executando E/S em buffer, o kernel está eliminando o paralelismo mesmo no síncrono, porque você está gravando na RAM, então o kernel se desestabiliza da RAM em paralelo, sempre que possível. (Observe que os itens anteriores não são uma lista exaustiva)

(Pergunta do título)

Quão bem as gravações simultâneas são dimensionadas com io_uring?

OK, muito bem, dependendo de qual kernel você está usando e como você está enviando a E/S. Veja as referências e links nesteresposta para "Não há realmente nenhuma E/S de bloco assíncrona no Linux?".

Referências

informação relacionada