
Estou criando uma camada de correção em um sistema de arquivos na memória (tmpfs) para poder interceptar os comandos do sistema de arquivos e fazer processamento extra (o objetivo final é replicar as gravações na rede para tolerância a falhas). Para interceptar os comandos do sistema de arquivos, estou usando o FUSE. Para o sistema de arquivos na memória, estou usando tmpfs. Para superar o pequeno tamanho da memória, criei espaço de troca suficiente no SSD para uso do tmpfs.
Para resumir, tenho um diretório dir
montado com tmpfs. Criei outro diretório shim
, no qual todos os aplicativos gravam. O FUSE é montado shim
e redireciona todas as operações para o dir
.
Com alguns microbenchmarking com o Filebench gravando diretamente no dir
, descobri que tmpfs + swap tem latência super baixa, especialmente quando comparado ao ext4 no disco. Não há desaceleração perceptível quando o tmpfs muda da gravação na RAM para a gravação no espaço de troca, presumo que seja por causa de alguns readaheads inteligentes.
Quando eu sobreponho com FUSE compassagem_hp.c, no entanto, mesmo com o multi-threading ativado, a criação de arquivos se torna muito lenta, com latência 60x maior do que tmpfs + swap. Usando htop
, notei que ele só fica mais lento quando grava no swap em vez da memória (a memória enche muito rapidamente e o swap aumenta lentamente). Caso contrário, o próprio FUSE terá pouca sobrecarga.
Alguém sabe por que o FUSE atinge a latência ao usar swap e tmpfs por si só, e como eu otimizaria essa sobrecarga adicional?