A opção nº 2 é provavelmente o motivo. O Dedup executa melhor quando a tabela de dedução (DDT) se ajusta totalmente na memória. Caso contrário, transbordará para o disco, e as pesquisas de DDT que precisam ir para o disco são muito lentas e isso produz o comportamento de bloqueio.
Eu acho que 30G de RAM é suficiente, mas o tamanho do DDT depende diretamente da quantidade de dados sendo deduzidos e de como a dedup funciona nos dados. A propriedade de dedução é definida no nível do conjunto de dados, mas as pesquisas são feitas em todo o pool, portanto, há apenas um DDT de todo o pool.
Veja este tópico do zfs-discuss sobre como calcular o tamanho do DDT. Essencialmente, é uma entrada DDT por bloco único no conjunto, portanto, se você tiver uma grande quantidade de dados, mas uma baixa taxa de desclassificação, isso significa mais blocos únicos e, portanto, um DDT maior. O sistema tenta manter o DDT na RAM, mas parte dele pode ser despejada se a memória for necessária para os aplicativos. Ter cache L2ARC pode ajudar a impedir que o DDT vá para os discos do pool principal, pois ele será despejado da memória principal (ARC) para o L2ARC.