What is the relationship between number of buffers and ring size?
Eles são relacionados, mas independentes. O rx "ring" refere-se a um conjunto de buffers na memória que são usados como uma fila para passar pacotes de rede de entrada do host (hipervisor) para o guest (VM do Windows). A memória é reservada no convidado pelo driver de rede e é mapeada na memória do host.
À medida que novos pacotes de rede chegam ao host, eles são colocados no próximo buffer disponível no anel. Em seguida, o host aciona um IRQ no convidado, para o qual o driver convidado responde retirando o pacote do pacote e enviando-o para a pilha de rede do sistema operacional convidado, que presumivelmente o envia ao aplicativo convidado para recebê-lo. Assumindo que os pacotes estão chegando devagar o suficiente, e o driver convidado está processando-os com rapidez suficiente, sempre deve haver um slot livre no anel. No entanto, se os pacotes estão chegando muito rápido, ou o convidado está processando-os muito lentamente, o anel pode ficar cheio e os pacotes podem ser descartados (como você viu na sua situação).
Aumentar o tamanho do anel pode ajudar a atenuar esse problema. Se você aumentá-lo, mais slots estarão disponíveis no ringue por vez. Isso segue para a segunda configuração, "Small Rx Buffers", que é a quantidade total de buffers disponíveis que podem ser usados para preencher os slots no anel. É preciso haver pelo menos tantos buffers quanto slots no anel. Normalmente você quer mais. Quando o convidado retira um buffer do anel para dar à pilha de rede do convidado, ele pode nem sempre ser imediatamente devolvido ao motorista. Se isso acontecer, ter buffers de reposição para preencher o anel significa que você pode ir mais longe sem perder pacotes.
O Rx Ring # 1 / Small Rx Buffers são usados para quadros não-jumbo. Se você tem uma configuração de NIC padrão, esse é o único anel que será usado.
How does one calculate the amount of memory used for given values of these settings?
Supondo que você esteja falando de quadros não-jumbo, cada buffer precisa ser grande o suficiente para armazenar um pacote de rede inteiro, aproximadamente 1.5kb. Então, se você tem 8192 buffers disponíveis, isso usaria 12MB. Um anel maior também usará mais memória, mas os descritores são pequenos (bytes), então são realmente os buffers que você precisa se preocupar.
Because these settings are on the NIC itself within the guest OS, I assume they are driver settings. This makes me think that the RAM used might be paged or non-paged pool.
Sim, é um pool não paginado. Se os buffers de anel fossem paginados, provavelmente resultaria em pacotes descartados enquanto os buffers estavam sendo paginados novamente.
Are there concerns I'm not taking into account here?
Não tenho certeza se isso é relevante para sua situação, mas pode ser interessante notar que um anel maior aumentará o espaço ocupado pelo cache do caminho de rede rx. Em microbenchmarks, você verá que um anel maior geralmente prejudica o desempenho. Dito isso, em aplicativos da vida real, se um pacote for descartado, isso geralmente é maior do que um pequeno ganho de desempenho em rajadas de velocidade.
Fonte: Eu trabalhei na VMware.