Izany indrindra no fitarainana henoko tamin'ny developer anay. Ny tena mahaliana dia ny hoe marina izany, ka niteraka fanadihadiana lava. Hiresaka momba ireo mpizara SQL mandeha amin'ny VMware isika.

Raha ny marina, mora ny miantoka fa ny mpizara famokarana dia tsy misy antenaina ao ambadiky ny solosaina finday. Ataovy (tsy amin'ny tempdb fa tsy amin'ny angon-drakitra miaraka amin'ny Delayed Durability) ny code:
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
Ao amin'ny biraoko dia mila 5 segondra, ary amin'ny serivera famokarana dia 28 segondra. Satria ny SQL dia tsy maintsy miandry ny fiafaran'ny fidiran'ny log transaction, ary manao fifampiraharahana fohy eto izahay. Raha lazaina amin'ny teny fohy dia nitondra kamiao lehibe iray mahery vaika izahay tamin'ny fifamoivoizana an-tanàn-dehibe, ary nijery fa nosongonan'ny olona mpanatitra pizza tamin'ny scooter izy io - tsy zava-dehibe ny fivezivezena eto, fa ny fahatarana ihany no zava-dehibe. Ary tsy misy fitahirizana tambajotra, na firy na firy ny zero amin'ny vidiny, dia afaka mandresy ny SSD eo an-toerana amin'ny resaka latency.
(ao amin'ny fanehoan-kevitra dia hita fa nandainga aho - nanemotra ny faharetana tamin'ireo toerana roa ireo aho.
Desktop - 39 segondra, 15K tr/sec, 0.065ms/io dia mandroso sy miverina
PROD - 360 segondra, 1600 tr/s, 0.6ms
Tokony ho voamariko fa haingana loatra izany)
Na izany aza, amin'ity tranga ity isika dia miatrika aotra tsy misy dikany amin'ny asan'ny Riemann zeta miaraka amin'ny ohatra tsy dia misy dikany. Ao amin'ny ohatra nentin'ireo mpamorona ahy dia hafa izany. Resy lahatra aho fa marina izy ireo, ary nanomboka nanaisotra tamin'ny ohatra ny mombamomba azy rehetra mifandraika amin'ny lojika fandraharahana. Tamin'ny fotoana iray dia tsapako fa afaka manary tanteraka ny kaody aho ary manoratra ny tenako - izay mampiseho olana mitovy amin'izany - amin'ny famokarana dia mandeha in-3-4 miadana kokoa:
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
GORaha milamina ny zava-drehetra, dia haharitra 6-7-8 segondra ny fanamarinana ny primality. Izany no nitranga tamin'ilay andian-dahatsoratra. lohamilinaSaingy tamin'ny mpizara sasany, naharitra 25-40 segondra ny fanamarinana. Mahaliana fa tsy nisy mpizara izay naharitra, ohatra, 14 segondra ny fanatanterahana azy—na haingana dia haingana na miadana dia miadana ny kaody, midika izany fa azo lazaina fa mainty sy fotsy ny olana.
Izay nataoko? Famaritana VMware ampiasaina. Tsara daholo ny zava-drehetra tao - nisy loharanon-karena be dia be, fotoana vonona = 0, ampy ny zava-drehetra, nandritra ny fitsapana amin'ny mpizara haingana sy miadana CPU = 100 amin'ny vCPU iray. Nanao fitsapana aho mba kajy ny isa Pi - ny fitsapana dia naneho valiny mitovy amin'ny mpizara rehetra. Nihanahery hatrany ny fofon’ny ody mainty.
Rehefa tonga tany amin'ny toeram-pambolena DEV aho dia nanomboka nilalao tamin'ireo mpizara. Hita fa ny vMotion avy amin'ny mpampiantrano mankany amin'ny mpampiantrano dia afaka "manasitrana" mpizara, saingy afaka mamadika mpizara "faingana" ho lasa "miadana". Toa izao no izy - manana olana ny mpampiantrano sasany... fa... tsia. Ny milina virtoaly sasany dia niadana tamin'ny mpampiantrano, hoy i A, fa niasa haingana tamin'ny mpampiantrano B. Ary ny milina virtoaly iray hafa, ny mifanohitra amin'izany, dia niasa haingana tamin'ny A ary nihena ny B! Na ny milina "haingana" na "miadana" dia matetika mihodina amin'ny mpampiantrano!
Nanomboka tamin’izay fotoana izay dia nisy fofona solifara miavaka teny amin’ny rivotra. Raha ny marina, ny olana dia tsy azo lazaina amin'ny milina virtoaly (Windows patches, ohatra) - na izany aza, dia nivadika ho "faingana" miaraka amin'ny vMotion. Saingy ny olana dia tsy azo lazaina ho an'ny mpampiantrano - na izany aza, mety manana milina "faingana" sy "miadana". Ary koa, tsy misy ifandraisany amin'ny enta-mavesatra izany - nahavita nahazo milina "miadana" aho tamin'ny mpampiantrano, izay tsy nisy na inona na inona afa-tsy izany.
Noho ny famoizam-po dia nanangana Process Explorer avy amin'ny Sysinternals aho ary nijery ny stack SQL. Tamin'ny milina miadana dia nanintona ny masoko avy hatrany ny tsipika:
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
... nitsambikina
sqldk.dll!SystemThread::MakeMiniSOSThread+0xa54
KERNEL32.DLL!BaseThreadInitThunk+0x14
ntdll.dll!RtlUserThreadStart+0x21
Efa zavatra izany. Ny fandaharana dia nosoratana:
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);
}
}
}
}Ity programa ity dia nampiseho fihenam-bidy kokoa - amin'ny milina "faingana" dia mampiseho tsingerina 16-18 tapitrisa isan-tsegondra, raha amin'ny milina miadana kosa dia mampiseho iray tapitrisa sy sasany, na 700 arivo mihitsy aza. Izany hoe in-10-20 ny fahasamihafana (!!!). Fandresena kely sahady izany: na izany na tsy izany, tsy nisy fandrahonana ho tafahitsoka eo amin'ny fanohanan'ny Microsoft sy ny VMware ka hifamadika zana-tsipìka.
Avy eo dia nijanona ny fandrosoana - fialan-tsasatra, zava-dehibe, viriosy hysteria ary fitomboan'ny enta-mavesatra. Matetika aho no niresaka momba ny olan'ny majika tamin'ny mpiara-miasa amiko, saingy indraindray toa tsy nino ahy foana izy ireo - ny fanambarana fa ny VMware dia mampiadana ny kaody in-10-20 dia mahery loatra.
Niezaka nanalavitra ny tenako aho izay nampiadana ahy. Indraindray dia toa nahita vahaolana aho - ny fampidinana sy ny famonoana ny plug Hot, ny fanovana ny habetsaky ny fitadidiana na ny isan'ny processeur matetika dia namadika ilay milina ho "faingana". Fa tsy mandrakizay. Saingy ny zava-misy dia ny hoe ampy ny mivoaka sy mandondòna eo amin'ny kodiarana - izany hoe miova misy masontsivana milina virtoaly
Farany, hitan'ireo Amerikana mpiara-miasa amiko tampoka ny fototry ny antony.

Samy hafa ny fatran'ny matetika!
- Amin'ny maha-fitsipika azy dia tsy zava-dehibe izany. Saingy: rehefa mifindra avy amin'ny mpampiantrano 'teratany' mankany amin'ny mpampiantrano manana fatran'ny 'hafa', ny VMware dia tsy maintsy manitsy ny valin'ny GetTimePrecise.
- Amin'ny maha-fitsipika, tsy olana izany, raha tsy misy fampiharana izay mangataka ny fotoana marina in-tapitrisa isan-tsegondra, toy ny SQL server.
- Saingy tsy mampatahotra izany, satria tsy manao izany foana ny mpizara SQL (jereo Fehiny)
Saingy misy toe-javatra rehefa mamely mafy ity raikipohy ity. Ary na izany aza, eny, tamin'ny fipihana ny kodia (tamin'ny fanovana zavatra ao amin'ny VM Settings) dia nanery ny VMware 'hamerina' ny configuration aho, ary ny fatran'ny mpampiantrano amin'izao fotoana izao dia lasa matetika 'teratany' an'ny milina.
fanapahan-kevitra
Rehefa esorinao ny virtoaly ny TSC, ny famakiana ny TSC avy ao anaty milina virtoaly dia mamerina ny sandan'ny TSC an'ny milina ara-batana, ary ny fanoratana ny TSC avy ao anaty milina virtoaly dia tsy misy vokany. Ny fifindrana ny milina virtoaly mankany amin'ny mpampiantrano hafa, ny famerenana azy amin'ny fanjakana mihantona, na ny fiverenana amin'ny sary dia mahatonga ny TSC hitsambikina tsy miato. Ny rafitra fiasan'ny vahiny sasany dia tsy mandeha, na mampiseho olana ara-potoana hafa, rehefa tsy mandeha ny virtoaly TSC. Taloha, ity endri-javatra ity dia natolotra indraindray mba hanatsarana ny fahombiazan'ny fampiharana izay mamaky matetika ny TSC, fa ny fahombiazan'ny TSC virtoaly dia nihatsara be tamin'ny vokatra ankehitriny. Ny endri-javatra dia natolotra ihany koa mba hampiasaina rehefa manao fandrefesana izay mitaky loharano mazava amin'ny fotoana tena izy ao amin'ny milina virtoaly.
Raha fintinina dia mila manampy ny parameter ianao
monitor_control.virtual_rdtsc = DISO
famaranana
Mety manana fanontaniana ianao: nahoana ny SQL no miantso ny GetTimePrecise matetika?
Tsy manana ny kaody loharanon'ny mpizara SQL aho, fa ny lojika dia milaza izany. SQL dia saika rafitra miasa miaraka amin'ny fifanarahana fiaraha-miasa, izay tsy maintsy "manome" tsindraindray ny kofehy tsirairay. Aiza no toerana tsara indrindra hanaovana izany? Aiza no misy fiandrasana voajanahary - hidin-trano na IO. Eny ary, fa ahoana kosa raha manodinkodina loopina kajy isika? Avy eo ny toerana mazava sy saika hany tokana dia ao amin'ny mpandika teny (tsy tena mpandika teny izany), rehefa avy nanatanteraka ny fanambarana manaraka.
Amin'ny ankapobeny, ny mpizara SQL dia tsy ampiasaina amin'ny fantsika informatika madio ary tsy olana izany. Fa ny tadivavarana izay miasa amin'ny karazana latabatra vonjimaika rehetra (izay voatahiry avy hatrany) dia mamadika ny kaody ho filaharan'ireo fanambarana vita haingana.
Raha ny tokony ho izy, raha fehezinao amin'ny NATIVELY COMPILED ny fiasa dia mijanona amin'ny fangatahana fotoana izy, ary mitombo avo 10 heny ny hafainganam-pandehany. Fa ho an'ny kaody nanangona teratany dia tsy maintsy nanao PREEMPTIVE MULTITASKING amin'ny SQL izahay.
Source: www.habr.com
