Idéia 1: Tente adicionar o MAP_LOCKED na sua chamada mmap, para garantir que as páginas permaneçam respaldadas por RAM real o tempo todo. Mesmo que você tenha muita RAM, ainda é possível que a parte que você precisa esteja sendo paginada por algum motivo. Como você parece ser sensível à latência, é recomendável especificar esse sinalizador, independentemente da quantidade de RAM livre em seu hardware atual.
Idéia 2: Especifique também MAP_POPULATE para garantir que as entradas da tabela de páginas sejam criadas no momento do mmap e não no tempo da falha. Embora a AFAIK, isso causaria apenas latência na falha da primeira página, e não nas falhas subseqüentes. Mas novamente uma boa prática defensiva.
Idéia 3: Usar um mapeamento compartilhado anônimo (em oposição a um arquivo real), eliminando assim o sistema de arquivos, faz com que a latência desapareça? Se isso ajudar, você sempre poderá gravar o conteúdo da região compartilhada anônima em um arquivo (talvez com uma frequência menor) de um encadeamento auxiliar.
Idéia 4: Simplesmente tente com um kernel mais novo. O kernel do Linux mudou muito desde que você fez sua pergunta.
Finalmente, como você está medindo a latência do memcpy? Você está confiante de que não está:
- Incluindo um grande atraso devido à obtenção da hora atual? Por exemplo, latência syscall, se você estiver chamando um syscall; nem
- Incluindo saltos de clock causados por correções de NTP; nem
- Incluindo latência de bloqueio (um memcpy de 2k não é atômico); nem
- Usando um método de medição de tempo cuja precisão excede sua precisão?