По материалам статьи Slava Oks:
Configuring SQL Server 2005 for Soft NUMA
Перевод: Александра Гладченко
Недавно, в статье
http://blogs.msdn.com/slavao/articles/441058.aspx я рассмотрел вопросы обеспечения
поддержки NUMA на программном уровне. На этой неделе один из наших клиентов столкнулся
с интересной проблемой. Клиенту необходимо было балансировать загрузку процессоров в
рамках одного экземпляра SQL Server. Приложение клиента было гетерогенным. Часть запросов
этого приложения была схожа с запросами эталонного теста TPCH, а другая часть предназначена
для загрузки данных. В распоряжении клиента имеется NUMA система, с 2 узлами по четыре
процессора в каждом. Клиент хотел оставить под загрузку данных два процессора, а остальные
процессоры предоставить для исполнения запросов. Возможно ли это реализовать?
Как Вы могли догадаться, ответ на это вопрос - использовать программную поддержку NUMA
в SQL Server 2005. Мы порекомендовали им настроить SQL Server и клиентские компьютеры
так, чтобы реализовать систему из трёх NUMA узлов. (Удивленны? Да, это действительно
можно сделать, используя программную поддержку NUMA в SQL Server 2005). Конфигурация
имела бы следующий вид: нулевой узел имеет четыре процессора, первый узел имеет два
процессора, и последний узел имеет оставшиеся два процессора. Имейте в виду, когда
Вы настраиваете программную поддержку NUMA в SQL Server, программное представление
узла не должно выходить за рамки реальных узлов, то есть, программный узел не может
охватывать несколько реальных NUMA узлов. Клиенты с TPCH запросами настраивались таки
образом, чтобы они подключались к нулевому и первому узлам, а приложение загрузки данных
настраивалось для работы с последним узлом. После того, как необходимые настройки были
выполнены и система была запущена в эксплуатацию, оказалось, что она заработала, как
и ожидалось - нагрузка разного типа разносилась на разные процессоры. Важно заметить,
что клиент был полностью удовлетворён и восхищен результатом. Ниже приведён пример
узла и его конфигурации сети, предложенные нами клиенту:
Конфигурация узлов по привязке к процессорам (affinity).
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node0]
"CPUMask"=dword:0000000F
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node1]
"CPUMask"=dword:00000030
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node2]
"CPUMask"=dword:000000C0
|
Конфигурация сети, обеспечивающая назначение узлам портов.
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp\IPAll]
"TcpPort"="1433[0x3],2000[0x4]"
"TcpDynamicPorts"=""
"DisplayName"="Any IP Address"
|
Эта конфигурация заставляет SQL Server слушать на двух портах. Один порт обслуживает
два узла. Это означает, что отношение узла к портам может быть один ко многим.
Имейте в виду, что в квадратных скобках Вы определяете affinity узлов, а не
процессоров, то есть 3 в этом случае означает, что порт 1433 будет принимать запросы
для процессов узлов 0 и 1.
Когда порт назначен нескольким узлам, это означает, что подключения к этим узлам
будут осуществляться циклически.
После внесения изменений в системный реестр, сервер должен быть перезапущен для вступления
изменений в силу. Кроме того, клиенты должны быть настроены для подключения к соответствующим
портам. В нашем случае клиенты с TPCH нагрузкой должны быть направлены на порт 1433,
а приложение загрузки данных на порт 2000.
SQL Server 2005 поддерживает и более сложную конфигурацию программного NUMA. Ниже
представлена информация, которая наряду с примером, была предоставлена мне нашей
группой поддержки производительности; она описывает, как настроить SQL Server 2005
для поддержки программного NUMA в общем случае. Пожалуйста, обратите внимание, что
фактически Вы можете привязать какой-нибудь NIC к узлу.
Здесь показаны ключи с их значениями по умолчанию, в которых Вы должны изменить
значение TcpPort.
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp\IPAll]
"TcpPort"=""
"TcpDynamicPorts"=""
"DisplayName"="Any IP Address"
|
Таким образом, если нужны 3 порта (2000,2001,1433) на сервере с четырьмя узлами, и
так, что бы подключения к порту 2000 обслуживались узлами 0 и 1, подключения к порту
2001 обслуживались узлами 2 и 3, а подключения к порту 1433 обслуживались всеми узлами;
используйте следующую установку:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp\IPAll]
"TcpPort"="2000[0x3],2001[0xc],1433"
|
Как видно, значения в квадратных скобках, это маски узлов, но не маски процессоров.
Упоминавшийся выше ключ реестра позволяет всем имеющимся в системе NIC слушать на всех
перечисленных выше портах. Далее, вместо этих установок, если мы хотим управлять
подключениями к нескольким сетевым адаптерам, т.е. балансируя нагрузку на разные NIC,
мы должны создать зеркальную копию этого ключа.
На основе ключа:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp]
"ListenOnAllIPs"=dword:00000001
Создаём ключ:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp]
"ListenOnAllIPs"=dword:00000000
|
И потом, если мы имеем в системе два NIC, помимо адаптера - заглушки, нам понадобятся
ещё два ключа, которые представлены ниже. Обратите внимание, что последняя часть ключа
"IP3" зависит от номера NIC.
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp\IP2]
"Enabled"=dword:00000001
"Active"=dword:00000001
"TcpPort"="2000[0x3],1433"
"TcpDynamicPorts"=""
"DisplayName"="Specific IP Address"
"IpAddress"="10.192.168.01"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp\IP3]
"Enabled"=dword:00000001
"Active"=dword:00000001
"TcpPort"="2001[0xc],1433"
"TcpDynamicPorts"=""
"DisplayName"="Specific IP Address"
"IpAddress"="10.192.168.02"
|
Это означает, что слушать порт 2000 будет только адаптер с адресом 10.192.168.01 и
он будет передавать подключения с порта 2000 только на узлы 0 и 1. Подобно ему, ведёт
себя и порт 2001.
Ниже представлена конфигурации, которая заставляет восьми процессорную систему с двумя
узлами вести себя как система с восьмью узлами. Предполагается, что в системе имеются
восемь сетевых адаптеров.
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp]
"Enabled"=dword:00000001
"ListenOnAllIPs"=dword:00000000
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp\IPAll]
"TcpPort"=""
"TcpDynamicPorts"="2001[0x1],2002[0x2],2003[0x4],2004[0x8],2005[0x10],2006[0x20],2007[0x40],2008[0x80]"
"DisplayName"="Any IP Address"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp\IP3]
"Enabled"=dword:00000001
"Active"=dword:00000001
"TcpPort"="2001[0x1]"
"TcpDynamicPorts"=""
"DisplayName"="Specific IP Address"
"IpAddress"="10.192.168.01"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp\IP4]
"Enabled"=dword:00000001
"Active"=dword:00000001
"TcpPort"="2002[0x2]"
"TcpDynamicPorts"=""
"DisplayName"="Specific IP Address"
"IpAddress"="10.192.168.02"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp\IP5]
"Enabled"=dword:00000001
"Active"=dword:00000001
"TcpPort"="2003[0x4]"
"TcpDynamicPorts"=""
"DisplayName"="Specific IP Address"
"IpAddress"="10.192.168.03"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp\IP6]
"Enabled"=dword:00000001
"Active"=dword:00000001
"TcpPort"="2004[0x8]"
"TcpDynamicPorts"=""
"DisplayName"="Specific IP Address"
"IpAddress"="10.192.168.04"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp\IP7]
"Enabled"=dword:00000001
"Active"=dword:00000001
"TcpPort"="2005[0x10]"
"TcpDynamicPorts"=""
"DisplayName"="Specific IP Address"
"IpAddress"="10.192.168.05"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp\IP8]
"Enabled"=dword:00000001
"Active"=dword:00000001
"TcpPort"="2006[0x20]"
"TcpDynamicPorts"=""
"DisplayName"="Specific IP Address"
"IpAddress"="10.192.168.06"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp\IP9]
"Enabled"=dword:00000001
"Active"=dword:00000001
"TcpPort"="2007[0x40]"
"TcpDynamicPorts"=""
"DisplayName"="Specific IP Address"
"IpAddress"="10.192.168.07"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp\IP10]
"Enabled"=dword:00000001
"Active"=dword:00000001
"TcpPort"="2008[0x80]"
"TcpDynamicPorts"=""
"DisplayName"="Specific IP Address"
"IpAddress"="10.192.168.08"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node0]
"CPUMask"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node1]
"CPUMask"=dword:00000002
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node2]
"CPUMask"=dword:00000004
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node3]
"CPUMask"=dword:00000008
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node4]
"CPUMask"=dword:00000010
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node5]
"CPUMask"=dword:00000020
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node6]
"CPUMask"=dword:00000040
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node7]
"CPUMask"=dword:00000080
|
[В начало]