NTP에서 시간을 수정하는 방법

출처: http://www.atmarkit.co.jp/ait/articles/1203/15/news121_2.html 

NTP와 시간을 수정하는 방법에는 두 가지가 있다.

Slew 방식의 동작은 시간이 너무 앞서 가 있는 경우, 즉시 올바른 날짜를 수정하는 것이 아니라, 예를 들어 1 초 시간이 경과 할 곳을 0.5 초 밖에 진행한다 라고 "시간의 진전을 지연" 하는 것으로, 「시간의 퇴보' 가 발생하지 않도록한다 (지연 되는 경우는 이 반대의 경우). 데이터베이스의 트랜잭션을 기록한 로그처럼 각 요소의 전후 관계를 시간 소인으로 확인하는 방법에 있어서는, 「시간의 퇴보' 가 발생하면 치명적인 문제가 되기 때문에 이렇게 조금씩 맞춰 가는 방식이 이용된다.

Windows OS에서는 상황에 따라 이 두 가지 방법을 구사하고 있다.

Windows OS에서 시간 동기화 기능

Windows OS에서 시간 동기화 메커니즘은 처음부터 NTP를 사용했던 것은 아니다. Windows NT에서 net time 명령을 사용하여 SMB 프로토콜을 이용한 시간 동기화가 이루어지고 있었지만, 이것은 시스템 요구 사항이 아니었다(별도 제공되는 ntp.exe 명령이 있는데, 이것은 예외적인 사용이다).

Active Directory를 처음으로 구현한 Windows 2000 SNTP(NTP의 일부 버전)이 채택 되었다. Active Directory는 Kerberos 인증이 이용되고 있지만, Kerberos 인증 서버와 클라이언트 사이의 시간이 일치해야 하므로 이것을 위해 시간 동기화가 필수 기능이 되었기 때문이다.

NTP를 사용되게 된 것은 Windows Server 2003 에서 이다.

일반적으로 NTP 의한 시간의 차이는 1/1000 초(1ms) 아래 수준에서 고려되고 있으며, UNIX 기반의 NTP 서버 (ntpd : NTP 데몬)에서는 이러한 배경을 바탕으로 프로그램이 구현되어있다. 즉, 일단 정확한 시간을 맞추면 나머지는 조금씩 조정하여 정확도를 유지하려고 한다. 예를 들어 slew 모드에서 작동 할 때, 아무리 많아도 초당 0.5ms 밖에 시간의 차이를 조정하지 않는다(그래서 하루에 최대로 43 초만 시간을 늦출 수 있다). 이렇게함으로써, 전술 한 바와 같이, 시간이 어긋나서 서버에서의 신뢰성 저하를 방지하고 있다.

이에 대해 Windows OS의 NTP 서버(w32time : Windows Time 서비스)는 가능한 빨리 정확한 시간에 맞춘다는 것이 중시 되고, 정확도의 유지에 대해서는 UNIX 기반 ntpd 정도로 고려하고 있지 않다. slew 모드로 동작 할 때 크게 시간이 어긋나 있으면 최대한 빨리 시간을 맞추기 위해 시간을 단번에 밀어서 조정한다. 그 결과, NTP 서버로서의 신뢰성이 저하 될 수 있다.

이와 같이 동일한 NTP 프로토콜을 준수하는 프로그램에서도 동작이 다르다는 배경은 이해하고 있어야 하는 것이다.

Microsoft는 NTP에 의한 시간 동기화 기능을 Kerberos 인증이 제대로 실시하는 "Active Directory 인증에 필요한 범위 내에서 문제없이 사용할 수 있는 "정도를 목표로 구현하고 있다. UNIX의 ntpd와 같은 고정밀 NTP 서버를 구축하는 것을 목표로 하고 있지 않다. 이 것은 다음 문서에도 분명히 적혀 있다.

"정밀 환경을 위한 Windows 시간 서비스 구성을 목적으로 하는 지원 범위"(기술 자료)

 

이에 따르면 w32time 서비스의 설계 목표는 다음과 같은 것이다.

 

Windows OS에서는 tick (타이머 인터럽트 간격)이 10ms로 고정되어 있으며, UNIX 기반처럼 커널 옵션에서 타이머 인터럽트 주기를 짧게 조정하여 정확도를 높여주는 등은 할 수 없다.

이와 같이, "극히 미세한 정도의 시간을 동기화 할 수 없다"를 고려하여 Microsoft는 NTP 시간 동기화의 정확성에 대해 약하다. 하지만 (예 : Microsoft 기술 자료에 써 있듯이) 몇 초에 시간이 어긋난 상태에서도 문제는 없다고 마이크로 소프트가 생각하는 것은 아니기 때문에,이 기술 자료 문서의 의도로는 "Windows Time 서비스는 ntpd와는 다른 사상으로 설계되어 있다"는 메시지 라고 이해해야 한다.

Windows Time 서비스 - Slew 모드와 Step 모드

출처: https://blogs.technet.microsoft.com/jpntsblog/2012/12/27/windows-time-slew-step/ 

1. 복습 ~ step 모드와 slew 모드에 대해 ~

이미 아시는 분도 많다고 생각하지만, 우선 Step 모드와 Slew 모드 대해 복습을 한다.

===============

Slew 모드의 시간 맞추기

===============

데이터베이스의 트랜잭션 관리 등에 영향을 주지 않기 위하여, NTP 서버 및 NTP 클라이언트의 시간 차이를 점차 단축하여 시간이 돌아 오는 것을 막으면서 시간을 수정한다.

구체적으로는 NTP 클라이언트 쪽이 시간이 지연 되는 경우에는 예를 들어 실제로는 0.9 초 밖에 지나지 않았음에도 불구하고 1 초 시간을 진행하여 NTP 서버와 NTP 클라이언트 시간 차이를 점차적으로 단축한다.

반대로, NTP 클라이언트 쪽이 시간이 진행되고 있는 경우, 예를 들어 실제로는 1.1 초 후에 있음에도 불구하고, 1 초만 시간을 진행하여 NTP 서버와 NTP 클라이언트의 시간 차이 점차 단축된다.

===============

Step 모드의 시간 맞추기

===============

Slew 모드처럼 점차 시간 차이를 줄이는 것이 아니라 목표 시간으로 즉시 변경한다.

NTP 서버 보다 NTP 클라이언트 쪽이 시간이 진행 되고 있는 경우 NTP 클라이언트의 시간은 과거로 돌아간다.

2. 어떤 모드가 사용되는지?

그럼, 주제로 들어간다.

Slew 모드와 Step 모드, 어떻게 하여 맞추는 방법이 적용되는지, 알고 있나요?

Slew 모드에서 시간 동기화 하는 일반적인 조건은 다음과 같다.

다음의 두 가지 조건을 모두 충족하는 경우, Slew 모드에서 시간 동기화를 실시 할 수 있다.

반대로, 두 가지 조건 중 하나를 충족하지 않는 경우, Step 모드에서 시간 동기화를 실시한다.

조건 1.

AbsoluteValueOfCurrentTimeOffset < MaxAllowedPhaseOffset 부등식이 충족 되어야 한다.

조건 2.

AbsoluteValueOfCurrentTimeOffset / PhaseCorrectRate / UpdateInterval < System Clock Rate / 2  부등식이 충족 되어야 한다.

위의 조건식의 각각의 값의 의미를 아래에 설명한다.

■ AbsoluteValueOfCurrentTimeOffset

이 값은 NTP Client가 NTP Server에 Polling 했을 때의 NTP Client와 NTP Server 시간의 차이이다.

■ MaxAllowedPhaseOffset

NTP Server에서 받은 시간과 NTP Client의 시간 차이가 몇 초까지라면 Slew 모드에서 시간 동기화를 하는 것이 허용되는지의 설정 값이다.

위의 조건 1의 판정에서 사용된다. 이 값은 아래의 레지스트리에서 설정되어 있다.

레지스트리 키  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config

값 이름 : MaxAllowedPhaseOffset

■ PhaseCorrectRate, UpdateInterval

NTP Server에서 받은 시간 샘플을 바탕으로 얼마나 간격으로 얼마나 속도로 시간을 맞춰 나갈 것인가의 기울기를 나타내는 설정 값이다.

이 값은 아래의 레지스트리에서 설정되어 있다.

레지스트리 키  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config

값 이름 : PhaseCorrectRate

값 이름 : UpdateInterval

■ System Clock Rate

시스템의 클럭 속도를 나타내는 값이다. 보통이면 단일 프로세서는 약 10ms, 멀티 프로세서는 약 15 ms이다.

3. 서버 역할에 따른 차이

언급 한 바와 같이 Slew 모드와 Step 모드 중 사용 되는 방법은 NTP Client와 NTP Server의 시간 차이에 의해 동적으로 결정된다.

또한 도메인 컨트롤러 또는 도메인의 구성원 서버 또는 워크 그룹 환경에 따라 위의 조건식에서 사용되는 각 매개 변수의 기본 값이 다르기 때문에 Slew 모드에서 시간 동기화 "NTP Server와 시간의 차이" 값도 달라진다.

이번에는 Windows Server 2008 R2를 소재로 하여 실제로 기본 구성에서는 어느 정도의 시간 차이라면 Slew 모드가 되는지를 확인하려고 한다.

【도메인 컨트롤러의 경우]

기본 상태에서 관련 레지스트리와 이 값은 다음과 값으로 되어 있다.

MaxAllowedPhaseOffset : 300

PhaseCorrectRate : 7

UpdateInterval : 100

실제로 조건식에 적용시켜 계산하여 보자.

조건 1.

AbsoluteValueOfCurrentTimeOffset < 300 초

조건 2.

- 멀티 프로세서의 경우

AbsoluteValueOfCurrentTimeOffset ÷ 7 ÷ 100 < 0.015 ÷ 2

AbsoluteValueOfCurrentTimeOffset < 5.25초

- 싱글 프로세서의 경우

AbsoluteValueOfCurrentTimeOffset ÷ 7 ÷ 100 <0 .010 ÷ 2

AbsoluteValueOfCurrentTimeOffset < 3.5초

즉, NTP Server와 시간 차이가 5.25 초 미만 또는 3.5 초 미만의 경우는 Slew 모드에서 시간 동기화가 이루어진다.

[도메인 구성원 서버의 경우]

기본 상태에서 관련 레지스트리와 이 값은 다음과 값으로 되어 있다.

MaxAllowedPhaseOffset : 300

PhaseCorrectRate : 1

UpdateInterval : 30000

실제로 조건에 맞는지 계산하여 보자.

조건 1.

AbsoluteValueOfCurrentTimeOffset < 300초

조건 2.

- 멀티 프로세서의 경우

AbsoluteValueOfCurrentTimeOffset ÷ 1 ÷ 30000 <0.015 ÷ 2

AbsoluteValueOfCurrentTimeOffset < 225초

- 싱글 프로세서의 경우

AbsoluteValueOfCurrentTimeOffset ÷ 1 ÷ 30000 < 0.010 ÷ 2

AbsoluteValueOfCurrentTimeOffset < 150초

즉, NTP Server와 시간 차이가 225 초 미만 또는 150 초 미만의 경우는 Slew 모드에서 시간 동기화가 이루어진다.

[작업 그룹의 경우]

기본 상태에서 관련 레지스트리와 이 값은 다음과 같다.

MaxAllowedPhaseOffset : 1

PhaseCorrectRate : 1

UpdateInterval : 360000

조건 1.

AbsoluteValueOfCurrentTimeOffset < 1 초

조건 2.

- 멀티 프로세서의 경우

AbsoluteValueOfCurrentTimeOffset ÷ 1 ÷ 360000 < 0.015 ÷ 2

AbsoluteValueOfCurrentTimeOffset < 2700초

- 싱글 프로세서의 경우

AbsoluteValueOfCurrentTimeOffset ÷ 1 ÷ 360000 < 0.010 ÷ 2

AbsoluteValueOfCurrentTimeOffset < 1800초

즉, NTP Server와 시간 차이가 1초 미만의 경우는 Slew 모드에서 시간 동기화가 이루어진다.

어! ? ! ? 1 초? ? ?

그렇다. 기본 상태에서는 워크 그룹 환경의 경우 NTP Client와 NTP Server의 시간 차이가 1 초이내만 Slew 모드에서 시간 동기화 할 수 있다. . .

기본 상태라면 Step 모드가 된다고 생각하는 편이 좋다.

그럼 어떻게 하면 Slew 모드에서 시간 동기화 할 수 있을까?

워크 그룹 환경에서 조건 1이 더 강하게 작용하여 Step 모드가 채용되는 결과가 되고 있다. 따라서 MaxAllowedPhaseOffset 값의 데이터를 수정 할 필요가 있다.

예를 들어, 도메인 컨트롤러 및 구성원 서버처럼 300로 설정 변경하면 300초까지의 시간 차이의 경우는 Slew 모드에서 시간 동기화를 수행하도록 동작이 변경된다.

매개 변수의 조정을 실시하고 싶은 경우는 위의 각 레지스트리 값을 바꾸고, Slew 모드에서 시간 동기화 하는 조건에 적용, 임의의 값을 설정할 수 있다.

그러나 ... NTP Server와 시간 차이가 항상 같은 정도의 사이에 들어가고 있는 것은 없다. NTP Server와 시간 차이가 어떤 값으로 해도 확실하게 Step 모드에서 시간 동기화하지 않는 설정은 어떻게 하면 좋을까요? ?

이 방법은 다음에 소개하겠다! !

<이번 유용한 정보>

Windows Time 서비스의 시간 동기화 기법

http://support.microsoft.com/kb/2722681/ja 

지원하는 OS :

Windows Vista / Windows Server 2008

Windows 7 / Windows Server 2008 R2

Windows8 / Windows Server 2012 / Windows Server 2012 R2

Windows 시간 동기화 (Slew 모드)로만 사용하기

출처: https://caro.blog.so-net.ne.jp/2014-09-30   

Windows Server는 DB가 설치되었고, NTP 서버에서 시간 동기화도 하고 있다.

이 때, 시간 동기화는 시간이 퇴보하면 DB에 영향을 준다.

따라서 시간 동기화를 퇴보하지 않고 점차 맞추는 방법이 있다.

Windows Time 서비스에서 Slew 모드로 하면 PC의 시간을 다음과 같이하는 것으로 점차 시간을 맞추어 간다.

· PC < NTP의 경우 : PC의 시간을 0.9 초에서 1.0 초 경과 한 것으로한다.

· PC > NTP의 경우 : PC의 시간을 1.1 초에서 1.0 초 경과 한 것으로한다.

그러나 Windows Time 서비스는 Step 모드도 있으며, 이것은 바로 시간 동기화를 수행하므로 시간 퇴보가 발생한다.

그래서 항상 Slew 모드로 수행하고 싶지만 이 방법은 없는 것 같다.(아마)

300 초 이상의 시간 차이가 있으면 Step 모드가 되는 것 같다.

* 이 이외에도  조건이 있다

다음의 방법으로 우선 해결한다.

더 이상 시간이 진행 되지 않으면 시간 동기화 처리를 하지 않도록 하는 임계치를 설정하여 시간 동기화를 시키지 않는다.

이렇게 하면, DB를 중지하고 수동으로 맞출 필요가 있다.

windows에서 NTP 시간 동기화의 정확도를 향상 시키려면

출처: https://qiita.com/ymfj/items/380d0b3ea5f6cf3dfdb6 

시작하기

NTP는 시간 동기화를 위한 프로토콜이다.

PC의 시간은 기본적으로 NTP와 동기화 하는 경우 정확할 것이라고 생각했는데, windows는 기본 설정은 용도에 따라 충분한 정밀도로 동기화 되지 않았다. 그래서 가능한 정확하게 동기화 시키기 위한 설정을 확인한 것을 정리하였다.

windows의 NTP 클라이언트 기능

windows에서는 W32Time 서비스를 통해 시간 동기화가 이루어지고 있다.

이 서비스의 스펙의 설명은 아래와 같다.

네트워크 노드 간의 W32Time 서비스의 정확성은 보증 및 지원되지 않는다. W32Time 서비스는 시간이 중요한 애플리케이션의 요구를 충족 완전한 기능을 갖춘 NTP 솔루션이 아니다. W32Time 서비스는 주로 다음의 단계를 수행하도록 설계되어 있다.

* Kerberos v5 인증 프로토콜이 제대로 작동하도록 한다.

* 클라이언트 컴퓨터에 느슨한 동기화 시간을 제공한다.

W32Time 서비스는 1 ~ 2 초 사이에서 동기화 시간을 확실하게 유지할 수 없다. 이러한 공차는 W32Time 서비스 설계 사양에 포함 되어 있지 않는다. ( https://support.microsoft.com/ja-jp/kb/939322  )

W32Time 서비스는 기본적으로 시작 되지 않을 수 있다. "작업 관리자"의 "서비스"에서 시작 상태를 확인할 수 있다.

"상태"가 "실행 중"이면 문제 없다. 정지되어 있는 경우는 "서비스 관리 도구"에서 설정을 변경해야한다.

W32Time 서비스의 설정

W32Time 서비스의 설정을 변경하여 동기화 정확도를 향상시킬 수 있다. W32Time 서비스의 설정 레지스터의 변경이 필요하다.

NTP 서버

windows는 기본적으로는 미국의 서버를 참조 있기도 합하다 (요즘은 다르나?). ntp.nict.jp 나 조직의 ntp 서버를 사용하도록 한다. 또한 조직 내에서 도메인 컨트롤러 등이 있는 경우 멋대로(이후 설정 변경)를 하면 화낼지도 모른다.

NTP 서버로의 폴링 간격

ntp 서버에 일정 간격으로 폴링을 수행하여 시간 동기화를 실시하고 있다. 기본적으로 1주일(604800 초)이다. 이제는 아무리 그래도 너무 길어서 변경한다.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\W32Time\TimeProviders\NtpClient\SpecialPollInterval 가 초 단위의 폴링 간격이다.

폴링 간격을 너무 짧게 하면 서버 측에 부하가 걸린다.

참고로 ntp.nict.jp 경우

1 시간 평균 20회 (1일 총 480회)를 초과하지 않도록 하십시오. 이 이상이 필요한 경우에는 사전에 연락 주시기 바랍니다. ( https://www2.nict.go.jp/aeri/sts/tsp/PubNtp/qa.html#q1-4  )

이 요구에 응하기 위하여는 폴링 간격을 256초 이상으로 한다.

또한 W32Time 서비스는 현재 시간의 정확도에서 폴링 간격을 서서히 길게 해 나가는 기능도 있는 것 같다. 이번에는 생략한다.

step 모드와 slew 모드

시스템 시간은 다양한 시스템에서 타임 스탬프로 이용되고 있다. 만약 시간에 퇴보가 발생하면 타임 스탬프가 전후 해 버리는 등 문제가 발생한다. 그래서 정확한 시간에 즉시 변경 (step 모드)이 아니라, 시간의 반환이 생기지 않도록 서서히 정확한 시간에 맞추기 (slew 모드) 기능이 구현 되어 있다.

 

시간의 차이가 큰 경우 step 모드로 되지만, 이 조건은 구글링 하기 바란다. 여기에서는 slew 모드에서 매개 변수에 대해 설명한다.

이들은 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\W32Time\Config 안에 있다.

UpdateInterval

UpdateInterval는 시간의 엇갈림을 보정하는 간격을 나타낸다. 이 값이 작을수록 자주 시간을 수정한다. 나는 100으로 했다.

설정의 반영

GUI의 "인터넷 시간 설정"에서 "지금 업데이트"를 누르면 반영된다?

동기화 상태 확인

현재 시스템 시간과 ntp 서버 시간의 차이를 확인하는 명령이 있다.

w32tm /stripchart /computer:ntp 서버 주소

옵션 /samples:5 에 의해서 표시하는 횟수를 지정할 수 있다. 기본적으로 무한으로 계속 표시한다(중지는 CTRL+C).

또한 /dataonly 를 추가하여 오프셋 만 확인할 수 있다.

결론

설정을 변경하여 밀리 초에서 수십 밀리 초 정도의 정확성을 유지할 수 있다고 생각한다.

참고 한 페이지

Windows Time 서비스 - Slew 모드와 Step 모드

일 무역의 가끔 일기 - Windows7에서의 시간 맞춰

Windows 네트워크 시간 동기화의 기초와 노하우 (개정판) :

제 3 회 w32tm 명령과 레지스트리에 의한 Windows Time 서비스 제어