powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос по VirtualAllocEx, VirtualAllocExNuma
20 сообщений из 20, страница 1 из 1
Вопрос по VirtualAllocEx, VirtualAllocExNuma
    #38318818
вопросец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я правильно понял VirtualAllocEx вернет ошибку, если все доступное user-mode процессу адресное пространство исчерпано или нет непрерывного куска нужной длины, так?

А что в случае с железкой NUMA и VirtualAllocExNuma? Есть несколько узлов процессоров и памяти. С одной стороны есть локальная память для узлов процессоров, с другой стороны она доступна всем другим процессорам в других узлах. Память всех узлов образует непрерывное физическое адресное пространство.

VirtualAllocExNuma позволяет выделить виртуальную память, с повозможности привязкой к физической памяти заданного узла. Я не пойму, пусть у нас 3 узла с такой емкостью физической памяти памяти 2 Gb, 4 Gb, 8 Gb. Виртуальное адресное пространство условно делится пропорционально этим обьемам на регионы? И функция VirtualAllocExNuma пытается сначала выделить виртуальный регион из диапазона виртуальных адресов, соответствующих переданному ей номеру NUMA узла и если из этого виртуального региона не может выбрать непрерывный кусок заданной длины, то лезет в виртуальные регионы "близких" физически узлов?

Как оно на самом деле?
...
Рейтинг: 0 / 0
Вопрос по VirtualAllocEx, VirtualAllocExNuma
    #38319070
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопросец,

Виртуальные адреса к NUMA не имеют никакого отношения. Физические имеют.
Поэтому адресное пространство не делится пропорционально памяти в узлах.
Просто выделяются произвольно расположенные виртуальные блоки, которые отражаются в необходимые физические адреса памяти запрошенного узла.
Кстати VirtualAllocExNuma собственно выделяет не физическую память, а виртуальную память и помечает что она относится к заданному узлу. А при первом обращении к ней уже выделяется физическая память.
Поэтому вы можете выделять ею намного больше чем доступно физ. памяти не только на одном узле, но и вообще в системе. Это уже делает предположение о каком-либо разбиении виртуального адресного пространства с учетом NUMA невыполнимым.
...
Рейтинг: 0 / 0
Вопрос по VirtualAllocEx, VirtualAllocExNuma
    #38319609
Anatoly MoskovskyКстати VirtualAllocExNuma собственно выделяет не физическую память, а виртуальную память и помечает что она относится к заданному узлу .
А что значит "она относится к заданному узлу", и что будет если начать её использовать из другого узла?

Anatoly MoskovskyА при первом обращении к ней уже выделяется физическая память.
Поэтому вы можете выделять ею намного больше чем доступно физ. памяти не только на одном узле, но и вообще в системе.
А например когда такое поведение может понадобиться и зачем выделять памяти больше чем её есть?
...
Рейтинг: 0 / 0
Вопрос по VirtualAllocEx, VirtualAllocExNuma
    #38319640
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
использовать из другого узлаА что значит "она относится к заданному узлу", и что будет если начать её использовать из другого узла?
Это значит "при попытке обратиться к странице с любого узла - выделить ее на заданном" :)


использовать из другого узлаА например когда такое поведение может понадобиться и зачем выделять памяти больше чем её есть?
Мало ли когда. Я вообще писал что это возможно, а не что так и надо делать :)
...
Рейтинг: 0 / 0
Вопрос по VirtualAllocEx, VirtualAllocExNuma
    #38319648
Anatoly Moskovskyиспользовать из другого узлаА что значит "она относится к заданному узлу", и что будет если начать её использовать из другого узла?
Это значит "при попытке обратиться к странице с любого узла - выделить ее на заданном" :)
А если на выделенном узле нет столько физической памяти? :)

Anatoly Moskovskyиспользовать из другого узлаА например когда такое поведение может понадобиться и зачем выделять памяти больше чем её есть?
Мало ли когда. Я вообще писал что это возможно, а не что так и надо делать :)
Да я как бы не претензии высказываю, а узнать хочу :) В каких случаях вообще предпочтителен VirtualAlloc и в чем его плюсы или где про это прочитать?
...
Рейтинг: 0 / 0
Вопрос по VirtualAllocEx, VirtualAllocExNuma
    #38319654
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
использовать из другого узла,

прочтите доку по VirtualAllocExNuma - там написано что будет.
...
Рейтинг: 0 / 0
Вопрос по VirtualAllocEx, VirtualAllocExNuma
    #38319720
вопросец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

Колупаю кишки. Можно несколько вопросов?

Для каждого NUMA узла система ведет свою PFN database? При обращении к странице через invalid pte, получается page fault, по номеру NUMA узла определяется требуемая PFN database, и из нее выделяются физические страницы?

Где хранится привязка виртуальных адресов к номеру узла, на физ. память которого они будут мапиться (имеется ввиду номер узла, передаваемый в VirtualAllocExNuma)? В VAD?

Когда VirtualAllocExNuma не сможет сделать reserver/commit в пределах NODE и вернет virtual range привязанный к другому узлу NUMA или ошибку?
...
Рейтинг: 0 / 0
Вопрос по VirtualAllocEx, VirtualAllocExNuma
    #38319729
вопросец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
использовать из другого узла,

VirtualAllocXXX предпочтителен, когда вам нужен большой кусок памяти, но всю ее вы сразу использовать не планируете. Скажем выделили диапазон виртуальных адресов (reserve), это влияет только на AVL-дерево в узлах которого находятся VAD. Как понял у каждого процесса свой. Операция быстрая. По мере надобности, можно делать commit отдельных страниц выделенного ранее диапазона и тогда при обращении по виртуальному адресу начнет работать механизм

CR3->PageDirectoryEntry-->PageTableEntry--(тут при page fault подкачка)-->PhysicalPage->PageOffset

Грубо говоря даже после commit, как я понял память сразу не выделяется, а выделяется on demand при обработке page fault.

Приложения, например СУБД. Я оттуда и пришел. Разбираюсь с SQL Memory Manager'ом. А он весь NUMA-aware... и свое барахло пилит через Numa-функции...
...
Рейтинг: 0 / 0
Вопрос по VirtualAllocEx, VirtualAllocExNuma
    #38319733
вопросециспользовать из другого узла,

VirtualAllocXXX предпочтителен, когда вам нужен большой кусок памяти, но всю ее вы сразу использовать не планируете. Скажем выделили диапазон виртуальных адресов (reserve), это влияет только на AVL-дерево в узлах которого находятся VAD. Как понял у каждого процесса свой. Операция быстрая. По мере надобности, можно делать commit отдельных страниц выделенного ранее диапазона и тогда при обращении по виртуальному адресу начнет работать механизм

CR3->PageDirectoryEntry-->PageTableEntry--(тут при page fault подкачка)-->PhysicalPage->PageOffset

Грубо говоря даже после commit, как я понял память сразу не выделяется, а выделяется on demand при обработке page fault.

Приложения, например СУБД. Я оттуда и пришел. Разбираюсь с SQL Memory Manager'ом. А он весь NUMA-aware... и свое барахло пилит через Numa-функции...
Т.е. например написали свой class virtual_allocator; через VirtualAlloc, использовали его в std::vector<char, virtual_allocator> vec, и сделали vec.resize(1024*1024*1024 * 4); - т.е. 4 GB.
Затем записали в первый и последний элемент что-то: *vec.begin() = 10; *vec.rbegin() = 20;
И реально при этом выделилось только 8KB физической памяти, 4KB для первой страницы и 4KB для последней?
...
Рейтинг: 0 / 0
Вопрос по VirtualAllocEx, VirtualAllocExNuma
    #38319739
вопросец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
использовать из другого узла,

по идее так должно быть.
...
Рейтинг: 0 / 0
Вопрос по VirtualAllocEx, VirtualAllocExNuma
    #38319751
вопросец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
использовать из другого узла,

Кстати, оно в этой цепочке

CR3->PageDirectoryEntry-->PageTableEntry--(тут при page fault подкачка)-->PhysicalPage->PageOffset

динамически выделит даже страницы для Page Table, если такой страницы не существует. Windows старается минимизировать накладные расходы на поддержку internal-структур...

---

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

http://blogs.msdn.com/b/psssql/archive/2010/02/23/how-it-works-sql-server-2008-numa-and-foreign-pages.aspx

более менее картина прояснилась. только не понятно это 14519541
...
Рейтинг: 0 / 0
Вопрос по VirtualAllocEx, VirtualAllocExNuma
    #38319756
вопросецКогда VirtualAllocExNuma не сможет сделать reserver/commit в пределах NODE и вернет virtual range привязанный к другому узлу NUMA или ошибку?
Логично, что вернет ошибку. Т.к. даже если не хватает физической памяти на узле, то остальное просто засвопится. А уж чтоб нельзя было засвопить - это уже критическая ошибка.
А выделиться виртуальная память привязанная к двум узлам или размещенная часть на одном, а часть на другом по идее не может?
...
Рейтинг: 0 / 0
Вопрос по VirtualAllocEx, VirtualAllocExNuma
    #38319758
вопросеца "выделение памяти из другого нума узла" нажно, когда тебе необходимо контролировать, что конкретно вот это множество потоков должно оставаться в пределах процессоров данного узла и работать по возможности с памятью этого узла и не обращаться к памяти других узлов из-за дороговизны операции и т. п... я с этой хренью разбирался

http://blogs.msdn.com/b/psssql/archive/2010/02/23/how-it-works-sql-server-2008-numa-and-foreign-pages.aspx
Ну это понятно, для уменьшения задержки, потоки привязываются к ядрам узла, и используют память привязанную к этому же узлу.

А какой профит думаете получить от понимания, как внутри с NUMA работает MS SQL Server? Исходный код то закрытый и его не изменишь :)
...
Рейтинг: 0 / 0
Вопрос по VirtualAllocEx, VirtualAllocExNuma
    #38319767
вопросец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot использовать из другого узла]вопросец
А какой профит думаете получить от понимания, как внутри с NUMA работает MS SQL Server? Исходный код то закрытый и его не изменишь :)

а вот бывает так, что по ряду причин, SQL Server выделяет в каждый логический NUMA-узел памяти Foreign Memory (с другого физического узла). от того может быть просадка производительности (воркеры (threads/fibbers) будут обращаться через interconnect к другим физическим узлам памяти, это дорого). соответственно разбираюсь, чтоы понимать причины по которым это происходит ну и влиять насколько возможно.
...
Рейтинг: 0 / 0
Вопрос по VirtualAllocEx, VirtualAllocExNuma
    #38319768
вопросец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
использовать из другого узлавопросецКогда VirtualAllocExNuma не сможет сделать reserver/commit в пределах NODE и вернет virtual range привязанный к другому узлу NUMA или ошибку?
Логично, что вернет ошибку. Т.к. даже если не хватает физической памяти на узле, то остальное просто засвопится. А уж чтоб нельзя было засвопить - это уже критическая ошибка.
А выделиться виртуальная память привязанная к двум узлам или размещенная часть на одном, а часть на другом по идее не может?

хз, в доке пространно написано, знать бы что конкретно делает VirtualAllocExNuma и как выглядят структуры ОС касающиеся памяти в случае NUMA. Можно было бы прикинуть... У Руссиновича и Соломона в книжке тоже вскользь написано. Мол стараемся структуры размазывать по узлам памяти и т. п.. а как оно в деталях не описуют.
...
Рейтинг: 0 / 0
Вопрос по VirtualAllocEx, VirtualAllocExNuma
    #38319779
вопросец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот из доки VirtualAllocExNuma

Код: sql
1.
The physical pages are allocated on demand. If the preferred node runs out of pages, the memory manager will use pages from other nodes. If the memory is paged out, the same process is used when it is brought back in.



мне кажется эта функция VirtualAllocExNuma влияет только на VAD, а при реальном выдилении памяти (обработке page fault) по VAD определяется номер узла и если там в PFN db есть свободные Physical Pages, то система их выделяет, если нет то тупо берет и смотрит в порядке "близости" другие NUMA узлы и их PFN db где свободное место есть и выделяет страницы из первого ближайшего такого узла.
...
Рейтинг: 0 / 0
Вопрос по VirtualAllocEx, VirtualAllocExNuma
    #38319809
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопросецВот из доки VirtualAllocExNuma

Код: sql
1.
2.
The physical pages are allocated on demand. If the preferred node runs out of pages, the memory manager 
will use pages from other nodes. If the memory is paged out, the same process is used when it is brought back in.




мне кажется эта функция VirtualAllocExNuma влияет только на VAD, а при реальном выдилении памяти (обработке page fault) по VAD определяется номер узла и если там в PFN db есть свободные Physical Pages, то система их выделяет, если нет то тупо берет и смотрит в порядке "близости" другие NUMA узлы и их PFN db где свободное место есть и выделяет страницы из первого ближайшего такого узла.
А почему вам кажется, есть так прямо в доке и написано? :)
...
Рейтинг: 0 / 0
Вопрос по VirtualAllocEx, VirtualAllocExNuma
    #38319820
вопросец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

имел ввиду, что нума-версия функции пишет номер узла в соответствующий диапазону vad. в доке не видел честно говоря.
...
Рейтинг: 0 / 0
Вопрос по VirtualAllocEx, VirtualAllocExNuma
    #38319821
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопросецимел ввиду, что нума-версия функции пишет номер узла в соответствующий диапазону vad. в доке не видел честно говоря.
А какая разница как это внутри устроено?
...
Рейтинг: 0 / 0
Вопрос по VirtualAllocEx, VirtualAllocExNuma
    #38325463
Кстати, а кто-нибудь использует кастомный аллокатор class virtual_allocator; через VirtualAlloc, для std::vector<char, virtual_allocator> vec;?
Чтобы зарезервировать сразу несколько гигабайт виртуальной памяти, при этом не тратя физическую память: vec.resize(1024*1024*1024 * 4);
Плюс в том, что при vec.resize(N); не понадобиться: выделять новую память, копировать старые объекты в новую память и удалять старую память.

И есть ли какие-то его аналоги в POSIX(*nix)?
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос по VirtualAllocEx, VirtualAllocExNuma
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]