17.1.23

Размер стека IA64

По материалам статьи Slava Oks: Be Aware: IA64 Stack Size


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


В течение последних нескольких недель ко мне обращались наши тестеры и служба поддержки с вопросом о том, сколько потоков они должны указать в конфигурации SQL Server на платформе IA64 с 4 Гб оперативной памяти. Например, они спрашивали, будет ли приемлемо установить число потоков равным 1024?
Вероятно, Вы знаете, что SQL Server ограничивает верхний предел размеров своих стеков. Причиной, почему мы так сделали, является то, что это позволяет избежать неожиданных сбоев сервера при недостатке физической памяти, и если при этом компьютер ещё и задействовал весь возможный объём файла подкачки, после чего процесс может деактивироваться без какой либо регистрации этого факта в системе. Причиной такого нештатного поведения могла бы стать попытка процесса увеличить размер своего стека. Как любой серьёзный серверный продукт, SQL Server не может себе позволить такое поведение.
Конфигурация SQL Server на платформе IA64 предполагает использование стека размером в 2 Мб. Вы можете проверить это, анализируя заголовок образа SQL Server. Действительно ли он закрепляет за потоком такую большую часть памяти? Ответ - нет. На платформе IA64 существует две части стека - регулярный стек и стек поддержки хранилища. Поддержка хранилища - размещение движком СУБД потока для регистров процессора. Оно используется процессором для регистраторов потока к памяти, когда возникает ситуация, что больше нет доступных регистров.
Когда процесс устанавливает размер закреплённого за ним стека в 2 Мб, Windows закрепляет 2 Мб для регулярного стека и столько же для поддержки хранилища. Следовательно, каждый поток закрепляет 4 Мб оперативной памяти (если только Вы указали резервированию в Windows резервировать так много, но без закрепления). На рисунке 1 показано как в действительности выглядит стек потока на платформе IA64.

----------------------0x00000000000200000 | | 2 Мб | Стек | . | / \ | | | | | | ----------------------0x00000000000400000 | 2 Мб | Поддержка хранилища | | | | | | | | \ / | . ----------------------0x00000000000600000 Рис. 1.

Я хотел бы подчеркнуть несколько интересных моментов. Первый и них, это то, что Windows резервирует непрерывный участок VAS размером 4 Мб и для стека и для поддержки хранилища. Второй момент, это то, что разделение участка на две области осуществляется таким образом, чтобы стек и поддержка хранилища могли расти независимо.
Теперь мы дошли до того места, когда можно ответить на заданный в начале вопрос о том, сколько физической памяти будут потреблять 1024 потока. Ответ: 4 Мб * 1024 = 4 Гб. Полагая, что max server memory в SQL Server отражает только размер Буферного пула и обычно его настраивают так, чтобы бы он был близок к объёму физической памяти компьютера, в такой конфигурации SQL Server может работать очень плохо. Это может реально удивить многих. Максимальное количество потоков, которое стоит задать SQL Server, зависит от типа используемого приложения, и в данном случае оно определенно должно быть меньше 1024. Даже число потоков равное 512 может оказаться слишком большим.
Эта статься была бы неполной, если бы я так или иначе не упомянул переполнение стека. Поддержка хранилища работает со стеков IA64 не так, как на других платформах и переполнение стека не исключение. Операционная система должна реагировать на переполнение стека, как регулярного, так и поддержки хранилища. Удивлены! Для Вас это означает, что Вы должны быть осторожны при восстановлении от последствий переполнения стека, особенно если Вы на свой страх и риск восстанавливаете защиту страниц вручную. Но это уже другая, большая история.
Я надеюсь, что Вы узнали из этой статьи что-то новое и жду комментариев.

Комментариев нет:

Отправить комментарий