Ядро Linux 101: Архитектура NUMA

Linux

Эта статья относится к следующим статьям и видео:

предложение

NUMA означает, что для определенного ЦП расстояние и время доступа к памяти разные. Это должно решить проблему производительности, вызванную общей шиной в многопроцессорной системе. (Это предложение может быть не строгим, не решать, а именно решать.)

Схема архитектуры NUMA

Начнем с самого простого, процессора (Примечание. Это относится к физическим процессорам, а не к ядрам. Следует отметить, что NUMA предназначена для нескольких физических процессоров, а не для нескольких ядер.), подключенный к ОЗУ по шине.

Потом появились многопроцессорные (опять же не многоядерные однопроцессорные!), если по-прежнему подключать все ЦП к ОЗУ через ШИНУ, как раньше,BUS может быть убийцей производительности. Более того, чем больше процессоров добавлено, тем выше будет потеря производительности.

Именно здесь архитектура NUMA вступает в свои права: рассматривая ЦП и соседнюю ОЗУ как узел, ЦП будет предпочтительно обращаться к ближайшей ОЗУ. В то же время процессоры имеют прямое соединение fast-lane, поэтому каждый процессор по-прежнему имеет доступ ко всем ячейкам ОЗУ (только скорость будет различаться).

На практике не обязательно занимать одну оперативную память, и может быть много комбинаций из следующего:

Краткий обзор архитектуры NUMA в Linux

Следующие операции выполняются в среде Ubuntu 18.04 на облачном сервере Alibaba.

сначала черезdmesg | grep -i numaПроверяем, поддерживает ли система numa: видно, что текущая система не поддерживает :)

Затем используйте инструмент:numactl, в состоянии пройтиapt install numactlустановить. Затем запустите:

numactl --hardware

Также есть утилита:lstopo,пройти черезapt install lstopo

lstopo --of png > server.png

Как видно из рисунка, есть узел node. Почему моя система не поддерживает numa, Linux по-прежнему объединяет все процессоры и всю оперативную память в один узел? Разве это не свободное время?

По этому поводу в книге "Понимание ядра Linux" сказано следующее:

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

Если это сервер, поддерживающий архитектуру numa, диаграмма, которую вы видите, будет выглядеть так:

Как NUMA влияет на Linux?

Когда система загрузится, аппаратное обеспечение отправит информацию numa в ОС. Если система поддерживает numa, произойдет следующее:

  • Получить информацию о конфигурации numa
  • Разделите процессоры (не ядра) на множество узлов, обычно один процессор и один узел.
  • Выделите ему память рядом с процессором.
  • Рассчитать стоимость (расстояние) связи между узлами.

Если вы просто относитесь к ЦП и памяти как к черному ящику и просто ожидаете, что они будут работать, могут произойти неожиданные вещи.

  • Каждый процесс и поток наследует политику numa, которая определяет, какие процессоры (даже те ядра) могут использоваться, какая память может использоваться, а также степень применения политики, т. е. является ли она только предпочтительной или обязательной.
  • Каждый поток назначается «приоритетному» узлу для запуска, поток может выполняться в другом месте (если это разрешено политикой), но операционная система будет пытаться разрешить ему работать на приоритетном узле.
  • Выделение памяти: по умолчанию память выделяется из того же узла.
  • Память, выделенная на одном узле, не будет перемещена на другие узлы.

Приведенные выше два абзаца переведены с:блог. Подождите. US/2010/09/28/…, если есть непонятное место, пожалуйста, перейдите к исходному тексту.

Посмотрите на экземпляр MySQL

Качественный и хороший текст, способные учащиеся лучше всего читают исходный текст напрямую:блог. Подождите. US/2010/09/28/…Я просто переведу это здесь.

В статье упоминается проблема: при запуске службы MySQL на сервере Linux с 64-гигабайтной памятью и двумя 4-ядерными процессорами MySQL настроен с 48-гигабайтным буферным пулом innodb. Затем я обнаружил, что, хотя в системе по-прежнему много бесплатного контента, много памяти было выгружено.

Это приводит к огромной проблеме с производительностью, потому что при запросе требуемый контент выгружается. . Его нужно загрузить снова. Это также проблема, которая долгое время преследовала сообщество MySQL.

Как упоминалось ранее, в Linux есть политика numa, которой можно управлять вручную.

  • —localalloc, использовать текущий узел по умолчанию.
  • --preferred=node, указанный узел используется первым, и можно использовать другие узлы.
  • --membind=nodes, всегда используйте искусственное указание одного или нескольких узлов.
  • --interleaved=all, используя алгоритм циклического перебора для поочередного использования разных узлов.

С точки зрения ОС Linux база данных MySQL — это процесс, и она будет иметь приоритет для запуска в узле. Если вы используете только небольшой объем памяти, это нормально, но когда вы хотите использовать большую часть системной памяти, возникает проблема:

Поскольку os попытается разрешить вам работать на «приоритетном» узле, это приведет к неравномерному распределению памяти:

Node0 почти заполнен, а Node1 еще много осталось. Поскольку node0 и node1 независимы, хотя в node1 есть свободная память, память в node0 все равно будет выгружена. Это является источником вышеупомянутой проблемы.

Итак, как решить эту проблему?

numactl --interleave all command

с вышеупомянутым--interleave allnuma policy, добавить этот абзац вmysqld_saveперед заявлением. После этого выделение памяти равномерное, и когда памяти будет достаточно, она не появится.аномальныйЯвление подкачки исчезло.

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

в заключении

Закон Мура не работает, когда производительность ЦП всегда будет иметь свой предел, будущее за многопроцессорностью. Как идеальный каменщик, вы должны как минимум больше знать об архитектуре многопроцессорной системы. Как разработчик системного программного обеспечения вы должны быть лучше знакомы с многопроцессорной архитектурой, чтобы разрабатываемые вами приложения могли в полной мере использовать преимущества аппаратного обеспечения.

Время рекламы, приглашаю всех обратить внимание на мой публичный аккаунт WeChat. При этом эта статья синхронизирована с github:GitHub.com/Ляо Чанцзи…