Tha, tha an seann laptop agam grunn thursan nas cumhachdaiche na an t-seirbheisiche riochdachaidh agad

Is iad sin dìreach na gearanan a chuala mi bhon luchd-leasachaidh againn. Is e an rud as inntinniche gun do thionndaidh seo a-mach gu bhith fìor, ag adhbhrachadh sgrùdadh fada. Bruidhnidh sinn mu dheidhinn frithealaichean SQL a bhios a’ ruith air VMware.

Tha, tha an seann laptop agam grunn thursan nas cumhachdaiche na an t-seirbheisiche riochdachaidh agad

Gu fìrinneach, tha e furasta dèanamh cinnteach gu bheil an frithealaiche cinneasachaidh gun dòchas air cùl an laptop. Cuir an gnìomh (chan ann air tempdb agus chan ann air stòr-dàta le dàil air seasmhachd air a chomasachadh) an còd:

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

Air an deasg agam bheir e 5 diogan, agus air an fhrithealaiche riochdachaidh bheir e 28 diogan. Leis gum feum SQL feitheamh ri deireadh fiosaigeach an loga malairt, agus tha sinn a’ dèanamh gnothaichean glè ghoirid an seo. An ìre mhath a’ bruidhinn, dhràibh sinn làraidh mòr, cumhachdach a-steach do thrafaig a’ bhaile, agus choimhead sinn mar a bha daoine lìbhrigidh piotsa a’ dol seachad air sgùtairean - chan eil an t-slighe a-steach cudromach an seo, chan eil ach latency cudromach. Agus chan urrainn do stòradh lìonra sam bith, ge bith cia mheud neoni a tha sa phrìs aige, an SSD ionadail a bhualadh a thaobh latency.

(anns na beachdan thionndaidh e a-mach gun robh mi ag innse breugan - bha mi air dàil a chuir air seasmhachd anns an dà àite. Gun dàil air seasmhachd tha e a’ tionndadh a-mach:
Deasg - 39 diogan, 15K tr / diog, cuairt cruinn 0.065ms / io
PROD - 360 diogan, 1600 tr / diog, 0.6ms
Bu chòir dhomh a bhith air mothachadh gu robh e ro luath)

Ach, anns a 'chùis seo tha sinn a' dèiligeadh ri neoni beag de ghnìomh Riemann zeta le eisimpleir beag. Anns an eisimpleir a thug an luchd-leasachaidh thugam, bha e eadar-dhealaichte. Bha mi cinnteach gu robh iad ceart, agus thòisich mi a’ toirt air falbh bhon eisimpleir a h-uile mion-fhiosrachadh aca co-cheangailte ri loidsig gnìomhachais. Aig àm air choreigin thuig mi gum b 'urrainn dhomh an còd aca a thilgeil air falbh gu tur agus mo chuid fhìn a sgrìobhadh - a tha a' nochdadh an aon dhuilgheadas - ann an riochdachadh bidh e a 'ruith 3-4 tursan nas slaodaiche:

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

Ma tha a h-uile càil gu math, bheir e 6-7-8 diogan sgrùdadh air prìomhachd àireamh. Thachair seo air grunn luchd-frithealaidh. Ach air cuid, thug an t-seic 25-40 diogan. Gu h-inntinneach, cha robh frithealaichean ann far an toireadh cur gu bàs, can, 14 diogan - dh’ obraich an còd gu math luath no gu math slaodach, is e sin, b’ e an duilgheadas, canaidh sinn, dubh is geal.

Dè a rinn mi? Chleachdadh VMware metrics. Bha a h-uile dad gu math an sin - bha pailteas de ghoireasan ann, Ùine Ready = 0, bha gu leòr de a h-uile càil ann, rè an deuchainn air an dà chuid frithealaichean luath is slaodach CPU = 100 air aon vCPU. Rinn mi deuchainn gus an àireamh Pi obrachadh a-mach - sheall an deuchainn na h-aon toraidhean air frithealaiche sam bith. Dh'fhàs fàileadh draoidheachd dhubh nas làidire agus nas làidire.

Nuair a ràinig mi tuathanas DEV, thòisich mi a’ cluich leis na frithealaichean. Thionndaidh e a-mach gum faod vMotion bho aoigh gu aoigheachd “leigheas” a dhèanamh air frithealaiche, ach faodaidh e cuideachd frithealaiche “luath” a thionndadh gu bhith na fhear “slaodach”. Tha e coltach gur e seo e - tha duilgheadas aig cuid de luchd-aoigheachd ... ach ... chan eil. Bha cuid de dh’ inneal brìgheil slaodach air aoigheachd, can A, ach dh’ obraich e gu sgiobalta air aoigheachd B. Agus dh’ obraich inneal brìgheil eile, air an làimh eile, gu sgiobalta air A agus rinn e nas slaodaiche air B! Bha an dà inneal “luath” agus “slaodach” gu tric a’ snìomh air an òstair!

Bhon mhionaid sin a-mach, bha fàileadh sònraichte de phronnasg san adhar. Às deidh na h-uile, cha b 'urrainnear an duilgheadas a thoirt don inneal mas-fhìor (pàtrain Windows, mar eisimpleir) - às dèidh a h-uile càil, thionndaidh e gu "luath" le vMotion. Ach cha b 'urrainnear an duilgheadas a thoirt don òstair cuideachd - às dèidh a h-uile càil, dh'fhaodadh gum biodh innealan "luath" agus "slaodach" aige. Cuideachd, cha robh seo co-cheangailte ris an luchd - fhuair mi inneal “slaodach” air an òstair, far nach robh dad ann a bharrachd air.

A-mach à èiginn, chuir mi air bhog Process Explorer bho Sysinternals agus choimhead mi air stac SQL. Air innealan slaodach ghlac an loidhne mo shùil sa bhad:

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
... leum
sqlk.dll!SystemThread::MakeMiniSOSTthread+0xa54
KERNEL32.DLL!BaseThreadInitThunk+0x14
ntdll.dll!RtlUserThreadStart+0x21

Bha seo mar-thà rudeigin. Chaidh am prògram a sgrìobhadh:

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

Sheall am prògram seo slaodachadh eadhon nas fhollaisiche - air innealan “luath” tha e a ’sealltainn 16-18 millean cearcall gach diog, agus air innealan slaodach tha e a’ nochdadh millean gu leth, no eadhon 700 mìle. Is e sin, tha an eadar-dhealachadh 10-20 uair (!!!). B’ e buaidh bheag a bha seo mar-thà: co-dhiù, cha robh cunnart ann a dhol an sàs eadar taic Microsoft agus VMware gus an tionndaidheadh ​​iad saighdean air a chèile.

An uairsin stad an adhartas – saor-làithean, cùisean cudromach, hysteria viral agus àrdachadh geur ann an eallach obrach. Gu tric thug mi iomradh air an duilgheadas draoidheil dha mo cho-obraichean, ach aig amannan bha e coltach nach robh iad eadhon gam chreidsinn - bha an aithris gu bheil VMware a ’slaodadh sìos a’ chòd 10-20 uair ro uamhasach.

Dh'fheuch mi ri mi fhìn a chladhach a-mach dè a bha gam shlaodadh. Aig amannan bha e coltach riumsa gun robh mi air fuasgladh a lorg - a’ tionndadh plugaichean teth air agus dheth, ag atharrachadh na tha de chuimhne no an àireamh de luchd-giullachd gu tric a’ tionndadh an inneal gu bhith na “luath”. Ach chan ann gu bràth. Ach is e an rud a thàinig gu bhith fìor gu bheil e gu leòr a dhol a-mach agus gnogadh air a’ chuibhle - is e sin, atharrachadh aon sam bith paramadair inneal brìgheil

Mu dheireadh, lorg mo cho-obraichean Ameireaganach gu h-obann am prìomh adhbhar.

Tha, tha an seann laptop agam grunn thursan nas cumhachdaiche na an t-seirbheisiche riochdachaidh agad

Bha na h-aoighean eadar-dhealaichte ann am tricead!

  • Mar riaghailt, chan e gnothach mòr a tha seo. Ach: nuair a ghluaiseas tu bho òstair ‘dùthchasach’ gu aoigh le tricead ‘eadar-dhealaichte’, feumaidh VMware toradh GetTimePrecise atharrachadh.
  • Mar riaghailt, chan e duilgheadas a tha seo, mura h-eil tagradh ann a dh ’iarras an dearbh ùine milleanan de thursan san diog, leithid frithealaiche SQL.
  • Ach chan eil seo eagallach, leis nach bi frithealaiche SQL an-còmhnaidh a’ dèanamh seo (faic Co-dhùnadh)

Ach tha cùisean ann nuair a bhuaileas an ràcan seo gu cruaidh. Agus fhathast, tha, le bhith a 'cnagadh air a' chuibhle (le bhith ag atharrachadh rudeigin anns na roghainnean VM) thug mi air VMware an rèiteachadh 'ath-àireamhachadh', agus thàinig tricead an aoigh làithreach gu bhith na tricead 'dùthchasach' den inneal.

co-dhùnadh

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

Nuair a chuireas tu à comas virtualization den TSC, bidh leughadh an TSC bhon taobh a-staigh den inneal mas-fhìor a’ tilleadh luach TSC an inneal fiosaigeach, agus chan eil buaidh sam bith aig sgrìobhadh an TSC bhon taobh a-staigh den inneal brìgheil. Le bhith a’ gluasad an inneal brìgheil gu aoigh eile, ga thoirt air ais bho staid crochte, no a’ dol air ais gu dealbh bheir sin don TSC leum gun stad. Bidh cuid de shiostaman obrachaidh aoighean a’ fàiligeadh, no a’ nochdadh duilgheadasan cumail-ùine eile, nuair a tha virtualization TSC ciorramach. San àm a dh’ fhalbh, chaidh am feart seo a mholadh uaireannan gus coileanadh thagraidhean a leughas an TSC gu tric a leasachadh, ach tha coileanadh an TSC brìgheil air a leasachadh gu mòr ann am bathar gnàthach. Chaidh am feart a mholadh cuideachd airson a chleachdadh nuair a bhios tu a’ dèanamh tomhais a dh’ fheumas stòr fìor-ùine anns an inneal mas-fhìor.

Ann an ùine ghoirid, feumaidh tu am paramadair a chuir ris

monitor_control.virtual_rdtsc = FALSE

co-dhùnadh

Is dòcha gu bheil ceist agad: carson a bhios SQL a’ gairm GetTimePrecise cho tric?

Chan eil còd stòr an fhrithealaiche SQL agam, ach tha an loidsig ag ràdh seo. Is e siostam obrachaidh cha mhòr a th’ ann an SQL le airgead co-obrachail, far am feum gach snàithlean “toirt a-steach” bho àm gu àm. Càite bheil an t-àite as fheàrr airson seo a dhèanamh? Far a bheil feitheamh nàdarra - glas no IO. Ceart gu leòr, ach dè ma tha sinn a’ snìomh lùban coimpiutaireachd? An uairsin tha an t-àite follaiseach agus cha mhòr a-mhàin anns an eadar-theangair (chan e fìor eadar-theangair a tha seo), às deidh an ath aithris a chuir an gnìomh.

San fharsaingeachd, chan eil frithealaiche SQL air a chleachdadh airson ìnean coimpiutaireachd fìor agus chan eil seo na dhuilgheadas. Ach bidh lùban a bhios ag obair le gach seòrsa de chlàran sealach (a tha air an tasgadh sa bhad) a’ tionndadh a’ chòd gu sreath de dh’ aithrisean air an cur gu bàs gu math luath.

Air an t-slighe, ma phaisg thu an gnìomh ann an NATIVELY COMPILED, an uairsin stadaidh e ag iarraidh ùine, agus bidh an astar aige ag àrdachadh amannan 10. Dè mu dheidhinn ioma-obair co-obrachail? Ach airson còd a chaidh a chur ri chèile gu dùthchasach bha againn ri PREEMPTIVE MULTITASKING a dhèanamh ann an SQL.

Source: www.habr.com

Cuir beachd ann