Bẹẹni, kọǹpútà alágbèéká atijọ mi ni ọpọlọpọ igba diẹ sii lagbara ju olupin iṣelọpọ rẹ lọ

Iwọnyi ni deede awọn ẹdun ti Mo gbọ lati ọdọ awọn olupilẹṣẹ wa. Ohun ti o wuni julọ ni pe eyi ti jade lati jẹ otitọ, fifun iwadi ti o gun. A yoo sọrọ nipa awọn olupin SQL ti o nṣiṣẹ lori VMware.

Bẹẹni, kọǹpútà alágbèéká atijọ mi ni ọpọlọpọ igba diẹ sii lagbara ju olupin iṣelọpọ rẹ lọ

Lootọ, o rọrun lati rii daju pe olupin iṣelọpọ wa laini ireti lẹhin kọǹpútà alágbèéká naa. Ṣiṣẹ (kii ṣe lori tempdb kii ṣe lori data data pẹlu Agbara Idaduro ṣiṣẹ) koodu naa:

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

Lori tabili mi o gba iṣẹju-aaya 5, ati lori olupin iṣelọpọ o gba awọn aaya 28. Nitori SQL gbọdọ duro fun awọn ti ara opin ti awọn idunadura log titẹsi, ati awọn ti a ti wa ni ṣe gan kukuru lẹkọ nibi. Ni aijọju sọrọ, a wakọ nla kan, ọkọ nla ti o lagbara sinu ijabọ ilu, a si wo bi o ti gba ni iyalẹnu nipasẹ awọn eniyan ifijiṣẹ pizza lori awọn ẹlẹsẹ – igbejade ko ṣe pataki nibi, lairi nikan ṣe pataki. Ati pe ko si ibi ipamọ nẹtiwọki, laibikita iye awọn odo ti o wa ninu idiyele rẹ, le lu SSD agbegbe ni awọn ofin ti lairi.

(ninu awọn asọye o wa jade pe Mo purọ - Mo ti ṣe idaduro agbara ni awọn aaye mejeeji. Laisi idaduro idaduro o wa ni jade:
Ojú-iṣẹ - iṣẹju-aaya 39, 15K tr/aaya, 0.065ms/io roundtrip
PROD - 360 aaya, 1600 tr / iṣẹju-aaya, 0.6ms
Mo yẹ ki o ṣe akiyesi pe o yara ju)

Sibẹsibẹ, ninu ọran yii a n ṣe pẹlu awọn odo kekere ti iṣẹ Riemann zeta pẹlu apẹẹrẹ kekere kan. Ninu apẹẹrẹ ti awọn olupilẹṣẹ mu mi, o yatọ. Mo ni idaniloju pe wọn tọ, o si bẹrẹ si yọ kuro ninu apẹẹrẹ gbogbo awọn pato wọn ti o ni ibatan si iṣaro iṣowo. Ni aaye kan Mo rii pe MO le jabọ koodu wọn patapata ki o kọ ti ara mi - eyiti o ṣe afihan iṣoro kanna - ni iṣelọpọ o ṣiṣẹ awọn akoko 3-4 losokepupo:

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

Ti ohun gbogbo ba dara, lẹhinna ṣayẹwo primality ti nọmba kan yoo gba awọn aaya 6-7-8. Eyi ṣẹlẹ lori nọmba awọn olupin. Ṣugbọn lori diẹ ninu awọn, ayẹwo gba 25-40 aaya. O yanilenu, ko si awọn olupin nibiti ipaniyan yoo gba, sọ, awọn aaya 14 - koodu naa ṣiṣẹ boya yarayara tabi laiyara pupọ, iyẹn ni, iṣoro naa jẹ, jẹ ki a sọ, dudu ati funfun.

Kini Mo ti ṣe? Awọn metiriki VMware ti a lo. Ohun gbogbo ti wà itanran nibẹ - nibẹ je ohun opo ti oro, Setan akoko = 0, nibẹ wà to ti ohun gbogbo, nigba ti igbeyewo lori mejeeji sare ati ki o lọra olupin Sipiyu = 100 lori ọkan vCPU. Mo ṣe idanwo kan lati ṣe iṣiro nọmba Pi - idanwo naa fihan awọn abajade kanna lori olupin eyikeyi. Òórùn idán dúdú di alágbára àti okun.

Ni kete ti Mo de oko DEV, Mo bẹrẹ ṣiṣere pẹlu awọn olupin naa. O wa ni jade wipe vMotion lati ogun to gbalejo le “wosan” a olupin, sugbon o tun le tan a “sare” olupin sinu kan “lọra” kan. O dabi pe eyi ni - diẹ ninu awọn ọmọ-ogun ni iṣoro kan ... ṣugbọn ... rara. Diẹ ninu awọn foju ẹrọ je o lọra lori ogun, sọ A, ṣugbọn sise ni kiakia lori ogun B. Ati awọn miiran foju ẹrọ, ni ilodi si, sise ni kiakia lori A ati ki o fa fifalẹ lori B! Mejeeji awọn ẹrọ “yara” ati “lọra” nigbagbogbo n yi lori agbalejo naa!

Lati akoko yẹn lọ, oorun sulfur kan pato wa ninu afẹfẹ. Lẹhinna, iṣoro naa ko le ṣe ikawe si ẹrọ foju (awọn abulẹ Windows, fun apẹẹrẹ) - lẹhinna o yipada si “yara” pẹlu vMotion. Ṣugbọn iṣoro naa tun ko le ṣe ikawe si agbalejo - lẹhinna o le ni awọn ẹrọ “yara” ati “lọra” mejeeji. Paapaa, eyi ko ni ibatan si ẹru naa - Mo ṣakoso lati gba ẹrọ “o lọra” lori agbalejo naa, nibiti ko si nkankan rara laisi rẹ.

Ninu ainireti, Mo ṣe ifilọlẹ Process Explorer lati Sysinternals ati wo akopọ SQL. Lori awọn ẹrọ ti o lọra laini mu oju mi ​​lẹsẹkẹsẹ:

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::Pxlvl Rọpo+0x1a20
... fo
sqldk.dll!SystemThread :: MakeMiniSOSThread + 0xa54
KERNEL32.DLL!BaseThreadInitThunk + 0x14
ntdll.dll!RtlUserThreadBẹrẹ+0x21

Eyi jẹ nkan tẹlẹ. Eto naa ti kọ:

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

Eto yii ṣe afihan idinku paapaa diẹ sii - lori awọn ẹrọ “yara” o fihan awọn iyipo miliọnu 16-18 fun iṣẹju kan, lakoko ti o wa lori awọn ẹrọ ti o lọra o ṣafihan miliọnu kan ati idaji, tabi paapaa 700 ẹgbẹrun. Iyẹn ni, iyatọ jẹ awọn akoko 10-20 (!!!). Eyi jẹ iṣẹgun kekere tẹlẹ: ni eyikeyi ọran, ko si irokeke diduro laarin Microsoft ati atilẹyin VMware ki wọn yoo tan awọn ọfa si ara wọn.

Lẹhinna ilọsiwaju duro - awọn isinmi, awọn ọran pataki, hysteria viral ati ilosoke didasilẹ ni iwuwo iṣẹ. Nigbagbogbo Mo mẹnuba iṣoro idan si awọn ẹlẹgbẹ mi, ṣugbọn ni awọn akoko o dabi pe wọn ko paapaa gbagbọ nigbagbogbo - alaye ti VMware fa fifalẹ koodu naa nipasẹ awọn akoko 10-20 jẹ ohun ibanilẹru pupọ.

Mo gbiyanju lati wa ara mi jade ohun ti o fa fifalẹ mi. Ni awọn igba o dabi fun mi pe Mo ti rii ojutu kan - titan Awọn pilogi Gbona tan ati pa, yiyipada iye iranti tabi nọmba awọn olutọsọna nigbagbogbo yi ẹrọ naa pada si “iyara” kan. Sugbon ko lailai. Ṣugbọn ohun ti o yipada lati jẹ otitọ ni pe o to lati jade lọ ki o kan kẹkẹ - iyẹn ni, iyipada любой paramita ẹrọ foju

Nikẹhin, awọn ẹlẹgbẹ Amẹrika mi lojiji ri idi gbongbo.

Bẹẹni, kọǹpútà alágbèéká atijọ mi ni ọpọlọpọ igba diẹ sii lagbara ju olupin iṣelọpọ rẹ lọ

Awọn ogun ti yato ni igbohunsafẹfẹ!

  • Bi ofin, eyi kii ṣe nkan nla. Ṣugbọn: nigba gbigbe lati ile-iṣẹ 'abinibi' kan si agbalejo kan pẹlu igbohunsafẹfẹ 'o yatọ', VMware gbọdọ ṣatunṣe abajade GetTimePrecise naa.
  • Gẹgẹbi ofin, eyi kii ṣe iṣoro, ayafi ti ohun elo kan wa ti o beere akoko gangan awọn miliọnu awọn akoko fun iṣẹju keji, bii olupin SQL.
  • Ṣugbọn eyi kii ṣe idẹruba, nitori olupin SQL kii ṣe eyi nigbagbogbo (wo Ipari)

Ṣugbọn awọn ọran wa nigbati rake yii kọlu lile. Ati sibẹsibẹ, bẹẹni, nipa titẹ ni kia kia lori kẹkẹ (nipa yiyipada ohunkan ninu awọn eto VM) Mo fi agbara mu VMware lati 'ṣatunṣe' iṣeto ni, ati igbohunsafẹfẹ ti agbalejo lọwọlọwọ di igbohunsafẹfẹ 'abinibi' ti ẹrọ naa.

Ipinnu

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

Nigbati o ba mu agbara agbara ti TSC kuro, kika TSC lati inu ẹrọ foju pada iye TSC ẹrọ ti ara, ati kikọ TSC lati inu ẹrọ foju ko ni ipa. Lilọ kiri ẹrọ foju kan si agbalejo miiran, tun bẹrẹ lati ipo idaduro, tabi yi pada si fọtoyiya kan fa TSC lati fo ni idaduro. Diẹ ninu awọn ọna ṣiṣe alejo kuna lati bata, tabi ṣafihan awọn iṣoro ṣiṣe akoko miiran, nigbati agbara agbara TSC jẹ alaabo. Ni atijo, ẹya ara ẹrọ yi ti ni igba miiran niyanju lati mu iṣẹ awọn ohun elo ti o ka TSC nigbagbogbo, ṣugbọn iṣẹ ti TSC foju ti ni ilọsiwaju ni pataki ni awọn ọja lọwọlọwọ. Ẹya naa tun ti ṣeduro fun lilo nigba ṣiṣe awọn wiwọn ti o nilo orisun kongẹ ti akoko gidi ninu ẹrọ foju.

Ni kukuru, o nilo lati ṣafikun paramita naa

Monitor_control.virtual_rdtsc = FALSE

ipari

O ṣee ṣe ki o ni ibeere kan: kilode ti SQL n pe GetTimePrecise nigbagbogbo?

Emi ko ni SQL olupin koodu, ṣugbọn awọn kannaa wi yi. SQL fẹrẹ jẹ ẹrọ ṣiṣe pẹlu owo ifọwọsowọpọ, nibiti o tẹle ara kọọkan gbọdọ “fun ni” lati igba de igba. Nibo ni ibi ti o dara julọ lati ṣe eyi? Nibo ni idaduro adayeba wa - titiipa tabi IO. O dara, ṣugbọn kini ti a ba n yi awọn losiwajulosehin iṣiro? Lẹhinna aaye ti o han gbangba ati pe o fẹrẹẹ nikan wa ni onitumọ (eyi kii ṣe onitumọ gaan), lẹhin ṣiṣe alaye ti o tẹle.

Ni gbogbogbo, olupin SQL ko lo fun eekanna iširo mimọ ati eyi kii ṣe iṣoro. Ṣugbọn awọn losiwajulosehin ti o ṣiṣẹ pẹlu gbogbo iru awọn tabili igba diẹ (eyiti o jẹ cache lẹsẹkẹsẹ) yi koodu pada si ọna ti awọn alaye ṣiṣe ni iyara pupọ.

Nipa ọna, ti o ba fi ipari si iṣẹ naa ni NTIVELY COMPiled, lẹhinna o dawọ beere fun akoko, iyara rẹ si pọ sii nipasẹ awọn akoko 10. Kini nipa iṣọpọ multitasking? Ṣugbọn fun koodu ti a ṣakojọ abinibi a ni lati ṣe MULTITASKING PREEMPTIVE ni SQL.

orisun: www.habr.com

Fi ọrọìwòye kun