Wie man keine Olympiade durchführt oder mit der Verteilung von Berechnungen ein Urteil fasst

In einer außermittigen abgelegenen Region unseres riesigen Landes ist die nächste regionale Etappe der allrussischen Olympiade der Schüler in den Bereichen Informatik und Programmierung vorübergegangen. Bis 2014 war alles in Ordnung, sie veranstalteten die Olympiade auf dem alten System, das 2004 von einem sehr begabten Programmierer auf Delphi geschrieben wurde. Seitdem hat es niemand mehr geändert - es hat funktioniert, okay. 2014 haben wir uns entschlossen, ejudge auszuprobieren. Sie haben nicht angefangen, alles aus dem Quellcode abzurufen, sondern beschlossen, ein fertiges Image für eine virtuelle Maschine zu erstellen. Alles war in Ordnung, alles hat funktioniert.

Aber dann kam das Jahr 2015, in dem sich einige Punkte der Olympiade ein wenig verändert haben und die notwendigen "Leute" erst 1-2 Tage vor dem Start von diesen Veränderungen erfahren haben ...

Hier beginnt der Spaß.

Tatsache ist, dass fast alle diese Änderungen nur uns beide betrafen (I + ripatti ).
Ich war verantwortlich für den Server (fedora19, ejudge) und dessen Leistung, er war verantwortlich für die Vorbereitung von Tests, die Konfiguration von Touren im Allgemeinen. Er hat viel Erfahrung damit .

Ich gehe also in chronologischer Reihenfolge vor.

Mittwoch, 21. Januar


Sie fragen mich, ob ich einen Server für die Olympiade auf der Grundlage dedizierter Universitätsmaschinen aufbauen kann, auf die ich negativ antworte, weil nicht genügend Zeit vorhanden war und die Umgebung mir möglicherweise unbekannt ist (ich dachte, es gäbe VMWare, aber ich könnte nur Virtual Box verwenden). Im Allgemeinen konnte ich nicht garantieren, dass alles gut wird.

Donnerstag, 22. Januar


Ich finde heraus, dass es so etwas wie Token gibt. Dies bedeutete nur eines: Die Entscheidungen der Teilnehmer sollten während der Tour und nicht danach überprüft werden. Als ich mich an die Tour des letzten Jahres erinnerte, entschied ich, dass ein Server alles ziehen wird. Letztes Jahr ist nichts gefallen, alles hat funktioniert, alle waren glücklich. Ich fing an, am Server zu arbeiten. Er brachte ein Auto (Eisen) an die Wände der Universität.

Erklärung
Ich habe den Server mit Ejudge in den Wänden meines Lyzeums im letzten Jahr vor den Olympischen Spielen angehoben. In der letzten regionalen Phase wurde daher beschlossen, eine vorgefertigte Lösung zu versuchen.

Abends erfahre ich von meinem Partner, dass die Vorgängerversion von ejudge (2.3) die Anforderungen nicht erfüllt. Gerade zu diesem Zeitpunkt hat Alexander Chernov eine funktionierende Version veröffentlicht. Sogar eigens startete ein neues Repository mit allen Einstellungen der Probetour. Es war sehr verlockend, denn ich hatte die Idee, die alte Version zu konfigurieren. Wir entschieden uns, eine neue Version aus der Quelle zu sammeln, da es kein fertiges Bild gab. Hier begannen die ersten Probleme.

Problem: wie starte ich ssh auf port 22 nicht?
Hintergrund, Entscheidung (teilweise)
Der Punkt ist an der Universität. Sie blockieren wie jede Organisation den Port 22 von außen. Wir könnten ruhig in den Mauern der Uni arbeiten, aber Probleme würden außerhalb der Mauern beginnen. Gott sei Dank war mein Vorgesetzter der Administrator des Clusters, der eine externe IP hatte, aber der Zugriff wurde verweigert. Ich bat ihn um Hilfe, am Ende hat er uns komplett eingerichtet. Tatsächlich wollte ich ssh Zugriff auf den Cluster gewähren (von wo ich ruhig zu meinem Server an Port 22 gelangte), aber er wollte wirklich keinen Zugriff von links nach rechts gewähren. Sie beschlossen, "das Problem radikal zu lösen". Ich gebe ihm alle Passwörter, Logins und er versprach es zu sehen. Ja, ich bin eine leichtgläubige Person.

Tatsächlich habe ich selbst versucht, dies zu tun, konnte es aber nicht.

Ausschnitte aus dem, was er dann gesendet hat:
... drittens werden die Einstellungen des SSH-Servers in / etc / ssh / sshd_config gespeichert und nicht in ssh_config. Ich habe PermitRootLogin no in den ersten

Port 22
Port 5000 eingefügt und alles hing wie es sollte: [root @ localhost ssh] # service sshd status Redirecting to / bin / systemctl status sshd.service sshd.service - OpenSSH-Serverdämon Geladen: Geladen (/usr/lib/systemd/system/sshd.service; aktiviert) Aktiv: Aktiv (aktiv) seit Do 2015-01-22 21:01 : 38 YEKT; Vor 4min 53s








Hurra!
Port 5000 für ssh ist kostenlos, ich kann darauf zugreifen.
Aber weder Github noch Yum Update, nichts ...
Genauer gesagt, nachts konnte ich diese Dinge nicht konfigurieren.

Um 7 Uhr morgens rief er an (weckte seinen Partner), er erzählte alles. Das Problem war, dass wir dummerweise den Quellcode nicht kompilieren konnten, da einige Bibliotheken fehlten, ich kann sie nicht komprimieren (ssh 5000). Ich habe es nacheinander versucht, aber verdammt noch mal, die Abhängigkeiten sind sehr gut.

Wir haben beschlossen, einen weiteren Server mit vollständigen Einstellungen für ejudge (3.3) zu erstellen, damit ich dann nicht zum Server gehen muss (er befand sich im Serverraum, unter dem Schloss, es war problematisch, physischen Zugriff auf den Computer zu erhalten).

23. Januar, Freitag, Beginn einer Testtour um 16:00 Uhr


Um 9 Uhr morgens werde ich ein Kolloquium über Funkhan abhalten, der Dekan stellte etwas auf, sah nicht aus. Es scheint nicht "erfolglos" zu sein.
Um 10 Uhr beginne ich parallel zu Artyom ein neues Ejudge zu sammeln. Er macht es ein bisschen schneller, aber ich hörte bei einem kleinen Schritt auf und hörte auf weiter zu denken.
Das zweite Problem.

Erstellen Sie mit ejudge 2.3 das Ejudge von Wesria 3.3 aus dem fedora19-Image
Sie haben nicht begonnen, die alte Version zu löschen, sondern nur eine neue Version zu installieren.
Wir ziehen den Quellcode aus dem Github, starten.

git clone https://github.com/blackav/ejudge.git
cd ejudge/
./fedora-configure
make
su
make install
#Вроде теперь надо просто запустить ejudge-control, но:
ejudge-control
Tue Jan 27 01:24:35 2015:info:ej-users 2.3.29, compiled Sat Dec 14 07:58:33 2013
mysql: SELECT config_val FROM config WHERE config_key = 'version' ;
Tue Jan 27 01:24:35 2015:info:ej-super-server 2.3.29, compiled Sat Dec 14 07:58:33 2013
Tue Jan 27 01:24:35 2015:info:configuration file parsed ok
Tue Jan 27 01:24:36 2015:info:ej-jobs 2.3.29, compiled Sat Dec 14 07:58:33 2013
Tue Jan 27 01:24:36 2015:info:ej-contests 2.3.29, compiled Sat Dec 14 07:58:33 2013
Tue Jan 27 01:24:36 2015:info:using files as the new-server database

Ja, genau, ejudge-conrtol hat die alte Version aufgegriffen.
Alles hat funktioniert, gehe zur Web-Version - sieh die alte.
Der Ordner, in dem sich die alte Version der Binärdatei befand, wurde umbenannt. Gleichzeitig verfolgte er zwei Ziele: sicherzustellen, dass er von den Pfaden verschwand und die alte Version zu sichern.

Jetzt führen wir ejudge-control erneut aus, das sich in / usr / bin / ejudge-control befindet:

[ejudge@localhost ~]$ ejudge-control start
2015-01-27T19:03:18Z:info:ej-users 3.3.1, compiled 2015-01-23 09:25:21
mysql: SELECT config_val FROM config WHERE config_key = 'version' ;
2015-01-27T19:03:18Z:info:ej-super-server 3.3.1, compiled 2015-01-23 09:25:21
2015-01-27T19:03:18Z:info:configuration file parsed ok
2015-01-27T19:03:19Z:info:ej-jobs 3.3.1, compiled 2015-01-23 09:25:21
2015-01-27T19:03:19Z:info:ej-contests 3.3.1, compiled 2015-01-23 09:25:21
2015-01-27T19:03:19Z:info:using files as the new-server database


Ein bisschen mehr Schamanismus und die Probetour ist fertig!

Wir sagten dies, als es ungefähr 17:00 Uhr war.

Ich bin mit der Distribution in den Serverraum gelaufen. Ich kam und dort ging der Bildschirm nur aus. Ich dachte, der Monitor sei eingeschlafen. Es wird schlimmer - der Sysadmin hat die Stromversorgung meines Eisens ohne Grund abgeschaltet. Jetzt warte ich, bis Windows Server 2008 startet, kopiere, importiere in die virtuelle Box, starte, schreibe statische Adressen auf, konfiguriere ssh. Da ich das letzte Mal von meinem wissenschaftlichen Wissenschaftler (Yuldashev Arthur Vladimirovich) gegründet wurde, musste ich diesmal viel Zeit aufwenden. Erschwerend kam hinzu, dass ich im Serverraum nicht die Möglichkeit hatte, zu googeln.

Es ist 17:45 Uhr, die Probetour ist fast vorbei, unser Server ist noch nicht aufgestanden ... Viele Anrufe sind eingegangen - wir antworten, sie sagen, alles ist gerundet, wir haben keine Zeit, den Server zu erhöhen.

Um 18:00 Uhr ist der Server noch nicht aufgestiegen. Zusammen mit anderen Jurys überlegen wir, wie wir aus dieser Situation herauskommen können.

Folgendes wurde beschlossen: Wir schlafen nicht mit Artem, wir beenden die Probetour und die erste, wir bereiten alles um 10 Uhr vor, von 10:00 bis 11:00 Uhr beginnen wir die Probetour und um 11:00 Uhr beginnen wir die 1. Runde. Also haben wir für 2 Nächte den Schlaf verloren.

Sie verabschiedeten sich und fuhren nach Hause. Häuser fingen an, alles neu aufzustellen, abgestimmt. Am Morgen war alles fertig.

24. Januar, Samstag, Runde 1 (offizieller Zeitplan)


Die Schnuppertour beginnt und hier haben wir endlich gemerkt, womit wir es zu tun hatten.

Tokens
Was ist das?
Letztes Jahr gab es folgende Situation: Ein Teilnehmer sendet den Quellcode an ein Testsystem, das wiederum nur Tests überprüft, die im Beispiel zur Aufgabe gezeigt werden. Wenn das Paket sie ausfällt, ist es nicht für eine vollständige Überprüfung in der Warteschlange zu erhalten. Aus diesem Grund hat unser Honourable One Server die gesamte Auslastung problemlos bewältigt (insgesamt waren es 150 Teilnehmer).

In diesem Jahr mussten wir die Lösung sofort bei allen Tests testen. Um sicherzustellen, dass die Teilnehmer es nicht missbrauchen, wurde dieses Konzept eingeführt - Token. Dies ist sozusagen das Recht, das Ergebnis Ihres Pakets zu sehen. Es war gleich 10. Das heißt, ich kann eine Lösung für das Problem so oft senden, wie ich möchte, aber ich kann nur 10 Mal sehen. Nachsendungen auf eigene Gefahr.

Die Probetour hat begonnen und wir haben eine Serververzögerung von 15 Minuten. Das heißt, der Teilnehmer sendet die Lösung an den Server und überprüft sie dort erst nach 15 Minuten. Wir hatten keine Angst davor. Aber vergebens. Wir dachten, was passieren würde.

Ich mache einen Reload-Wettbewerb, bei dem die gesamte Paketwarteschlange gelöscht wird. Er informierte jedoch niemanden darüber. Infolgedessen werden wir 10 Minuten vor dem Ende der Testtour erneut mit Paketen bombardiert. Schließen Sie ruhig den Wettbewerb, öffnen Sie den Wettbewerb der 1. Runde.

11:00 Uhr, 1. Runde


Buchstäblich in 15-20 Minuten kommen mehrere Pakete an, eine schlechte Warteschlange erscheint. Artem machte es sofort klar. In der ersten Aufgabe, in der leichtesten, wie erwartet, nur 48 Tests. Die Lösung befindet sich auf der Stirn, die 50 von 100 Punkten erreicht, aber es gibt eine gute Lösung, die überdacht werden muss. Aber die Mehrheit hätte das erst erfahren sollen, nachdem ihre Entscheidung TLE erhalten hatte. Wie Sie verstehen, dauerte eine in der Stirn gelöste Voraussetzung für Aufgabe A auf dem Server 24 Sekunden. Solche Pakete wurden immer mehr, es kamen Fragen über die Zeit der Prüfung an die Jury. Artyom erklärte alles richtig, schickte eine Nachricht an alle. Trotzdem schickte fast jeder mindestens eine "freie" Entscheidung A. Und dann begann die Leitung natürlich zuzunehmen. Erst 15 Minuten, dann scharf 45. Alle, besonders die Teilnehmer, waren besorgt, angespannt und unglücklich. Zuallererst von uns. Artem war zu dieser Zeit zu Hause, ich war an Ort und Stelle und hörte fast alles, was ich hätte hören sollen. Wir begannen zu denken, wir müssen irgendwie versuchen, aus der Situation herauszukommen. Fand den richtigen Artikel in der Dokumentation, konnte ihn aber nicht verwenden. Danach schlossen wir einfach unsere Augen vor 30 Fragen und warteten darauf, dass es zu Ende ging.

Endlich vorbei! Überprüfen Sie die Verzögerung - 1 Stunde. Der Teilnehmer musste eine Stunde vor dem Ende eine Entscheidung absenden, um Zeit zu haben, das Überprüfungsprotokoll einzusehen.

16:00 Uhr gehe ich in die Aula. Ich treffe unzufriedene Augen. Ich habe den Kindern gerade den Einzug ins Finale verwehrt. Wie sonst könntest du mich ansehen? Gekreuzt mit einem sehr berühmten Lehrer, sagte, was das Problem ist, was die Lösungen sind - zu parallelisieren. Er wünschte mir viel Glück.

Jeder kündigte das Problem offen an. Sie sagten, dass wir solche Lasten und dergleichen nicht erwartet hätten. Sofort dachten sie nach, um einen Ausweg aus der Situation zu finden.

Option Nummer 1. Setzen Sie 1 Server in jede Anzeigeklasse, 2 in jede große Klasse. Nach den Olympischen Spielen werden wir alle Ergebnisse sammeln, niemand wird Probleme mit dem Netzwerk haben, die Last kann in der Reihenfolge reduziert werden, die es ermöglicht, alle Anforderungen um 100% zu erfüllen. Die Mängel liegen auf der Hand: Es ist Samstag, fast alle Anzeigeklassen sind bereits geschlossen, auch die der Server. Wir haben keine Server zur Hand, Bilder von 2 Runden auch. Die Anzeigeklassen sind in 3 Gebäuden zu weit voneinander entfernt. Über den Zugriff per ssh kann man nicht sprechen. Die zweite Runde beginnt am Montag um 9.00 Uhr mit dem Zug. Wir können so etwas am Montagmorgen nicht machen, denn wir sind nur zu zweit.

Option 2: Verbinden Sie die Rechenknoten mit dem Hauptserver. Dieser Fall ist perfekt. An der Organisation der Olympiade muss nichts geändert werden. Das einzige Problem besteht darin, diese Rechenknoten zu erstellen.

Damals war nichts zur Hand. 1 Anruf - und in einer Stunde haben wir 13 Laptops, Core-i7, jeweils 8 GB RAM. Das einzige Bild des Autos, das ich hatte, war das Bild einer Testtour.

20:00 in der Abteilung sitzen, einen Server für 1 Laptop einrichten. Sie riefen Artem an, ließen ihn kommen und halfen mir beim Einrichten (ich wusste nicht, wie ich eine Tour einrichten sollte). Plötzlich kommt der Organisator auf den Gedanken - das Haus ist leer (die Frau und die Enkel kommen erst am Sonntagnachmittag an), lass uns für die Nacht zu mir gehen.

Jeder ist glücklich, genauer gesagt Artyom und ich. Ein anderer Lehrer kommt mit uns, um uns zu helfen.

25. Januar, Nacht ist Tag


Wir nahmen 7 Laptops mit, kamen ausgepackt an. Sie haben uns leckeres Essen zubereitet und wir haben begonnen, Kraft zu schöpfen.
Wir haben die 2. Runde gestartet, das Image in die Festplatte geworfen und darüber nachgedacht oder vielleicht versucht, es zu parallelisieren?
Es gibt viel Zeit, auch Kräfte.

Und jetzt zum spaßigen Teil. So funktioniert Ejudge
Es gibt einen Dienst (Daemon), der für das Kompilieren, Starten und Testen von Programmen zuständig ist - ej-super-run. Er entnimmt die Daten aus / home / judges /, wo sich normalerweise Konfigurationsdateien, Tests, Prüfer und gesendete Lösungen befinden.
Ich weiß nicht, welcher Prozess für das Webinterface verantwortlich ist, aber wir haben die Ejudge-Kontrolle ausgeführt, die das gesamte System ausführte. Ich habe nicht auf Details eingegangen.
Im Rahmen der Parallelisierung wurde vorgeschlagen, den Ordner / home / judges / freizugeben. Und es spielt keine Rolle, wie - SSHFS, Samba, NFS.
Dazu müssen Sie jedoch die Arbeitsknoten mit einem bestimmten Schlüssel wieder zusammensetzen, wie sie in verteilten Systemen - Slaves - genannt werden. Die Laborarbeiten am Betriebssystem umfassten das Erstellen von Netzwerkordnern mit NFS und Samba. Ich nahm leicht den Samba und stieß sofort auf das erste Problem, das schon zu faul war, um es zu lösen. aufgeben, auf NFS setzen. Es war natürlich zu erwarten, dass ich hier auch auf viele Probleme stoßen werde. Es gibt ein letztes bekannteres SSHFS. Es ist vertraut, weil ich irgendwie mit SSH befreundet war, oft mit ihm gearbeitet habe.

Öffnete das erste Tutorial, richte alles ein.
Stellen Sie zunächst sicher, dass das Verzeichnis / home / judges / leer ist, andernfalls löschen wir es.

sshfs ejudge@192.168.1.11:/home/judges/ /home/judges/

Danach wird das Verzeichnis / home / judges / mit dem Server geteilt. Der Einfachheit halber können Sie es einhängen, aber wir haben dies nicht getan, da es bereits Morgen ist.

Wenn Sie einen anderen Port angeben müssen, sollten Sie die Option -p hinzufügen
sshfs -p 5000 ejudge@192.168.1.11:/home/judges/ /home/judges/

Im Falle unseres Servers war dies relevant.

Und Gott sei Dank, es hat funktioniert!

Wir haben einen Laptop als Server und einen anderen als Slave ausgewählt. Es handelt sich um virtuelle Maschinen, die auf sie angewendet werden.
Über das Webinterface habe ich 2 Pakete gestartet (mit while (true), damit TLE bei allen Tests angezeigt wird), die der Server selbst ausgeführt hat und die einige Zeit in Anspruch genommen haben. Wir haben ej-super-run auf dem Arbeitsknoten gestartet und erneut 2 Aufgaben zur erneuten Überprüfung gesendet - Glück.
Der Arbeitsknoten nahm das Paket auf und begann zu testen. Die Scan-Zeit ist fast 2-mal kürzer, 30 Sekunden gegenüber 50.

Der nächste Schritt bestand darin, den Arbeitsknoten mit einem echten Server zu verbinden, da der 5000-Port für uns jetzt kein Problem darstellt.

Sie füllten die restlichen Laptops aus und optimierten gleichzeitig die Einstellungen. Sie wollten ein schönes Drehbuch schreiben, das alle Einstellungen leicht vorschreibt, aber leider krumme Hände und Kurven, die solche Dinge nicht sofort tun können. Ich habe alle Einstellungen mit meinen Händen registriert. Auf dem Server wurde der ej-super-run-Prozess gestoppt, sodass nur die Weboberfläche behandelt wird.
Als nächstes dachten wir: Auf jedem Laptop gibt es 4 Kerne, 1 Arbeitsknoten kann nur im Singlethread-Modus überprüft werden.
Gib einem Mann einen Berg Gold, er wird noch einen wollen
Entweder wir erhöhen 1 virtuelle Maschine, geben ihr eine Menge Ressourcen und parallelisieren die Kerne, oder wir erhöhen nur 2 virtuelle Maschinen, jeweils 2 Kerne.
Es war uns egal, wie stark das System beschleunigte - zwei- oder dreimal, wenn wir noch viele Autos haben. Wir beschlossen dort anzuhalten, um 2 Autos auf dem Laptop zu heben. Als alle 7 Laptops fertig waren, beschlossen wir, uns um 12 Uhr mit einem Schlaf zu belohnen.

26. Januar, 08:30


Bereits frisch, an der Universität, ist auch Artem angekommen. Wir haben alle 13 Laptops, die Jungs vom "Netzwerkdienst" haben schnell die Drähte gequetscht, das Netzwerk aufgebaut, 12 davon waren bereits im Netzwerk, der 13. Laptop bekam keine Internetverbindung, das Kabel war anscheinend alt. Er griff schnell zu den ersten 7, woraufhin sich das Webinterface schrecklich zu verlangsamen begann. Anscheinend lud sshfs das gesamte Verzeichnis in sich herunter, was ziemlich mollig war.

Runde 2 hat begonnen, wir haben bereits 14 Arbeitsknoten! Leise begann er, die Knoten nacheinander mit dem System zu verbinden, um das System nicht zu überlasten.

Die Warteschlange auf dem Server hat 10 gleichzeitige Tests nicht überschritten. Das heißt, im Prinzip reichen 5 Laptops, um eine vollständige Tour durchzuführen.

Sie kamen aus dem Fernsehen, ihnen wurde gesagt, dass wir 24 Arbeitsknoten haben. Ich musste alles vor dem Ende der Olympiade erhöhen, um mein Wort zu halten.

Infolgedessen schrieben die Teilnehmer der zweiten Runde viel besser als die der ersten, obwohl es in der ersten Runde einen Teilnehmer gab, der über 400 schrieb, und in der zweiten Runde erzielten sie nur 370.

Alternative


Tatsächlich wusste jeder lange Zeit alles und griff dazu sogar auf Yandex zurück. Dieser nahm Bewerbungen von Regionen entgegen, die die regionale Etappe nach neuen Anforderungen nicht eigenständig durchführen konnten. Die Bewerbungen mussten 10 Tage vor den Olympischen Spielen eingereicht werden, daher haben wir diese Methode nicht in Betracht gezogen. 26 Regionen an Yandex.
Sie sagten auch, dass auch in anderen Regionen nicht alles gut ist, die Werte sind im Allgemeinen niedrig.

So haben wir, die technische Jury, die regionale Bühne der Allrussischen Olympiade beschämend gehalten.

Fazit


UPD :
Liste der Fehler:
1) Als Student, der eine Aufgabenparallelisierung im Lehrplan hat (openMP, MPI), musste ich verstehen, dass es unmöglich ist, eine Olympiade auf 1 Maschine
durchzuführen Was gibt es Neues? Warten Sie nicht, bis sie anrufen. Tatsache ist, dass ich mich in diesem Jahr speziell für einen Monat oder sogar zwei Monate für den ROI interessierte, aber sie sagten mir nichts Sinnvolles.

Jetzt auch beliebt: