Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вопрос по VirtualAllocEx, VirtualAllocExNuma
|
|||
|---|---|---|---|
|
#18+
Я правильно понял VirtualAllocEx вернет ошибку, если все доступное user-mode процессу адресное пространство исчерпано или нет непрерывного куска нужной длины, так? А что в случае с железкой NUMA и VirtualAllocExNuma? Есть несколько узлов процессоров и памяти. С одной стороны есть локальная память для узлов процессоров, с другой стороны она доступна всем другим процессорам в других узлах. Память всех узлов образует непрерывное физическое адресное пространство. VirtualAllocExNuma позволяет выделить виртуальную память, с повозможности привязкой к физической памяти заданного узла. Я не пойму, пусть у нас 3 узла с такой емкостью физической памяти памяти 2 Gb, 4 Gb, 8 Gb. Виртуальное адресное пространство условно делится пропорционально этим обьемам на регионы? И функция VirtualAllocExNuma пытается сначала выделить виртуальный регион из диапазона виртуальных адресов, соответствующих переданному ей номеру NUMA узла и если из этого виртуального региона не может выбрать непрерывный кусок заданной длины, то лезет в виртуальные регионы "близких" физически узлов? Как оно на самом деле? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 14:39 |
|
||
|
Вопрос по VirtualAllocEx, VirtualAllocExNuma
|
|||
|---|---|---|---|
|
#18+
вопросец, Виртуальные адреса к NUMA не имеют никакого отношения. Физические имеют. Поэтому адресное пространство не делится пропорционально памяти в узлах. Просто выделяются произвольно расположенные виртуальные блоки, которые отражаются в необходимые физические адреса памяти запрошенного узла. Кстати VirtualAllocExNuma собственно выделяет не физическую память, а виртуальную память и помечает что она относится к заданному узлу. А при первом обращении к ней уже выделяется физическая память. Поэтому вы можете выделять ею намного больше чем доступно физ. памяти не только на одном узле, но и вообще в системе. Это уже делает предположение о каком-либо разбиении виртуального адресного пространства с учетом NUMA невыполнимым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 16:16 |
|
||
|
Вопрос по VirtualAllocEx, VirtualAllocExNuma
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyКстати VirtualAllocExNuma собственно выделяет не физическую память, а виртуальную память и помечает что она относится к заданному узлу . А что значит "она относится к заданному узлу", и что будет если начать её использовать из другого узла? Anatoly MoskovskyА при первом обращении к ней уже выделяется физическая память. Поэтому вы можете выделять ею намного больше чем доступно физ. памяти не только на одном узле, но и вообще в системе. А например когда такое поведение может понадобиться и зачем выделять памяти больше чем её есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 21:05 |
|
||
|
Вопрос по VirtualAllocEx, VirtualAllocExNuma
|
|||
|---|---|---|---|
|
#18+
использовать из другого узлаА что значит "она относится к заданному узлу", и что будет если начать её использовать из другого узла? Это значит "при попытке обратиться к странице с любого узла - выделить ее на заданном" :) использовать из другого узлаА например когда такое поведение может понадобиться и зачем выделять памяти больше чем её есть? Мало ли когда. Я вообще писал что это возможно, а не что так и надо делать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 21:40 |
|
||
|
Вопрос по VirtualAllocEx, VirtualAllocExNuma
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyиспользовать из другого узлаА что значит "она относится к заданному узлу", и что будет если начать её использовать из другого узла? Это значит "при попытке обратиться к странице с любого узла - выделить ее на заданном" :) А если на выделенном узле нет столько физической памяти? :) Anatoly Moskovskyиспользовать из другого узлаА например когда такое поведение может понадобиться и зачем выделять памяти больше чем её есть? Мало ли когда. Я вообще писал что это возможно, а не что так и надо делать :) Да я как бы не претензии высказываю, а узнать хочу :) В каких случаях вообще предпочтителен VirtualAlloc и в чем его плюсы или где про это прочитать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 21:48 |
|
||
|
Вопрос по VirtualAllocEx, VirtualAllocExNuma
|
|||
|---|---|---|---|
|
#18+
использовать из другого узла, прочтите доку по VirtualAllocExNuma - там написано что будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 21:53 |
|
||
|
Вопрос по VirtualAllocEx, VirtualAllocExNuma
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, Колупаю кишки. Можно несколько вопросов? Для каждого NUMA узла система ведет свою PFN database? При обращении к странице через invalid pte, получается page fault, по номеру NUMA узла определяется требуемая PFN database, и из нее выделяются физические страницы? Где хранится привязка виртуальных адресов к номеру узла, на физ. память которого они будут мапиться (имеется ввиду номер узла, передаваемый в VirtualAllocExNuma)? В VAD? Когда VirtualAllocExNuma не сможет сделать reserver/commit в пределах NODE и вернет virtual range привязанный к другому узлу NUMA или ошибку? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 23:19 |
|
||
|
Вопрос по VirtualAllocEx, VirtualAllocExNuma
|
|||
|---|---|---|---|
|
#18+
использовать из другого узла, VirtualAllocXXX предпочтителен, когда вам нужен большой кусок памяти, но всю ее вы сразу использовать не планируете. Скажем выделили диапазон виртуальных адресов (reserve), это влияет только на AVL-дерево в узлах которого находятся VAD. Как понял у каждого процесса свой. Операция быстрая. По мере надобности, можно делать commit отдельных страниц выделенного ранее диапазона и тогда при обращении по виртуальному адресу начнет работать механизм CR3->PageDirectoryEntry-->PageTableEntry--(тут при page fault подкачка)-->PhysicalPage->PageOffset Грубо говоря даже после commit, как я понял память сразу не выделяется, а выделяется on demand при обработке page fault. Приложения, например СУБД. Я оттуда и пришел. Разбираюсь с SQL Memory Manager'ом. А он весь NUMA-aware... и свое барахло пилит через Numa-функции... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 23:28 |
|
||
|
Вопрос по VirtualAllocEx, VirtualAllocExNuma
|
|||
|---|---|---|---|
|
#18+
вопросециспользовать из другого узла, 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 для последней? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 23:36 |
|
||
|
Вопрос по VirtualAllocEx, VirtualAllocExNuma
|
|||
|---|---|---|---|
|
#18+
использовать из другого узла, по идее так должно быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 23:42 |
|
||
|
Вопрос по VirtualAllocEx, VirtualAllocExNuma
|
|||
|---|---|---|---|
|
#18+
использовать из другого узла, Кстати, оно в этой цепочке 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 23:53 |
|
||
|
Вопрос по VirtualAllocEx, VirtualAllocExNuma
|
|||
|---|---|---|---|
|
#18+
вопросецКогда VirtualAllocExNuma не сможет сделать reserver/commit в пределах NODE и вернет virtual range привязанный к другому узлу NUMA или ошибку? Логично, что вернет ошибку. Т.к. даже если не хватает физической памяти на узле, то остальное просто засвопится. А уж чтоб нельзя было засвопить - это уже критическая ошибка. А выделиться виртуальная память привязанная к двум узлам или размещенная часть на одном, а часть на другом по идее не может? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 00:13 |
|
||
|
Вопрос по VirtualAllocEx, VirtualAllocExNuma
|
|||
|---|---|---|---|
|
#18+
вопросеца "выделение памяти из другого нума узла" нажно, когда тебе необходимо контролировать, что конкретно вот это множество потоков должно оставаться в пределах процессоров данного узла и работать по возможности с памятью этого узла и не обращаться к памяти других узлов из-за дороговизны операции и т. п... я с этой хренью разбирался 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? Исходный код то закрытый и его не изменишь :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 00:16 |
|
||
|
Вопрос по VirtualAllocEx, VirtualAllocExNuma
|
|||
|---|---|---|---|
|
#18+
[quot использовать из другого узла]вопросец А какой профит думаете получить от понимания, как внутри с NUMA работает MS SQL Server? Исходный код то закрытый и его не изменишь :) а вот бывает так, что по ряду причин, SQL Server выделяет в каждый логический NUMA-узел памяти Foreign Memory (с другого физического узла). от того может быть просадка производительности (воркеры (threads/fibbers) будут обращаться через interconnect к другим физическим узлам памяти, это дорого). соответственно разбираюсь, чтоы понимать причины по которым это происходит ну и влиять насколько возможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 00:40 |
|
||
|
Вопрос по VirtualAllocEx, VirtualAllocExNuma
|
|||
|---|---|---|---|
|
#18+
использовать из другого узлавопросецКогда VirtualAllocExNuma не сможет сделать reserver/commit в пределах NODE и вернет virtual range привязанный к другому узлу NUMA или ошибку? Логично, что вернет ошибку. Т.к. даже если не хватает физической памяти на узле, то остальное просто засвопится. А уж чтоб нельзя было засвопить - это уже критическая ошибка. А выделиться виртуальная память привязанная к двум узлам или размещенная часть на одном, а часть на другом по идее не может? хз, в доке пространно написано, знать бы что конкретно делает VirtualAllocExNuma и как выглядят структуры ОС касающиеся памяти в случае NUMA. Можно было бы прикинуть... У Руссиновича и Соломона в книжке тоже вскользь написано. Мол стараемся структуры размазывать по узлам памяти и т. п.. а как оно в деталях не описуют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 00:45 |
|
||
|
Вопрос по VirtualAllocEx, VirtualAllocExNuma
|
|||
|---|---|---|---|
|
#18+
Вот из доки VirtualAllocExNuma Код: sql 1. мне кажется эта функция VirtualAllocExNuma влияет только на VAD, а при реальном выдилении памяти (обработке page fault) по VAD определяется номер узла и если там в PFN db есть свободные Physical Pages, то система их выделяет, если нет то тупо берет и смотрит в порядке "близости" другие NUMA узлы и их PFN db где свободное место есть и выделяет страницы из первого ближайшего такого узла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 00:58 |
|
||
|
Вопрос по VirtualAllocEx, VirtualAllocExNuma
|
|||
|---|---|---|---|
|
#18+
вопросецВот из доки VirtualAllocExNuma Код: sql 1. 2. мне кажется эта функция VirtualAllocExNuma влияет только на VAD, а при реальном выдилении памяти (обработке page fault) по VAD определяется номер узла и если там в PFN db есть свободные Physical Pages, то система их выделяет, если нет то тупо берет и смотрит в порядке "близости" другие NUMA узлы и их PFN db где свободное место есть и выделяет страницы из первого ближайшего такого узла. А почему вам кажется, есть так прямо в доке и написано? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 02:04 |
|
||
|
Вопрос по VirtualAllocEx, VirtualAllocExNuma
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, имел ввиду, что нума-версия функции пишет номер узла в соответствующий диапазону vad. в доке не видел честно говоря. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 03:23 |
|
||
|
Вопрос по VirtualAllocEx, VirtualAllocExNuma
|
|||
|---|---|---|---|
|
#18+
вопросецимел ввиду, что нума-версия функции пишет номер узла в соответствующий диапазону vad. в доке не видел честно говоря. А какая разница как это внутри устроено? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 03:32 |
|
||
|
Вопрос по VirtualAllocEx, VirtualAllocExNuma
|
|||
|---|---|---|---|
|
#18+
Кстати, а кто-нибудь использует кастомный аллокатор class virtual_allocator; через VirtualAlloc, для std::vector<char, virtual_allocator> vec;? Чтобы зарезервировать сразу несколько гигабайт виртуальной памяти, при этом не тратя физическую память: vec.resize(1024*1024*1024 * 4); Плюс в том, что при vec.resize(N); не понадобиться: выделять новую память, копировать старые объекты в новую память и удалять старую память. И есть ли какие-то его аналоги в POSIX(*nix)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2013, 13:32 |
|
||
|
|

start [/forum/topic.php?fid=57&tid=2020103]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
76ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
| others: | 278ms |
| total: | 448ms |

| 0 / 0 |
