LINUX.ORG.RU

Снизить оверхэд на первом обращение к hugepage

 , ,


1

3

Добрый день. 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
После запуска, после mmap, но до первой операции чтения/записи
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 {
          ...
}
И это вроде помогло, но есть сомнения в корректности такого способа. Есть ли корректное решение проблемы?

★★★★★

Последнее исправление: Dudraug (всего исправлений: 5)

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.