måndag 3 april 2017

Använda standard edition på för bra server

Detta låter kanske inte som ett problem att en server kan vara för bra. Men så är det och det är något man måste tänka på när man sätter upp en SQL Standard Edition på fysisk hårdvara. Många servrar idag är väl utrustade med CPU och många cores. Har ett exempel på där kunden kör HP BL460c G9. Dessa är bestyckade med två st CPU med vardera 14 cores. Det blir då hela 56 logical cores med hyperthreadingen. Låter ju bra men standard edition hantera bara maximalt 16 cores (32 logical cores) i SQL 2012 och 2014 samt 24 cores (48 logical cores) i SQL 2016.

Man kan se detta med hjälp av DMV sys.dm_os_sys_info. Exempel på hur det kan se ut i en SQL 2012. Scheduler_count är antal cores knutna till SQL (Schedulers är CPU i SQL).

SELECT cpu_count AS [Logical CPU Count], scheduler_count, hyperthread_ratio AS [Hyperthread Ratio], cpu_count/hyperthread_ratio AS [Physical CPU Count],
physical_memory_kb/1024 AS [Physical Memory (MB)], committed_kb/1024 AS [Committed Memory (MB)], committed_target_kb/1024 AS [Committed Target Memory (MB)],
max_workers_count AS [Max Workers Count], affinity_type_desc AS [Affinity Type],
sqlserver_start_time AS [SQL Server Start Time], virtual_machine_type_desc AS [Virtual Machine Type]
FROM sys.dm_os_sys_info WITH (NOLOCK) OPTION (RECOMPILE);






För att se hur fördelningen ser ut över NUMA noderna använder vi DMV´n sys.dm_os_nodes (se nedan bild). I bilden ser man att den första NUMA noden har 28 CPU´s medans den andra enbart har fyra. I detta läget skulle det blir en stor skevhet i arbetsfördelningen över NUMA noderna. Dom fyra CPU på NUMA nod två skulle få ta en mycket högre last än de andra på den första NUMA noden.

SELECT node_id, node_state_desc, memory_node_id, processor_group, online_scheduler_count, active_worker_count, avg_load_balance, resource_monitor_state
FROM sys.dm_os_nodes WITH (NOLOCK)
WHERE node_state_desc <> N'ONLINE DAC' OPTION (RECOMPILE);






Det hela är enkelt justerat med ALTER SERVER CONFIGURATION. I detta specifika fall delar vi upp de 32 corsen som SQL kan hantera med sexton st per NUMA node enligt nedan. Tillgängliga cores ser man enklast med DMVén sys.dm_os_schedulers. Använd cpu_id för att mappa till rätt NUMA node.

ALTER SERVER CONFIGURATION
SET PROCESS AFFINITY CPU = 0 TO 15, 64 TO 79;

Skripten är från Glenn Berry på SQLSkills