dpdk mempool выделяет больше, чем нужно - PullRequest
1 голос
/ 19 июня 2019

У меня есть приложение linux, которое использует dpdk mempools.Я пытаюсь выделить mempool 8000000 объектами по 24 байта.При работе без MEMPOOL_F_NO_CACHE_ALIGN в создании mempool было выделено 1688 мегабайт оперативной памяти, что примерно в 10 раз больше, чем необходимо.Когда я добавил MEMPOOL_F_NO_CACHE_ALIGN, он был уменьшен до 512 мегабайт, что также более чем вдвое больше, чем необходимо.Как я могу уменьшить это?

1 Ответ

1 голос
/ 19 июня 2019

К сожалению, вы мало что можете сделать.Каждый объект пула памяти имеет заголовок, который имеет указатели на:

  1. Следующий объект.
  2. Пул памяти, к которому принадлежит объект.
  3. IO / физический адрес.

См .: http://doc.dpdk.org/api/structrte__mempool__objhdr.html

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

Если нам не важен физический адрес и т. Д., И все, что нам нужно, - это иметь возможностьЭффективно сохраняйте эти 24 байта, мы почти используем кольцевой буфер ( rte_ring ) с плоским массивом маленьких объектов.В этом случае накладные расходы составят ~ 8 байт на объект.

Производительность будет ниже, поскольку в пуле памяти реализован внутренний кэш для каждого ядра.

Если это все еще слишком много, вам следует изучить другие структуры данных, не относящиеся к DPDK.

Или хранить группы объектов.Скажем, 100 объектов на ведро уменьшат накладные расходы примерно в 100 раз.

...