์˜ˆ, ์ œ ์˜ค๋ž˜๋œ ๋…ธํŠธ๋ถ์€ ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„๋ณด๋‹ค ๋ช‡ ๋ฐฐ ๋” ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ œ๊ฐ€ ๊ฐœ๋ฐœ์ž๋“ค๋กœ๋ถ€ํ„ฐ ๋“ค์—ˆ๋˜ ๋ถˆ๋งŒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํฅ๋ฏธ๋กœ์šด ์ ์€ ์ด๊ฒƒ์ด ์‚ฌ์‹ค๋กœ ๋ฐํ˜€์ ธ ์˜ค๋žœ ์กฐ์‚ฌ๊ฐ€ ์ด์–ด์กŒ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. VMware์—์„œ ์‹คํ–‰๋˜๋Š” SQL ์„œ๋ฒ„์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์ œ ์˜ค๋ž˜๋œ ๋…ธํŠธ๋ถ์€ ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„๋ณด๋‹ค ๋ช‡ ๋ฐฐ ๋” ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„๊ฐ€ ์ ˆ๋ง์ ์œผ๋กœ ๋…ธํŠธ๋ถ ๋’ค์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค(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์€ ํŠธ๋žœ์žญ์…˜ ๋กœ๊ทธ ํ•ญ๋ชฉ์˜ ๋ฌผ๋ฆฌ์  ๋์„ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ๋Š” ๋งค์šฐ ์งง์€ ํŠธ๋žœ์žญ์…˜์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋žต์ ์œผ๋กœ ๋งํ•˜๋ฉด, ์šฐ๋ฆฌ๋Š” ํฌ๊ณ  ๊ฐ•๋ ฅํ•œ ํŠธ๋Ÿญ์„ ๋„์‹œ ๊ตํ†ต์œผ๋กœ ๋ชฐ๊ณ  ์Šค์ฟ ํ„ฐ๋ฅผ ํƒ„ ํ”ผ์ž ๋ฐฐ๋‹ฌ์›์ด ๊ธ‰ํžˆ ์ถ”์›”ํ•˜๋Š” ๊ฒƒ์„ ์ง€์ผœ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ฒ˜๋ฆฌ๋Ÿ‰์€ ์ค‘์š”ํ•˜์ง€ ์•Š๊ณ  ๋Œ€๊ธฐ ์‹œ๊ฐ„๋งŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€๊ฒฉ์— XNUMX์ด ์•„๋ฌด๋ฆฌ ๋งŽ์ด ์žˆ์–ด๋„ ์ง€์—ฐ ์‹œ๊ฐ„ ์ธก๋ฉด์—์„œ ๋กœ์ปฌ SSD๋ฅผ ๋Šฅ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋„คํŠธ์›Œํฌ ์Šคํ† ๋ฆฌ์ง€๋Š” ์—†์Šต๋‹ˆ๋‹ค.

(๋Œ“๊ธ€์—์„œ ๋‚ด๊ฐ€ ๊ฑฐ์ง“๋ง์„ ํ•œ ๊ฒƒ์œผ๋กœ ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ณณ ๋ชจ๋‘์—์„œ ๋‚ด๊ตฌ์„ฑ์ด ์ง€์—ฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ตฌ์„ฑ์ด ์ง€์—ฐ๋˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค.
๋ฐ์Šคํฌํƒ‘ - 39์ดˆ, 15K tr/์ดˆ, 0.065ms/io ์™•๋ณต
PROD - 360์ดˆ, 1600tr/์ดˆ, 0.6ms
๋„ˆ๋ฌด ๋น ๋ฅด๋‹ค๋Š” ๊ฑธ ๋ˆˆ์น˜์ฑ˜์–ด์•ผ ํ–ˆ๋Š”๋ฐ)

๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์†Œํ•œ ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฆฌ๋งŒ ์ œํƒ€ ํ•จ์ˆ˜์˜ ์‚ฌ์†Œํ•œ 3์„ ๋‹ค๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ€์ ธ์˜จ ์˜ˆ์—์„œ๋Š” ๋‹ฌ๋ž์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์ด ์˜ณ๋‹ค๊ณ  ํ™•์‹ ํ–ˆ๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์˜ˆ์ œ์—์„œ ์ œ๊ฑฐํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋Š ์‹œ์ ์—์„œ ๋‚˜๋Š” ๊ทธ๋“ค์˜ ์ฝ”๋“œ๋ฅผ ์™„์ „ํžˆ ๋ฒ„๋ฆฌ๊ณ  ๋‚ด ์ž์‹ ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ ์ฃผ๋ฉฐ ํ”„๋กœ๋•์…˜์—์„œ๋Š” 4-XNUMX๋ฐฐ ๋Š๋ฆฌ๊ฒŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

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, ๋ชจ๋“  ๊ฒƒ์ด ์ถฉ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋น ๋ฅธ ์„œ๋ฒ„์™€ ๋Š๋ฆฐ ์„œ๋ฒ„ ๋ชจ๋‘์—์„œ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋™์•ˆ ํ•˜๋‚˜์˜ vCPU์—์„œ CPU = 100์ด์—ˆ์Šต๋‹ˆ๋‹ค. Pi ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋Š” ๋ชจ๋“  ์„œ๋ฒ„์—์„œ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ํ‘๋งˆ๋ฒ•์˜ ๋ƒ„์ƒˆ๊ฐ€ ์ ์  ๊ฐ•ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

DEV ํŒœ์— ๋„์ฐฉํ•˜์ž๋งˆ์ž ์„œ๋ฒ„๋ฅผ ๊ฐ€์ง€๊ณ  ๋†€๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ ๊ฐ„ vMotion์€ ์„œ๋ฒ„๋ฅผ "์น˜๋ฃŒ"ํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ "๋น ๋ฅธ" ์„œ๋ฒ„๋ฅผ "๋Š๋ฆฐ" ์„œ๋ฒ„๋กœ ์ „ํ™˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ˜ธ์ŠคํŠธ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค... ํ•˜์ง€๋งŒ... ์•„๋‹™๋‹ˆ๋‹ค. ์ผ๋ถ€ ๊ฐ€์ƒ ๋จธ์‹ ์€ ํ˜ธ์ŠคํŠธ A์—์„œ๋Š” ๋Š๋ฆฌ์ง€๋งŒ ํ˜ธ์ŠคํŠธ B์—์„œ๋Š” ๋น ๋ฅด๊ฒŒ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๋˜ ๋‹ค๋ฅธ ๊ฐ€์ƒ ๋จธ์‹ ์€ A์—์„œ๋Š” ๋น ๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๊ณ  B์—์„œ๋Š” ์†๋„๊ฐ€ ๋Š๋ ค์กŒ์Šต๋‹ˆ๋‹ค! "๋น ๋ฅธ" ๋จธ์‹ ๊ณผ "๋Š๋ฆฐ" ๋จธ์‹  ๋ชจ๋‘ ํ˜ธ์ŠคํŠธ์—์„œ ํšŒ์ „ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค!

๊ทธ ์ˆœ๊ฐ„๋ถ€ํ„ฐ ๊ณต๊ธฐ ์ค‘์—๋Š” ๋šœ๋ ทํ•œ ์œ ํ™ฉ ๋ƒ„์ƒˆ๊ฐ€ ๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋ฌธ์ œ๋Š” ๊ฐ€์ƒ ๋จธ์‹ (์˜ˆ: Windows ํŒจ์น˜)์œผ๋กœ ์ธํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ vMotion์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ "๋น ๋ฅด๊ฒŒ" ๋ณ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ๋Š” ํ˜ธ์ŠคํŠธ์— ๊ธฐ์ธํ•  ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ํ˜ธ์ŠคํŠธ์—๋Š” "๋น ๋ฅธ" ์‹œ์Šคํ…œ๊ณผ "๋Š๋ฆฐ" ์‹œ์Šคํ…œ์ด ๋ชจ๋‘ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๊ฒƒ์€ ๋กœ๋“œ์™€ ๊ด€๋ จ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ์—์„œ ๊ทธ ์™ธ์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” "๋Š๋ฆฐ" ๋จธ์‹ ์„ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•„์‚ฌ์ ์œผ๋กœ Sysinternals์—์„œ Process Explorer๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  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~XNUMX๋ฐฐ(!!!) ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด๋ฏธ ์ž‘์€ ์Šน๋ฆฌ์˜€์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  Microsoft์™€ VMware ์ง€์› ์‚ฌ์ด์— ๊ฐ‡ํ˜€ ์„œ๋กœ์—๊ฒŒ ํ™”์‚ด์„ ๋Œ๋ฆด ์œ„ํ˜‘์€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ํœด๊ฐ€, ์ค‘์š”ํ•œ ๋ฌธ์ œ, ๋ฐ”์ด๋Ÿฌ์Šค ์„ฑ ํžˆ์Šคํ…Œ๋ฆฌ ๋ฐ ์ž‘์—…๋Ÿ‰์˜ ๊ธ‰๊ฒฉํ•œ ์ฆ๊ฐ€ ๋“ฑ ์ง„ํ–‰์ด ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ข…์ข… ๋™๋ฃŒ๋“ค์—๊ฒŒ ๋งˆ๋ฒ• ๊ฐ™์€ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ ๋•Œ๋กœ๋Š” ๊ทธ๋“ค์ด ๋‚ด ๋ง์„ ํ•ญ์ƒ ๋ฏฟ์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. VMware๊ฐ€ ์ฝ”๋“œ ์†๋„๋ฅผ 10~20๋ฐฐ ๋Šฆ์ถ˜๋‹ค๋Š” ์ง„์ˆ ์€ ๋„ˆ๋ฌด ๋”์ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‚˜๋ฅผ ๋Š๋ฆฌ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์Šค์Šค๋กœ ์•Œ์•„๋‚ด๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์€ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ํ•ซ ํ”Œ๋Ÿฌ๊ทธ๋ฅผ ์ผœ๊ณ  ๋„๊ณ , ๋ฉ”๋ชจ๋ฆฌ ์–‘์ด๋‚˜ ํ”„๋กœ์„ธ์„œ ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์ข…์ข… ์ปดํ“จํ„ฐ๊ฐ€ "๋น ๋ฅธ" ์ปดํ“จํ„ฐ๋กœ ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜์›ํžˆ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์‹ค๋กœ ๋ฐํ˜€์ง„ ๊ฒƒ์€ ๋‚˜๊ฐ€์„œ ๋ฐ”ํ€ด๋ฅผ ๋‘๋“œ๋ฆฌ๋Š” ๊ฒƒ, ์ฆ‰ ๋ณ€ํ™”ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฐ€์ƒ ๋จธ์‹  ๋งค๊ฐœ๋ณ€์ˆ˜

๋งˆ์นจ๋‚ด ๋ฏธ๊ตญ ๋™๋ฃŒ๋“ค์ด ๊ฐ‘์ž๊ธฐ ๊ทผ๋ณธ ์›์ธ์„ ์ฐพ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์ œ ์˜ค๋ž˜๋œ ๋…ธํŠธ๋ถ์€ ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„๋ณด๋‹ค ๋ช‡ ๋ฐฐ ๋” ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค.

ํ˜ธ์ŠคํŠธ์˜ ๋นˆ๋„๊ฐ€ ๋‹ฌ๋ž์Šต๋‹ˆ๋‹ค!

  • ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๊ฒƒ์€ ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ '๋„ค์ดํ‹ฐ๋ธŒ' ํ˜ธ์ŠคํŠธ์—์„œ '๋‹ค๋ฅธ' ๋นˆ๋„๋ฅผ ๊ฐ€์ง„ ํ˜ธ์ŠคํŠธ๋กœ ์ด๋™ํ•  ๋•Œ VMware๋Š” GetTimePrecise ๊ฒฐ๊ณผ๋ฅผ ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ SQL ์„œ๋ฒ„์ฒ˜๋Ÿผ ์ดˆ๋‹น ์ˆ˜๋ฐฑ๋งŒ ๋ฒˆ์”ฉ ์ •ํ™•ํ•œ ์‹œ๊ฐ„์„ ์š”์ฒญํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์—†๋‹ค๋ฉด ์ด๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ SQL Server๊ฐ€ ํ•ญ์ƒ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Š” ๋‘๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๊ฒฐ๋ก  ์ฐธ์กฐ).

ํ•˜์ง€๋งŒ ์ด ๊ฐˆํ€ด๊ฐ€ ํฐ ํƒ€๊ฒฉ์„ ์ž…๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํœ ์„ ํƒญํ•˜์—ฌ(VM ์„ค์ •์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ) VMware๊ฐ€ ๊ตฌ์„ฑ์„ '๋‹ค์‹œ ๊ณ„์‚ฐ'ํ•˜๋„๋ก ๊ฐ•์ œํ–ˆ๊ณ  ํ˜„์žฌ ํ˜ธ์ŠคํŠธ์˜ ์ฃผํŒŒ์ˆ˜๊ฐ€ ์‹œ์Šคํ…œ์˜ '๊ธฐ๋ณธ' ์ฃผํŒŒ์ˆ˜๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ์ •

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

TSC์˜ ๊ฐ€์ƒํ™”๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ๊ฐ€์ƒ ๋จธ์‹  ๋‚ด์—์„œ TSC๋ฅผ ์ฝ์œผ๋ฉด ๋ฌผ๋ฆฌ์  ๋จธ์‹ ์˜ TSC ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜๊ณ , ๊ฐ€์ƒ ๋จธ์‹  ๋‚ด์—์„œ TSC๋ฅผ ์“ฐ๋ฉด ์•„๋ฌด๋Ÿฐ ํšจ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ€์ƒ ๋จธ์‹ ์„ ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ฑฐ๋‚˜, ์ผ์‹œ ์ค‘์ง€๋œ ์ƒํƒœ์—์„œ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜, ์Šค๋ƒ…์ƒท์œผ๋กœ ๋˜๋Œ๋ฆฌ๋ฉด TSC๊ฐ€ ์—ฐ์†์ ์œผ๋กœ ์ ํ”„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. TSC ๊ฐ€์ƒํ™”๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋˜๋ฉด ์ผ๋ถ€ ๊ฒŒ์ŠคํŠธ ์šด์˜ ์ฒด์ œ๊ฐ€ ๋ถ€ํŒ…๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์‹œ๊ฐ„ ์œ ์ง€ ๋ฌธ์ œ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์—๋Š” TSC๋ฅผ ์ž์ฃผ ์ฝ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ด ๊ธฐ๋Šฅ์ด ๊ถŒ์žฅ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค., ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ์ œํ’ˆ์—์„œ๋Š” ๊ฐ€์ƒ TSC์˜ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ๊ธฐ๋Šฅ์€ ๊ฐ€์ƒ ๋จธ์‹ ์—์„œ ์ •ํ™•ํ•œ ์‹ค์‹œ๊ฐ„ ์†Œ์Šค๊ฐ€ ํ•„์š”ํ•œ ์ธก์ •์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ฆ‰, ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

monitor_control.virtual_rdtsc = ๊ฑฐ์ง“

๊ฒฐ๋ก 

์•„๋งˆ๋„ ์งˆ๋ฌธ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. SQL์ด GetTimePrecise๋ฅผ ์™œ ๊ทธ๋ ‡๊ฒŒ ์ž์ฃผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๊นŒ?

SQL Server ์†Œ์Šค ์ฝ”๋“œ๋Š” ์—†์ง€๋งŒ ๋…ผ๋ฆฌ์— ๋”ฐ๋ฅด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. SQL์€ ๊ฑฐ์˜ ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋•Œ๋•Œ๋กœ "ํฌ๊ธฐ"ํ•ด์•ผ ํ•˜๋Š” ํ˜‘๋ ฅ์  ๋™์‹œ์„ฑ์„ ๊ฐ–์ถ˜ ์šด์˜ ์ฒด์ œ์ž…๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ์žฅ์†Œ๋Š” ์–ด๋””์ž…๋‹ˆ๊นŒ? ์ž์—ฐ์Šค๋Ÿฌ์šด ๋Œ€๊ธฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ - ์ž ๊ธˆ ๋˜๋Š” IO. ์ข‹์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ณ„์‚ฐ ๋ฃจํ”„๋ฅผ ํšŒ์ „์‹œํ‚ค๋ฉด ์–ด๋–จ๊นŒ์š”? ๊ทธ๋ ‡๋‹ค๋ฉด ๋ช…๋ฐฑํ•˜๊ณ  ๊ฑฐ์˜ ์œ ์ผํ•œ ์œ„์น˜๋Š” ๋‹ค์Œ ๋ช…๋ น๋ฌธ์„ ์‹คํ–‰ํ•œ ํ›„ ์ธํ„ฐํ”„๋ฆฌํ„ฐ(์‹ค์ œ๋กœ๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค)์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ SQL Server๋Š” ์ˆœ์ˆ˜ ์ปดํ“จํŒ… ๋„ค์ผ๋ง์— ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ ์ด๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ž„์‹œ ํ…Œ์ด๋ธ”(์ฆ‰์‹œ ์บ์‹œ๋จ)๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๋ฃจํ”„๋Š” ์ฝ”๋“œ๋ฅผ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋˜๋Š” ์ผ๋ จ์˜ ๋ช…๋ น๋ฌธ์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ํ•จ์ˆ˜๋ฅผ NATIVELY COMPILED๋กœ ๋ž˜ํ•‘ํ•˜๋ฉด ์‹œ๊ฐ„ ์š”์ฒญ์ด ์ค‘๋‹จ๋˜๊ณ  ์†๋„๊ฐ€ 10๋ฐฐ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํ˜‘๋™์  ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ SQL์—์„œ PREEMPTIVE MULTITASKING์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€