Disco de baixo nível i / o no linux

2

Um programa de nível de usuário pode efetuar E / S em nível de página ou bloco em SSDs?

Eu olhei para dispositivos de disco, mas não tenho certeza se eles fornecem isso como eles funcionam apenas se a partição tiver um sistema de arquivos.

UPDATE # 1

Eu quero escrever um armazenamento de valor chave de alto desempenho para SSDs e, portanto, preciso fazer um acesso de baixo nível (incluindo leitura, gravação e exclusão).

Eu sei que minha abordagem deve ser no nível do kernel, mas antes disso eu quero testá-la no espaço do usuário (evitando a complexidade de aprender a programação no nível do kernel).

    
por user1065734 02.06.2014 / 09:56

3 respostas

2

Você pode fazer E / S de disco de baixo nível em qualquer tipo de armazenamento por meio do dispositivo de bloco , algo como /dev/sda (para um disco inteiro) ou /dev/sda1 (para uma partição) no Linux. Isso ignora completamente o sistema de arquivos.

Se você implementar seu próprio armazenamento de valor-chave, garanto que o que você criará será significativamente mais lento e mais buggy do que sistemas de arquivos e bancos de dados escritos por profissionais. Um mecanismo de armazenamento eficiente precisa levar em conta coisas como cache, gravações simultâneas, resiliência a falhas de energia, etc. Isso é muito difícil!

    
por 04.06.2014 / 03:29
1

Eu não acho que a otimização de E / S nesse nível possa ser realizada por um programa do usuário (sem falar da mecânica de otimização necessária para isso). Portanto, minha abordagem seria otimizar o processo diretamente no aplicativo, implementando algo como uma fila que libera seu conteúdo para a saída desejada quando ultrapassar um limite de dados estabelecido. Um pseudocódigo pode ter esta aparência:

MAX_OBJS=100

M[100]=new M[100]

function saveObj(obj) {
    if (M.size > MAX_OBJS-1) {
        outputStream.appendArrayToBinary(M)
        M = new M[100]
    }

    M.add(obj)
}

while (true) {
    saveObj( new Obj )
}

Como você pode ver, ele teria um buffer de 100 objetos. Assim que o objeto 101 for tentado a ser salvo , ele grava no disco os outros 100 e limpa o buffer para deixar espaço para outros 100 objetos. É claro que você pode implementar técnicas mais complexas, como executar a gravação em outro thread e bloquear o array para que outros objetos não sejam adicionados até que seja feito gravando os objetos no disco e limpando o buffer. Ou algo assim.

    
por 02.06.2014 / 10:42
1

Eu já indiquei em uma questão diferente sua porque você deve se abster de uma abordagem no nível do kernel.

Antes de se envolver em tal empreendimento, alguns pontos devem ser esclarecidos:

"Alto desempenho" não é uma propriedade de tamanho único.

A otimização deve ser realizada para casos específicos e somente quando você detectar o principal gargalo.

Você deve se fazer as seguintes perguntas:

  • Eu avaliei as atuais implementações tradicionais de sistemas de armazenamento de valores-chave? Se não, por que não?
  • Se eu fiz, por que eles não são adequados para o meu caso de uso? Eu realizei benchmarking e testes extensivos? Eu tracei o gargalo principal? Posso corrigi-lo nas atuais implementações de última geração? Se não, por que eu acho que posso consertar isso na minha própria implementação?
  • Quais são os meus requisitos exatos de desempenho? Eu defini "performance" e encontrei maneiras de medi-lo? Alto desempenho durante operações de armazenamento? Alto desempenho durante operações de recuperação? Alto desempenho sob alta carga devido ao grande número de conexões de clientes?

Quando você tiver uma ideia clara do que exatamente deseja alcançar, e depois de rejeitar o software de última geração atual, só então deverá começar a explorar possíveis estratégias de implementação.

O kernel é o último lugar que você deseja tocar. Especialmente se você não tiver experiência prévia em desenvolvimento de kernel. A maioria dos subsistemas do kernel é altamente otimizada por meio de processos que levaram anos de testes e desenvolvimento por engenheiros altamente qualificados.

Meu conselho seria considerar a otimização por meio de uma combinação de pré-bifurcação, cache inteligente e gravações atrasadas. Seria uma boa idéia familiarizar-se com algoritmos de cache populares, abordagens de balanceamento de carga e dar uma olhada em como as coisas funcionam sob o capô de sistemas de arquivos modernos (como readahead , Escreva políticas , LRU ) - talvez isso não esteja diretamente relacionado ao seu problema, mas ajuda a saber como as pessoas resolveram problemas de desempenho em domínios semelhantes. Naturalmente, isso não serve como um conselho para reimplementar esses recursos em seu aplicativo, pois eles já são implementados melhor pelo próprio sistema de arquivos - na maioria dos casos, isso prejudicará o desempenho de seu aplicativo em vez de aprimorá-lo.

    
por 03.06.2014 / 14:07

Tags