Добрый день. Cобственно есть огромный буфер обращение к которому вности определенный оверхэд. Решил выделить его через mmap и hugepages. Собственно все работает. Но появились неожиданно огромные потери производительности на первом обращение к этой памяти. Выделяю так:
addr = mmap(0, SIZE_DATA_RING_BUFFER , PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0);
if (addr != MAP_FAILED) {
m_DataRingBuffer = (uint8_t*) addr;
} else {
...
}
Все выглядит так, что на первом обращение система переводит hugepage из состояния reserved в выделенное состояние. До запуска программы:
HugePages_Total: 4
HugePages_Free: 3
HugePages_Rsvd: 0
HugePages_Total: 4
HugePages_Free: 3
HugePages_Rsvd: 1
HugePages_Total: 4
HugePages_Free: 2
HugePages_Rsvd: 0
Как бороться с этим оверхэдом. Попробовал сделать так, ибо потери на инициализации для меня не существенны.
addr = mmap(0, SIZE_DATA_RING_BUFFER , PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0);
if (addr != MAP_FAILED) {
m_DataRingBuffer = (uint8_t*) addr;
m_DataRingBuffer[0] = 1;
} else {
...
}