Strona główna > Azure, CloudExpert > Azure i jego problem z liczeniem czasu–czyli jak nauczyć chmurę, że każda sekunda ma znaczenie

Azure i jego problem z liczeniem czasu–czyli jak nauczyć chmurę, że każda sekunda ma znaczenie

A to niespodzianka…serwery w chmurze czasu nie liczą – czyżby były tak szczęśliwe? Wracając do meritum sprawy…jeżeli macie kilka…dziesiąt serwerów w Azure, które robią coś razem zauważycie mały problem… niezgodność czasu.

W przypadku serwerów jakie mamy w projekcie PlaceChallenge, to było od 2 do 47 sekund – powiedziałbym, że dość dużo.

Po rozmowie z miłym Panem z Indii wiadomo co jest problemem… problem to Hyper-V, który hostuję te maszyny. Hyper-V (wirtualizator) ma problem z odpowiednim synchro czasu w momencie dużego obciążenia. Nie możemy jednak zrzucić winy na sam Hyper-V i czekać aż problem naprawi się sam – Azure sam w sobie i tak działa rewelacyjnie. Czasem trzeba cos tam zrobić samemu i to ten moment…

W PlaceChallenge zrobiliśmy tak, że wysyłamy do serwerów plik exe (taki agent), który synchronizuje czas co parę godzin. Główna metoda zajmująca się synchronizacją wygląda tak:

public static void Sync()
        {
            try
            {
                Process p = new Process();
                ProcessStartInfo info = new ProcessStartInfo();
                info.FileName = "cmd.exe";
                info.RedirectStandardInput = true;
                info.UseShellExecute = false;

                p.StartInfo = info;
                p.Start();

                using (StreamWriter sw = p.StandardInput)
                {
                    if (sw.BaseStream.CanWrite)
                    {
                        sw.WriteLine("net stop w32time");
                        sw.WriteLine(
                            "w32tm /config /syncfromflags:MANUAL /manualpeerlist:0.europe.pool.ntp.org,1.europe.pool.ntp.org,2.europe.pool.ntp.org,3.europe.pool.ntp.org");
                        sw.WriteLine("net start w32time");
                        sw.WriteLine("w32tm /config /update");
                        sw.WriteLine("w32tm /resync /nowait");
                    }
                }

                p.WaitForExit();
                p.Close();
            }
            catch(Exception ex)
            {
                Debug.WriteLine(ex);
            }

        }


Można z niej łatwo wyczytać co musimy uruchomić w konsoli by czas się zsynchronizował na serwerach.

Skompilowany plik exe wkładamy do folderu z aplikacją, którą chcemy wysłać do Azure, klikamy prawym –> Properties i wybieramy Copy always by plik się skopiował do paczki, którą kompilator przygotuje dla Azure oraz w Build action –> None.

image

Brakuje jeszcze tylko wpisu w konfiguracji Azure (plik csdef), który powiedziałby że należy tego .exe uruchomić:

image

Oczywiście spoglądamy na sekcje Startup->Task.

Jeszcze warto wspomnieć, że Microsoft podaje w dokumentach, że 2 sekundy różnicy to norma – życzę wszystkim 2 sekund różnicy i miłego dnia!

Kategorie:Azure, CloudExpert Tagi: , ,
  1. Brak komentarzy.
  1. No trackbacks yet.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

%d blogerów lubi to: