Wi, ansyen laptop mwen an plizyè fwa pi pwisan pase sèvè pwodiksyon ou a.

Sa yo se reklamasyon yo mwen tande nan men devlopè nou yo. Bagay ki pi enteresan an se ke sa a te tounen vre, sa ki lakòz yon ankèt ki long. Nou pral pale de serveurs SQL ki ap kouri sou VMware.

Wi, ansyen laptop mwen an plizyè fwa pi pwisan pase sèvè pwodiksyon ou a.

Aktyèlman, jwenn sèvè pwodiksyon an san espwa dèyè laptop la se fasil. Kouri (pa sou tempdb epi pa sou yon baz done ki gen Delayed Durability aktive) kòd la:

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

Li pran 5 segonn sou Desktop mwen ak 28 segonn sou sèvè pwodiksyon an. Paske SQL oblije rete tann pou fen fizik ekri nan boutèy tranzaksyon an, epi nou ap fè tranzaksyon trè kout isit la. Apeprè pale, nou te kondui yon gwo kamyon pwisan nan trafik vil la, epi nou ap gade ki jan moun ki fè livrezon pitza sou scooters yo pi popilè depase li - debi pa enpòtan isit la, se sèlman latansi ki enpòtan. Epi pa gen yon sèl depo rezo, kèlkeswa kantite zewo ki genyen nan pri li yo, yo pral kapab depase yon SSD lokal an tèm de latansi.

(nan kòmantè yo li te tounen soti ke mwen te bay manti - mwen te retade durability nan tou de kote. San yo pa reta durability li vire soti:
Desktop - 39 segonn, 15K tr/sec, 0.065ms /io ale/retour
PROD - 360 segonn, 1600 tr/sec, 0.6ms
Mwen ta dwe remake ke li twò vit)

Sepandan, nan ka sa a nou ap fè fas ak zewo trivial nan fonksyon zeta Riemann ak yon egzanp trivial. Nan egzanp ke devlopè yo te pote m ', li te diferan. Mwen te konvenki ke yo te dwat, epi yo te kòmanse netwaye tout spesifik yo ki gen rapò ak lojik biznis nan egzanp lan. Nan kèk pwen, mwen reyalize ke mwen te kapab konplètman jete kòd yo, epi ekri pwòp mwen an - ki demontre menm pwoblèm nan - nan pwodiksyon li kouri 3-4 fwa pi dousman:

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

Si tout bagay anfòm avèk ou, Lè sa a, tcheke pou senplisite nan yon nimewo pral pran 6-7-8 segonn. Sa a te rive sou yon kantite serveurs. Men, sou kèk, chèk la te pran 25-40 segonn. Enteresan, pa te gen okenn serveurs kote ekzekisyon an ta pran, di, 14 segonn - kòd la te travay swa trè vit oswa trè dousman, se sa ki, pwoblèm nan te, an n di, nwa ak blan.

Kisa mwen te fè? Te antre nan mezi VMware. Tout bagay te byen la - te gen anpil resous, Ready time = 0, te gen ase nan tout bagay, pandan tès la tou de sou vit ak dousman serveurs CPU = 100 sou yon sèl vCPU. Mwen te pran yon tès pou kalkile kantite Pi - tès la te montre rezilta yo menm sou nenpòt ki serveurs. Sant maji nwa a te vin pi fò ak pi fò.

Èske w gen soti nan fèm nan DEV, mwen te kòmanse jwe ak serveurs. Li te tounen soti ke vMotion soti nan lame a lame ka "geri" yon sèvè, men li ka tou vire yon "vit" sèvè nan yon "ralanti". Li sanble ke sa a se li - kèk hôtes gen yon pwoblèm... men... non. Gen kèk machin vityèl ki ralanti sou lame, di, A, men te travay byen vit sou lame B. Ak lòt machin nan vityèl, okontrè, te travay vit sou A ak ralanti sou B! Tou de machin "vit" ak "ralanti" yo te souvan vire sou lame a!

Soti nan moman sa a, te gen yon sant diferan nan souf nan lè a. Apre yo tout, pwoblèm nan pa t 'kapab atribiye a nenpòt machin vityèl (patch fenèt, pou egzanp) - apre yo tout, li te tounen yon "vit" yon sèl ak vMotion. Men, pwoblèm nan tou pa t 'kapab dwe atribiye a lame a - apre tout, li ta ka gen tou de "vit" ak "ralanti" machin. Li te tou pa gen rapò ak chaj la - mwen jere yo jwenn yon machin "ralanti" sou lame a, kote pa te gen anyen nan tout san konte li.

Soti nan dezespwa, mwen te tire moute Sysinternals' Process Explorer ak gade nan pil SQL la. Sou machin dousman, liy lan imedyatman atire je m ':

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
… sote
sqldk.dll!SystemThread::MakeMiniSOSThread+0xa54
KERNEL32.DLL!BaseThreadInitThunk+0x14
ntdll.dll!RtlUserThreadStart+0x21

Se te deja yon bagay. Pwogram nan te ekri:

    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);
                }
            }
        }
    }

Pwogram sa a te montre yon ralantisman menm plis pwononse - sou machin "vit" li montre 16-18 milyon sik pou chak segonn, pandan y ap sou moun ki dousman - yon milyon ak yon mwatye, oswa menm 700 mil. Sa vle di, diferans lan se 10-20 fwa (!!!). Sa a te deja yon ti viktwa: nan nenpòt ka, pa te gen okenn menas pou yo bloke ant Microsoft ak sipò VMware pou yo ta chanje flèch youn ak lòt.

Lè sa a, pwogrè sispann - vakans, bagay enpòtan, isteri viral ak yon ogmantasyon byen file nan kantite travay. Mwen souvan mansyone pwoblèm majik la bay kòlèg li yo, men pafwa li te sanble ke yo pa t 'menm toujou kwè m' - deklarasyon an ke VMware ralanti kòd la pa 10-20 fwa te twò kolosal.

Mwen te eseye fouye tèt mwen sa ki ralanti li. Pafwa li te sanble m 'ke mwen te jwenn yon solisyon - vire ploge yo cho sou yo ak koupe, chanje kantite lajan an nan memwa oswa kantite processeurs souvan vire machin nan nan yon "yon sèl vit". Men, pa pou tout tan. Men, sa ki te tounen vre se ke li se ase yo ale deyò epi yo frape sou volan an - se sa ki, chanje. nenpòt ki paramèt machin vityèl

Finalman, kòlèg Ameriken mwen yo toudenkou te jwenn yon kòz rasin.

Wi, ansyen laptop mwen an plizyè fwa pi pwisan pase sèvè pwodiksyon ou a.

Lame yo diferan nan frekans!

  • Kòm yon règ, sa a se pa pè. Men: lè w ap deplase soti nan yon lame 'natif natal' nan yon lame ki gen yon frekans 'diferan', VMware dwe ajiste rezilta GetTimePrecise la.
  • Kòm yon règ, sa a se pa yon pwoblèm, sof si gen yon aplikasyon ki mande tan an egzak dè milyon de fwa pa segonn, tankou sèvè SQL.
  • Men, sa a pa pè tou, paske sèvè SQL pa toujou fè sa (gade Konklizyon)

Men, gen ka lè rato sa a fè mal. Ak repons lan se wi, pa frape pi rèd toujou sou volan an (pa chanje yon bagay nan anviwònman yo VM), mwen fòse VMware 'rekalkile' konfigirasyon an, ak frekans nan lame aktyèl la te vin 'natif natal' frekans nan machin nan.

desizyon

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

Lè ou enfim virtualizasyon TSC a, li TSC a soti nan machin vityèl la retounen valè TSC machin fizik la, epi ekri TSC a soti nan machin vityèl la pa gen okenn efè. Migrasyon machin vityèl la nan yon lòt lame, rekòmanse li soti nan eta sispann, oswa retounen nan yon snapshot lakòz TSC a sote san rete. Gen kèk sistèm operasyon envite yo pa demare, oswa montre lòt pwoblèm timekeeping, lè TSC Virtualization enfim. Nan tan lontan, karakteristik sa a te pafwa rekòmande pou amelyore pèfòmans aplikasyon ki li TSC la souvan, men pèfòmans TSC vityèl la te amelyore anpil nan pwodwi aktyèl yo. Karakteristik la te rekòmande tou pou itilize lè w ap fè mezi ki mande pou yon sous egzak tan reyèl nan machin vityèl la.

Nan ti bout tan, ou bezwen ajoute paramèt la

monitor_control.virtual_rdtsc = FO

Konklizyon

Ou pwobableman gen yon kesyon: poukisa SQL ta rele GetTimePrecise souvan?

Mwen pa gen sous sèvè SQL, men lojik la di sa. SQL se prèske yon sistèm opere ak konkou koperativ, kote chak fil dwe "bay fason" de tan zan tan. Ki kote ki pi bon kote pou fè li? Kote ki gen yon atant natirèl - fèmen oswa IO. Oke, men e si nou ap vire sik enfòmatik? Lè sa a, evidan ak prèske sèl kote a se nan entèprèt la (sa a se pa byen yon entèprèt), apre ekzekisyon an nan pwochen operatè a.

Kòm yon règ, sèvè SQL pa itilize pou informatique pi e sa a se pa yon pwoblèm. Men, sik ak travay ak tout kalite tab tanporè (ki imedyatman nan kachèt) vire kòd la nan yon sekans nan deklarasyon trè byen vit egzekite.

By wout la, si fonksyon an vlope nan NATIVELY COMPILED, Lè sa a, li sispann mande tan, ak vitès li yo ogmante pa fwa 10. Men, sa ki sou koperativ Multitech? Men, pou kòd natif natal konpile, mwen te oblije fè PREEMPTIVE MULTITASKING nan SQL.

Sous: www.habr.com

Add nouvo kòmantè