Бале, ноутбуки кӯҳнаи ман аз сервери истеҳсолии шумо чанд маротиба пурқувваттар аст.

Ин иддаоест, ки ман аз таҳиягарони мо шунидам. Аз ҳама ҷолиб он аст, ки ин ҳақиқат буд ва боиси тафтишоти тӯлонӣ гардид. Мо дар бораи серверҳои SQL, ки дар VMware кор мекунанд, сӯҳбат хоҳем кард.

Бале, ноутбуки кӯҳнаи ман аз сервери истеҳсолии шумо чанд маротиба пурқувваттар аст.

Воқеан, ба даст овардани сервери истеҳсолӣ ба паси ноутбук осон аст. Рамзро иҷро кунед (на дар tempdb ва на дар пойгоҳи додаҳо бо давомнокии таъхир фаъол аст):

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 сония, 15K tr/s, 0.065ms /io рафтуомад
PROD - 360 сония, 1600 тр/сек, 0.6 мс
Ман бояд пайхас кардам, ки ин хеле зуд аст)

Аммо, дар ин ҳолат мо бо сифрҳои ночизи функсияи zeta Riemann бо як мисоли ночиз кор мекунем. Дар мисоле, ки таҳиягарон ба ман оварданд, он дигар буд. Ман боварӣ доштам, ки онҳо дурустанд ва аз мисол тамоми хусусиятҳои марбут ба мантиқи тиҷоратро тоза кардам. Дар баъзе лаҳзаҳо, ман фаҳмидам, ки ман метавонам рамзи онҳоро комилан партоям ва худамро нависам, ки ин як мушкилотро нишон медиҳад - дар истеҳсолот он 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
	set @dv=@dv+2
	if @n % @dv = 0 return 0
	end
  return 1
  end
GO
declare @dt datetime set @dt=getdate()
select dbo.isPrime(1000000000000037)
select datediff(ms,@dt,getdate()) as ms
GO

Агар ҳама чиз бо шумо хуб бошад, пас санҷиши соддагии рақам 6-7-8 сонияро мегирад. Ин дар як қатор серверҳо рӯй дод. Аммо дар баъзехо чек 25—40 сонияро дарбар мегирифт. Ҷолиб он аст, ки серверҳое вуҷуд надоштанд, ки иҷрои онҳо, масалан, 14 сонияро мегирад - код ё хеле зуд ё хеле суст кор мекард, яъне мушкилот, бигӯем, сиёҳ ва сафед буд.

Ман чӣ кор кардам? Ба метрикаи VMware дохил шуд. Дар он ҷо ҳама чиз хуб буд - захираҳои фаровон буданд, Вақти омодагӣ = 0, ҳама чиз кофӣ буд, ҳангоми санҷиш ҳам дар серверҳои зуд ва ҳам суст CPU = 100 дар як vCPU. Ман барои ҳисоб кардани шумораи Pi санҷиш гузаронидам - ​​санҷиш дар ҳама серверҳо ҳамон натиҷаҳоро нишон дод. Бӯи ҷодуи сиёҳ торафт қавитар мешуд.

Пас аз баромадан аз фермаи DEV, ман бо серверҳо бозӣ карданро сар кардам. Маълум шуд, ки vMotion аз ҳост ба ҳост метавонад серверро "табобат" кунад, аммо он инчунин метавонад сервери "тез" -ро ба сервери "суст" табдил диҳад. Чунин ба назар мерасад, ки ин аст - баъзе мизбонҳо мушкилот доранд ... аммо ... не. Баъзе мошини маҷозӣ дар ҳост, масалан, А, суст шуд, аммо дар мизбони В зуд кор кард. Ва мошини дигари виртуалӣ, баръакс, дар А зуд кор мекард ва дар B сусттар кард! Ҳам мошинҳои "суръат" ва ҳам "суст" аксар вақт дар болои мизбон чарх мезаданд!

Аз хамин лахза дар хаво буи равшани сулфур пайдо шуд. Дар ниҳоят, мушкилотро ба ягон мошини маҷозӣ (масалан, часбҳои тирезаҳо) рабт додан мумкин нест - дар ниҳоят, он бо vMotion ба мошини "тез" табдил ёфт. Аммо мушкилотро низ ба мизбон марбут кардан мумкин нест - дар ниҳоят, он метавонад ҳам мошинҳои "суръат" ва ҳам "суст" дошта бошад. Он инчунин ба сарборӣ вобаста набуд - ман тавонистам як мошини "суст" -ро дар мизбон гирам, ки дар он ҷо ғайр аз он чизе набуд.

Аз ноумедӣ ман Process Explorer-и Sysinternals-ро ба кор андохтам ва ба стеки SQL назар кардам. Дар мошинҳои суст, хат дарҳол чашми маро ба худ ҷалб кард:

ntoskrnl.exe!KeSynchronizeExecution+0x5bf6
ntoskrnl.exe!KeWaitForMultipleObjects+0x109d
ntoskrnl.exe!KeWaitForMultipleObjects+0xb3f
ntoskrnl.exe!KeWaitForSingleObject+0x377
ntoskrnl.exe!KeQuerySystemTimePrecise+0x881 < - !!!
ntoskrnl.exe!ObDereferenceObjectDeferDelete+0x28a
ntoskrnl.exe!KeSynchronizeExecution+0x2de2
sqllang.dll!CDiagThreadSafe::PxlvlReplace+0x1a20
… гузаред
sqldk.dll!SystemThread::MakeMiniSOSThread+0xa54
KERNEL32.DLL!BaseThreadInitThunk+0x14
ntdll.dll!RtlUserThreadStart+0x21

Ин аллакай чизе буд. Барнома навишта шудааст:

    class Program
    {
        [DllImport("kernel32.dll")]
        static extern void GetSystemTimePreciseAsFileTime(out FILE_TIME lpSystemTimeAsFileTime);

        [StructLayout(LayoutKind.Sequential)]
        struct FILE_TIME
        {
            public int ftTimeLow;
            public int ftTimeHigh;
        }

        static void Main(string[] args)
        {
            for (int i = 0; i < 16; i++)
            {
                int counter = 0;

                var stopwatch = Stopwatch.StartNew();

                while (stopwatch.ElapsedMilliseconds < 1000)
                {
                    GetSystemTimePreciseAsFileTime(out var fileTime);
                    counter++;
                }

                if (i > 0)
                {
                    Console.WriteLine("{0}", counter);
                }
            }
        }
    }

Ин программа сустшавии боз хам равшантар нишон дод — дар машинахои «суръат» вай дар як сония 16—18 миллион циклро нишон медихад, дар машинахои суст — якуним миллион, хатто 700 хазор. Яъне, тафовут 10-20 маротиба (!!!) аст. Ин аллакай як ғалабаи хурд буд: дар ҳар сурат, ҳеҷ гуна таҳдиди часпидан байни дастгирии Microsoft ва VMware вуҷуд надошт, то онҳо тирҳоро ба ҳамдигар иваз кунанд.

Он гоҳ пешрафт қатъ шуд - рухсатӣ, чизҳои муҳим, истерияи вирусӣ ва афзоиши якбораи сарбории кор. Ман бисёр вақт дар бораи мушкилоти ҷодугарӣ ба ҳамкорон ёдовар мешудам, аммо баъзан чунин менамуд, ки онҳо ҳатто ба ман бовар намекарданд - изҳорот, ки VMware кодро 10-20 маротиба суст кардааст, хеле даҳшатнок буд.

Ман кӯшиш кардам, ки худам кобед, ки он чизеро суст мекунад. Баъзан ба назарам чунин менамуд, ки ман роҳи ҳалли худро ёфтаам - фурӯзон ва хомӯш кардани штепсельҳои гарм, тағир додани ҳаҷми хотира ё шумораи коркардкунандагон аксар вақт мошинро ба «тез» табдил медиҳанд. Аммо на ҳамеша. Аммо он чизе, ки дуруст шуд, кифоя аст, ки ба берун баромада, чархро бикӯбанд - яъне тағир додан. ҳама параметри мошини виртуалӣ

Ниҳоят, ҳамкасбони амрикоии ман ногаҳон сабаби аслӣ пайдо карданд.

Бале, ноутбуки кӯҳнаи ман аз сервери истеҳсолии шумо чанд маротиба пурқувваттар аст.

Мизбонҳо аз рӯи басомад фарқ мекарданд!

  • Чун қоида, ин даҳшатнок нест. Аммо: ҳангоми гузаштан аз мизбони "модарӣ" ба ҳост бо басомади "дигар", VMware бояд натиҷаи GetTimePrecise-ро танзим кунад.
  • Одатан, ин мушкилот нест, агар ягон барномае вуҷуд надошта бошад, ки вақти дақиқро дар як сония миллионҳо маротиба дархост кунад, ба монанди сервери SQL.
  • Аммо ин ҳам даҳшатнок нест, зеро сервери SQL на ҳамеша ин корро мекунад (ниг. Хулоса)

Аммо ходисахое хастанд, ки ин раке дард мекунад. Ва ҳа, бо кӯфтани чарх (бо тағир додани чизе дар танзимоти VM) ман VMware-ро маҷбур кардам, ки конфигуратсияро "аз нав ҳисоб кунад" ва басомади мизбони ҷорӣ басомади "модарии" мошин гардид.

ҳалли

www.vmware.com/files/pdf/techpaper/Timekeeping-In-VirtualMachines.pdf

Вақте ки шумо виртуализатсияи TSC-ро ғайрифаъол мекунед, хондани TSC аз дохили мошини маҷозӣ арзиши TSC-и мошини физикиро бармегардонад ва навиштани TSC аз дохили мошини виртуалӣ ҳеҷ таъсире надорад. Гузаронидани мошини маҷозӣ ба ҳости дигар, барқарор кардани он аз ҳолати боздошташуда ё баргардонидан ба аксбардорӣ боиси ҷаҳида шудани TSC мегардад. Баъзе системаҳои оператсионии меҳмонон ҳангоми ғайрифаъол будани виртуализатсияи TSC кор намекунанд ё мушкилоти дигари ҳисобкунии вақтро нишон медиҳанд. Дар гузашта, ин хусусият баъзан барои беҳтар кардани иҷрои барномаҳое тавсия мешуд, ки TSC-ро зуд-зуд мехонанд, аммо иҷрои TSC виртуалӣ дар маҳсулоти ҷорӣ ба таври назаррас беҳтар шудааст. Ин хусусият инчунин барои истифода ҳангоми иҷрои андозагирӣ тавсия шудааст, ки манбаи дақиқи вақти воқеӣ дар мошини виртуалиро талаб мекунанд.

Дар кӯтоҳ, шумо бояд параметрро илова кунед

monitor_control.virtual_rdtsc = FALSE

хулоса

Шояд шумо саволе дошта бошед: чаро SQL ин қадар зуд-зуд GetTimePrecise -ро даъват мекунад?

Ман сарчашмаҳои сервери SQL надорам, аммо мантиқ инро мегӯяд. SQL қариб як системаи амалиётӣ бо ҳамзамон кооператив аст, ки дар он ҳар як ришта гоҳ-гоҳ бояд "роҳ диҳад". Беҳтарин ҷой барои ин кор куҷост? Дар куҷо интизории табиӣ вуҷуд дорад - қулф ё IO. Хуб, аммо агар мо давраҳои ҳисоббарориро чарх занем, чӣ мешавад? Пас аз иҷрои оператори навбатӣ ҷои аён ва қариб ягона дар тарҷумон аст (ин комилан тарҷумон нест).

Чун қоида, сервери SQL барои компютерҳои холис истифода намешавад ва ин мушкилот нест. Аммо давраҳо бо кор бо ҳама гуна ҷадвалҳои муваққатӣ (ки фавран кэш карда мешаванд) кодро ба пайдарпаии изҳороти хеле зуд иҷрошаванда табдил медиҳанд.

Воқеан, агар ин функсия дар NATIVELY COMPILED печонида шуда бошад, он гоҳ дархости вақтро қатъ мекунад ва суръати он 10 маротиба меафзояд Аммо дар бораи бисёрҷанбаи кооперативӣ чӣ гуфтан мумкин аст? Аммо барои коди ба таври маҳаллӣ тартибдодашуда, ман маҷбур будам, ки дар SQL PREEMPTIVE MULTITASKING -ро иҷро кунам.

Манбаъ: will.com

Илова Эзоҳ