Как реализовать распределение страниц с чередованием в распределителе памяти с поддержкой NUMA в пользовательском режиме? - PullRequest
2 голосов
/ 21 декабря 2011

Я создаю NUMA-ориентированный распределитель памяти в пользовательском режиме для Linux. Распределитель во время своей инициализации захватывает большой кусок памяти, один кусок на узел NUMA. После этого страницы памяти, запрошенные пользователем, удовлетворяются, давая столько страниц памяти из большого пула чанков.

Если пользователь запрашивает n страниц, легко дать n страниц из определенного фрагмента. Но теперь я хочу реализовать политику распределения с чередованием, при которой пользователь получает по одной странице от каждого чанка с циклическим перебором до n страниц. Это поднимает проблему того, что виртуальные адреса этих страниц больше не являются смежными.

В1: Есть ли способ вернуть виртуально адресуемую непрерывную память? Единственное решение, которое я могу придумать, - это использование «умного» указателя, который умеет переходить с одной страницы на другую.

Одна из причин, по которой я иду по этому пути, заключается в том, что меня не устраивает политика выделения памяти MPOL_INTERLEAVE в linux, политика циклического перебора не является строгой (детерминированной).

В2. Существует ли недорогой способ узнать, какой странице и узлу NUMA сопоставлен данный диапазон виртуальных адресов? Точнее, я не знаю, как получить детальную информацию на уровне страниц из чтения / proc / / numa_maps.

Спасибо за ваши ответы.

1 Ответ

0 голосов
/ 26 ноября 2012

A1. Практически непрерывная память не означает, что физическая память является непрерывной. В Linux физические страницы не связаны с виртуальными страницами во время malloc, а скорее во время ошибки первой страницы.

Если вы действительно этого хотите, вы должны иметь возможность предварительно обработать ошибки страниц, чтобы связать их с конкретным узлом numa, чтобы создать строгое чередование с использованием политики выделения по умолчанию.

, например

N - # numa nodes
PAGES - # pages in allocation

for(i=0; i < N; i++):
   pin current thread to node i
   for(p=i; p < PAGES; p += N)
      touch page p;

После того, как вы это настроите, вы можете выложить заранее чередующиеся смежные страницы.

Q2. Вы можете определить узел numa виртуального адреса, используя move_pages из <numaif.h> и передача NULL в качестве целевого узла. Текущее местоположение узла будет в возвращаемом значении статуса.

например.

int status[1];
move_pages(0, 1, &ptr_to_check,  NULL, status, 0);
...