Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как определить число потоков для Network I/O  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2300
Добрый день! Есть-ли возможность определить сколько SQL Server использует потоков для сетевого ввода/вывода?
У меня возникает такое ощущение, что один. При любой нагрузке на 10Gb сетевухе больше 12,5% не используется.
То же самое наблюдаю если смоделировать один поток c двумя асинхронными буферами через NTttcp.
NTttcp с 8ю потоками и 2мя асинхронными буферами загружает сеть почти на 100%.
В числах это примерно Пакетов принято в сек ~15000 для SQL и NTttcp с 1 потоком и ~150000 для NTttcp с 8 потоками.
размер пакета 32к и для SQL тоже, в настройках сетевух джамбо-фреймы = 9008.
соединение точка-точка без маршрутизаторов. IPv4 и IPv6 без разницы. автоподбор окна приема отключен и т.п.
28 фев 18, 16:46    [21225581]     Ответить | Цитировать Сообщить модератору
 Re: Как определить число потоков для Network I/O  [new]
piy8f
Guest
А backup в несколько потоков ?

BACKUP DATABASE [AdventureWorks]
TO 
	DISK='\\SERVER\BKP\AdventureWorks1.bak', 
	DISK='\\SERVER\BKP\AdventureWorks2.bak', 
	DISK='\\SERVER\BKP\AdventureWorks3.bak'
WITH FORMAT
28 фев 18, 17:04    [21225672]     Ответить | Цитировать Сообщить модератору
 Re: Как определить число потоков для Network I/O  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2300
piy8f,

1 файл - ~13000 пакетов/сек 258Мб/сек
2 файла - ~15000 пакетов/сек 320Мб/сек
3 файла - ~17000 пакетов/сек 380Мб/сек
4 файла - ~19000 пакетов/сек 443Мб/сек
...
8 файлов - ~21000 пакетов/сек 480Мб/сек

но, немного изменилась ситуация - размер пакета 8к
20000 пакетов в сек это те же 12,5%.

при пакете 32к
18 файлов на 1 диск ~22000 пакетов/сек 530Мб/сек
18 файлов на 3 диска ~30000 пакетов/сек 660Мб/сек

25% нагрузку на сеть увидел только в момент когда шел бэкап на 3 диска и параллельно шло копирование большой таблы.
все вместе давало около 40 тыс пакетов в сек.
1 мар 18, 12:12    [21227918]     Ответить | Цитировать Сообщить модератору
 Re: Как определить число потоков для Network I/O  [new]
архивариус
Member

Откуда:
Сообщений: 149
ShIgor,

BACKUP DATABASE test TO
DISK = 'C:\Backups\test.bak'
WITH BUFFERCOUNT = 1024, MAXTRANSFERSIZE = 2097152;

BUFFERCOUNT, MAXTRANSFERSIZE попробуйте не по умолчанию, если найду ссылку напишу там скрипт делает бэкапы и потом автоматически рисует диаграмму в excel в зависимости от этих параметров
1 мар 18, 12:21    [21227964]     Ответить | Цитировать Сообщить модератору
 Re: Как определить число потоков для Network I/O  [new]
архивариус
Member

Откуда:
Сообщений: 149
архивариус
ShIgor,

BACKUP DATABASE test TO
DISK = 'C:\Backups\test.bak'
WITH BUFFERCOUNT = 1024, MAXTRANSFERSIZE = 2097152;

BUFFERCOUNT, MAXTRANSFERSIZE попробуйте не по умолчанию, если найду ссылку напишу там скрипт делает бэкапы и потом автоматически рисует диаграмму в excel в зависимости от этих параметров

BUFFERCOUNT, MAXTRANSFERSIZE, количество файлов
1 мар 18, 12:34    [21228027]     Ответить | Цитировать Сообщить модератору
 Re: Как определить число потоков для Network I/O  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2300
архивариус,

у меня нет цели ускорить бэкап
1 мар 18, 15:35    [21228900]     Ответить | Цитировать Сообщить модератору
 Re: Как определить число потоков для Network I/O  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ShIgor
архивариус,

у меня нет цели ускорить бэкап

если пишеться на LUN -> RAID то ребилдните массив с самый максимально возмодным значением класстера
1 мар 18, 16:20    [21229137]     Ответить | Цитировать Сообщить модератору
 Re: Как определить число потоков для Network I/O  [new]
архивариус
Member

Откуда:
Сообщений: 149
ShIgor
архивариус,

у меня нет цели ускорить бэкап
я в курсе, но если бэкап ускорится, то он будет использовать большую полосу пропускной способности LAN чего вы и хотите добиться?!
1 мар 18, 16:32    [21229198]     Ответить | Цитировать Сообщить модератору
 Re: Как определить число потоков для Network I/O  [new]
ngrfm
Guest
Вот скрипт для прокачки 100MB с SQL сервера на самого себя.
Можно посмотреть как сказывается промежуточный слой ПО.

/*
EXEC master.dbo.sp_addlinkedserver @server = N'LOCALSERVER', @srvproduct=N'', @provider=N'SQLNCLI', @datasrc=N'lpc:(local)\SQL2017DEV', @catalog=N'master'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'LOCALSERVER',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL
EXEC master.dbo.sp_serveroption @server=N'LOCALSERVER', @optname=N'rpc', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'LOCALSERVER', @optname=N'rpc out', @optvalue=N'true'
*/

SET NOCOUNT ON;
declare @dt datetime, @dif1 int, @dif2 int, @dif3 int;

if object_id('tempdb..#netinfo') is not null drop table #netinfo;
create table #netinfo ([val] varchar(max));


delete from #netinfo;
set @dt = getdate();
	-- напрямую INSERT SELECT
	INSERT INTO #netinfo ([val]) SELECT [val] = REPLICATE(cast(REPLICATE(cast(CHAR(55) as varchar(max)),1024) as varchar(max)),1024*100);
set @dif1 = DATEDIFF(ms,@dt,getdate());

delete from #netinfo;
set @dt = getdate();
	-- через INSERT EXEC AT [LOCALSERVER]
	INSERT INTO #netinfo ([val]) EXEC(N'SET NOCOUNT ON; SELECT [val] = REPLICATE(cast(REPLICATE(cast(CHAR(55) as varchar(max)),1024) as varchar(max)),1024*100)') AT [LOCALSERVER];
set @dif2 = DATEDIFF(ms,@dt,getdate());

delete from #netinfo;
set @dt = getdate();
	-- через INSERT SELECT FROM OpenQuery ( [LOCALSERVER], ... )
	INSERT INTO #netinfo ([val]) SELECT [val] FROM OpenQuery ( [LOCALSERVER], N'SET NOCOUNT ON; SELECT [val] = REPLICATE(cast(REPLICATE(cast(CHAR(55) as varchar(max)),1024) as varchar(max)),1024*100);' );
set @dif3 = DATEDIFF(ms,@dt,getdate());


select [local ms] = @dif1 ,[AT ms] = @dif2 ,[OpenQuery ms] = @dif3;
1 мар 18, 16:52    [21229291]     Ответить | Цитировать Сообщить модератору
 Re: Как определить число потоков для Network I/O  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2300
архивариус,

Чего я хочу добиться:
Есть 2 сервака соединенных между собой прямым шнурком в 10Gb. При любом количестве одновременно запущенных запросов с одного сервера на другой, из нескольких разных приложений и/или к разным базам, я наблюдаю максимально 12,5% загрузки сети и больше никак. Простое копирование одного файла загружает сеть до 60-70% даже в один поток, скорость передачи при этом составляет более 600Мб/сек. В случае SQL (без бэкапа) я не вижу более 140Мб/сек сколько бы запросов (приложений, соединений и т.п.) не использовалось. Те же 140Мб/сек я вижу при тестировании сети программой NTttcp в 8 потоков, но на каждом потоке!!!! причем загрузка сети 100%. Отсюда я делаю вывод, что SQL либо работает в один поток, либо просто тупо не понимает, что сетка не Гигабит, а 10Гигабит.
2 мар 18, 22:52    [21233888]     Ответить | Цитировать Сообщить модератору
 Re: Как определить число потоков для Network I/O  [new]
архивариус
Member

Откуда:
Сообщений: 149
ShIgor
архивариус,

Чего я хочу добиться:
Есть 2 сервака соединенных между собой прямым шнурком в 10Gb. При любом количестве одновременно запущенных запросов с одного сервера на другой, из нескольких разных приложений и/или к разным базам, я наблюдаю максимально 12,5% загрузки сети и больше никак. Простое копирование одного файла загружает сеть до 60-70% даже в один поток, скорость передачи при этом составляет более 600Мб/сек. В случае SQL (без бэкапа) я не вижу более 140Мб/сек сколько бы запросов (приложений, соединений и т.п.) не использовалось. Те же 140Мб/сек я вижу при тестировании сети программой NTttcp в 8 потоков, но на каждом потоке!!!! причем загрузка сети 100%. Отсюда я делаю вывод, что SQL либо работает в один поток, либо просто тупо не понимает, что сетка не Гигабит, а 10Гигабит.

маловероятно , но вдруг, maxdop=1 на сервере по умолчанию? попробуйте в запросе maxdop указать
SELECT *
FROM dbo.test
OPTION (MAXDOP 2)
2 мар 18, 23:25    [21233940]     Ответить | Цитировать Сообщить модератору
 Re: Как определить число потоков для Network I/O  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2300
ngrfm,

local msAT msOpenQuery ms
47317231400


о чем это говорит?
2 мар 18, 23:32    [21233949]     Ответить | Цитировать Сообщить модератору
 Re: Как определить число потоков для Network I/O  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2300
архивариус,

MAXDOP 2 по умолчанию и порог 120
2 мар 18, 23:33    [21233951]     Ответить | Цитировать Сообщить модератору
 Re: Как определить число потоков для Network I/O  [new]
архивариус
Member

Откуда:
Сообщений: 149
ShIgor
архивариус,

MAXDOP 2 по умолчанию и порог 120

попробуйте увеличивать до количества ядер процессора (в разумных пределах если это продакшен сервер :-) )
3 мар 18, 01:08    [21234058]     Ответить | Цитировать Сообщить модератору
 Re: Как определить число потоков для Network I/O  [new]
архивариус
Member

Откуда:
Сообщений: 149
архивариус,

в тестовом запросе (а не на сервере по умолчанию)
3 мар 18, 01:09    [21234060]     Ответить | Цитировать Сообщить модератору
 Re: Как определить число потоков для Network I/O  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2300
архивариус,

на сервере по умолчанию.
увеличивать пробовал результат 0. да и с чего вдруг? максдоп - это для одного конкретного запроса, грубо: параллелим исполнение запроса внутри, но передача-то все-равно по одному соединению..
я могу запустить и 1, и 1000 одновременно запросов, с максдопами и без - сеть все-равно будет использована максимум на 12,5%.
естественно в случае одного запроса - нагрузки и 0,5 % нет...
может мне кто-нибудь показать что у него не так?
3 мар 18, 12:12    [21234476]     Ответить | Цитировать Сообщить модератору
 Re: Как определить число потоков для Network I/O  [new]
Eleanor
Member

Откуда:
Сообщений: 2634
ShIgor,

Если у вас одновременно выполняются 1000 запросов, то чего они ждут? Постоянно ASYNC_NETWORK_IO?

При использовании NTttcp с несколькими потоками вы используете сразу несколько портов (Each thread creates a logical processor that connects to (listens) a different port).
В Sql Server используется один порт и соответственно один слушающий поток. Можно для экперимента добавить еще порт в конфигурацию.
4 мар 18, 03:15    [21235417]     Ответить | Цитировать Сообщить модератору
 Re: Как определить число потоков для Network I/O  [new]
Eleanor
Member

Откуда:
Сообщений: 2634
ShIgor
При любой нагрузке на 10Gb сетевухе больше 12,5% не используется.
То же самое наблюдаю если смоделировать один поток c двумя асинхронными буферами через NTttcp

Кстати, вы уверены, что это нормальное поведение для NTttcp, что при использовании 1 потока \ порта он загружает сеть только на 12.5%?
Наткнулась в другом обсуждении (правда, там была 1Gb карточка) на то, что уже 1 поток должен был загрузить сеть почти полностью. Остальные потоки лишь сильнее приближают загрузку к 100%.
4 мар 18, 12:54    [21235657]     Ответить | Цитировать Сообщить модератору
 Re: Как определить число потоков для Network I/O  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2300
Eleanor,

к тому же склоняюсь.
настроил SoftNUMA из 4х нод (4 по 6 процов в каждом),
на каждую назначил свой порт. осталось протестировать.
5 мар 18, 14:56    [21237990]     Ответить | Цитировать Сообщить модератору
 Re: Как определить число потоков для Network I/O  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7399
ShIgor,
может быть QoS влияет на поток или какие-то сетевые балансировщики?
5 мар 18, 15:50    [21238187]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить