Horloge dérive sur Windows
J'ai développé un service Windows qui suit les événements d'affaires. Il utilise l'horloge Windows pour l'horodatage des événements. Toutefois, le sous-jacent de l'horloge peuvent dériver de façon assez spectaculaire (par exemple, de perdre quelques secondes par minute), en particulier lorsque les Processeurs sont de travail dur. Nos serveurs utilisent le Service de Temps Windows pour rester synchronisé avec les contrôleurs de domaine, qui utilise NTP sous le capot, mais la fréquence de synchronisation est contrôlée par domaine politique, et dans tous les cas, même la synchronisation de chaque minute permettrait encore une dérive importante. Existe-il des techniques que nous pouvons utiliser pour garder l'horloge plus stable, autrement que par l'utilisation de matériel horloges?
source d'informationauteur Matt Howells | 2008-09-19
Vous devez vous connecter pour publier un commentaire.
Tops d'horloge doit être prévisible, mais sur la plupart des PC hardware - parce que ils ne sont pas conçus pour les systèmes en temps réel- autres I/O device interruptions ont la priorité sur l'horloge d'interruption, et certains pilotes n'traitement étendu dans la routine d'interruption de service plutôt que de la renvoyer à un l'appel de procédure différés (DPC), ce qui signifie que le système peut ne pas être en mesure de servir l'horloge interruption jusqu'à ce que (parfois) de temps après il a été signalé.
D'autres facteurs incluent la maîtrise de bus I/O contrôleurs qui volent de nombreux bus mémoire de cycles de CPU, l'amenant à être cruellement d'un manque de mémoire de la bande passante du bus pour de longues périodes de temps.
Comme d'autres l'ont dit, l'horloge de la génération de matériel peut également varier sa fréquence en tant que composante de la modification des valeurs de la température.
Windows n'autorise pas le montant de tiques ajouté à l'horloge en temps réel sur tous les interrompre être ajusté: voir SetSystemTimeAdjustment. Cela ne fonctionne que si vous aviez un prévisible clock skew, cependant. Si l'horloge est seulement un peu hors, le SNTP client ("Windows" Temps de service) va régler ce biais pour faire de l'horloge légèrement plus rapide ou plus lent à la tendance à l'heure correcte.
Je ne sais pas si cela s'applique, mais ...
Il y a un problème avec Windows que si vous modifiez la résolution du timer avec timeBeginPeriod() beaucoup, l'heure de la dérive.
En fait, il y a un bug dans Java Thread
wait()
(et leos::sleep()
) la fonction Windows de mise en œuvre qui provoque ce comportement. Il définit toujours la résolution du timer de 1 ms avant d'attendre pour être précis (quel que soit le sommeil de la longueur), et les restaure immédiatement après l'achèvement, à moins que tous les autres threads sont toujours en train de dormir. Ce set/reset sera alors confondre l'horloge Windows, qui attend le windows quantum de temps à être relativement constant.Soleil a fait connu au sujet de ce depuis 2006et n'a pas fixé, AFAICT!
En fait, nous avions l'horloge va deux fois plus vite à cause de cela! Un simple programme Java qui dort 1 millisec dans une boucle affiche ce comportement.
La solution est de définir la résolution de vous-même, à quelque chose de faible, et l'y maintenir aussi longtemps que possible. Utilisation timeBeginPeriod() de le contrôler. (Nous avons fixé à 1 ms, sans les effets indésirables.)
Pour ceux de codage en Java, le plus facile moyen de résoudre ce problème est de créer un thread qui dort aussi longtemps que l'application des vies.
Notez que cela va résoudre ce problème sur la machine à l'échelle mondiale, indépendamment de l'application qui est le véritable coupable.
Vous pourriez exécuter "w32tm /resync" dans une tâche planifiée .le fichier bat. Cela fonctionne sur Windows Server 2003.
Autres que resynching l'horloge de plus en plus fréquemment, je ne pense pas qu'il existe beaucoup que vous pouvez faire, d'autres que pour obtenir une nouvelle carte mère, que votre signal d'horloge ne semble pas être à la bonne fréquence.
http://www.codinghorror.com/blog/2007/01/keeping-time-on-the-pc.html
Comme déjà mentionné, les programmes Java peuvent causer ce problème.
Une autre solution qui ne nécessite pas de modification de code est l'ajout de la VM argument
-XX:+ForceTimeHighResolution
(trouvé sur le NTP page de support).À partir du lien référencé (via le Wayback machine - lien original a disparu):
Augmentation de la fréquence de la re-synchronisation.
Si le synchronise avec votre propre serveur principal sur votre propre réseau, il n'y a aucune raison de ne pas synchroniser toutes les minutes.
Synchroniser plus souvent. Regardez les Entrées de registre pour le service W32Timeen particulier de la "Période". "SpecialSkew" sonne comme il pourrait vous aider.
Dérive de l'horloge peut être une conséquence de la température; peut-être vous pourriez essayer d'obtenir la température plus constante en utilisant un meilleur refroidissement peut-être? Vous n'allez pas perdre la dérive totalement, cependant.
À l'aide d'une horloge externe (récepteur GPS, etc...), et une méthode statistique permettant de relier le temps CPU de Temps Absolu est celui que nous utilisons ici pour synchroniser les événements dans les systèmes distribués.
Puisqu'il semble que vous avez une grande entreprise:
Prendre un vieux portable ou quelque chose qui n'est pas bon pour beaucoup, mais semble avoir une plus ou moins fiable de l'horloge, et l'appeler le Chronométreur. Le Chronométreur est le seul travail est de, une fois tous (dire) 2 minutes, envoyez un message à l'serveurs de dire l'heure. Au lieu d'utiliser de l'horloge Windows pour leurs horodateurs, les serveurs seront mis à bas le temps de le Chronométreur dernier signal, plus le temps écoulé depuis le signal. Vérifier le Chronométreur de l'horloge de votre montre une fois ou deux fois par semaine. Cela devrait suffire.
Quels sont les serveurs vous en cours d'exécution? Dans les ordinateurs de bureau les fois où je l'ai rencontré ce sont avec étalement de Spectre FSB activé, les causes des problèmes avec l'interruption du temps qui est ce qui fait que les tic d'horloge. Voudrez peut-être voir si c'est une option dans le BIOS sur un de ces serveurs et de le désactiver si activé.
Une autre option que vous avez est de modifier le temps de l'intervalle d'interrogation et de le rendre beaucoup plus courte à l'aide de la clé de registre suivante, le plus probable que vous aurez à ajouter (à noter qu'il est une valeur DWORD et la valeur est en secondes, par exemple, 600 pour 10min):
Voici un bilan complet sur: KB816042
Une fois, j'ai écrit un Delphi classe de gérer le temps resynchs. Il est collé ci-dessous. Maintenant que je vois la "w32tm de la commande" mentionné par Larry Silverman, je pense que j'ai perdu mon temps.
Je crois que le Service de Temps Windows implémente uniquement SNTP, qui est une version simplifiée de NTP. Plein NTP mise en œuvre prend en compte la stabilité de votre horloge de décider combien de fois la synchronisation.
Vous pouvez obtenir le plein NTP server pour Windows ici.