Да, Мой Старый Ноутбук В Несколько Раз Мощнее Вашего Производственного Сервера

Именно такие жалобы я слышал от наших разработчиков.

Самое интересное, что это оказалось правдой, что послужило поводом для длительного расследования.

Мы поговорим о SQL-серверах, работающих на VMware.

Да, мой старый ноутбук в несколько раз мощнее вашего производственного сервера

На самом деле легко убедиться, что рабочий сервер безнадежно отстает от ноутбука.

Выполните (не в базе данных tempdb и не в базе данных с включенной функцией Delayed Durability) код:

  
   

set nocount on create table _t (v varchar(100)) declare @n int=300000 while @n>0 begin insert into _t select 'What a slowpoke!' delete from _t set @n=@n-1 end GO drop table _t

На моем рабочем столе это занимает 5 секунд, а на рабочем сервере — 28 секунд. Потому что SQL должен ждать физического окончания записи журнала транзакций, а здесь мы выполняем очень короткие транзакции.

Грубо говоря, мы выехали на большом мощном грузовике в городской поток и наблюдали, как его лихо обгоняют разносчики пиццы на скутерах — здесь не важна пропускная способность, важна только латентность.

И ни одно сетевое хранилище, сколько бы нулей ни было в его цене, не сможет превзойти локальный SSD по латентности.

(в комментариях оказалось, что я соврал - у меня в обоих местах была задержка долговечности.

Без задержки долговечности получается: Рабочий стол — 39 секунд, 15 000 транзакций в секунду, 0,065 мс/IO туда и обратно.

ПРОД - 360 секунд, 1600 тр/сек, 0,6мс Я должен был заметить, что это было слишком быстро)

Однако в данном случае мы имеем дело с тривиальными нулями дзета-функции Римана с тривиальным примером.

В примере, который мне привели разработчики, было иначе.

Я убедился в их правоте и начал удалять из примера всю их специфику, связанную с бизнес-логикой.

В какой-то момент я понял, что могу полностью выбросить их код и написать свой — который демонстрирует ту же проблему — в продакшене он работает в 3-4 раза медленнее:

create function dbo.isPrime (@n bigint) returns int as begin if @n = 1 return 0 if @n = 2 return 1 if @n = 3 return 1 if @n % 2 = 0 return 0 declare @sq int set @sq = sqrt(@n)+1 -- check odds up to sqrt declare @dv int = 1 while @dv < @sq begin

Теги: #Виртуализация #vmware #Администрирование сервера #sql #производительность #Microsoft SQL Server #sql-сервер

Вместе с данным постом часто просматривают: