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

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

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

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

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

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


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

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

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

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

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

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

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

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
03.07.2013, 23:36
    #38319733
Вопрос по VirtualAllocEx, VirtualAllocExNuma
вопросециспользовать из другого узла,

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
03.07.2013, 23:42
    #38319739
вопросец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по VirtualAllocEx, VirtualAllocExNuma
использовать из другого узла,

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

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

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

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
04.07.2013, 00:40
    #38319767
вопросец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по VirtualAllocEx, VirtualAllocExNuma
[quot использовать из другого узла]вопросец
А какой профит думаете получить от понимания, как внутри с NUMA работает MS SQL Server? Исходный код то закрытый и его не изменишь :)

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

хз, в доке пространно написано, знать бы что конкретно делает VirtualAllocExNuma и как выглядят структуры ОС касающиеся памяти в случае NUMA. Можно было бы прикинуть... У Руссиновича и Соломона в книжке тоже вскользь написано. Мол стараемся структуры размазывать по узлам памяти и т. п.. а как оно в деталях не описуют.
...
Рейтинг: 0 / 0
04.07.2013, 00:58
    #38319779
вопросец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по VirtualAllocEx, VirtualAllocExNuma
Вот из доки 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
04.07.2013, 02:04
    #38319809
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по VirtualAllocEx, VirtualAllocExNuma
вопросецВот из доки 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
04.07.2013, 03:23
    #38319820
вопросец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по VirtualAllocEx, VirtualAllocExNuma
Anatoly Moskovsky,

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

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


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