Aktualizacja projektu ze skryptu i żądanie 0 sekund pracy od projektu

Zaczęty przez TJM, 31 Lipiec 2008, 23:32

TJM

Jakiś czas temu wpadłem na pomysł, żeby dorobić sobie 'dopalacz' do projektów, w których zadania pojawiają się rzadko. Jednak poprzestałem na tym, że na linuksowym serwie dopisałem do crona wymuszanie update projektu po kolei na wszystkich hostach, takie wymuszenie 'ręcznego' update działało w miarę, bo resetowało czas do następnego połączenia, który rośnie gdy nie ma próbek.
Teraz mając chwilę postanowiłem zrobić to tak, jak pierwotnie planowałem - skrypt okresowo, np. co 5 minut sprawdza server_status wybranego projektu, przetwarza odpowiedż i jeśli widzi, że są zadania wymusza update. Przy tym od razu rozbity jest na dwie części - skrypt php odpowiedzialny za monitorowanie projektu(ów) i skrypt końcowy pobierający dane o statusie projektu(ów) już przetworzone, żeby w razie uruchomienia dużej liczby skryptów nie obciążać projektu zapytaniami.

Takie coś powinno ogromnie ułatwić zgarnianie 'rzadkich' zadań, niestety jest pewien problem - po jakimś czasie manager przy recznym update przestaje wysyłać żądania iluśtam próbek, po prostu robi puste requesty. Da się coś na to poradzić ?

W razie jakiejś pilniejszej sprawy - jestem często dostępny na kanale IRC B@P, na forum czasami zapominam zajrzeć lub nie mam czasu.

buninek

Tak tylko strzelam, może ma to związek z tym
--set_run_mode mode duration        set run mode for given duration
  mode = always | auto | never
oczywiście zły strzał. Dopiero teraz doczytałem.

Ja również z crona robię regularnie - udate. Tylko w odwrotnym celu, aby regularnie odsyłał przeliczone próbki. Z tym manager miewał częste problemy. Potrafił przetrzymać przeliczone przez długi czas.

Troll81


TJM

Właśnie mój skrypt jest pod windę, z jednego windowsowego hosta można w ten sposób wymuszać update wielu innych, do których maszyna na której pracuje skrypt ma dostęp (wymagana konfiguracja zdalnego dostępu w samym BOINCu).

W razie jakiejś pilniejszej sprawy - jestem często dostępny na kanale IRC B@P, na forum czasami zapominam zajrzeć lub nie mam czasu.

Mchl


W nagłych wypadkach wzywać przez: mail: mchlpl[at]gmail.com | PM|mchl[a]boincatpoland.org

Troll81



TJM

Rzucę żródła jutro jak jeszcze trochę dopracuję, teraz zbieram się na pociąg i cisnę do chaty :D

W razie jakiejś pilniejszej sprawy - jestem często dostępny na kanale IRC B@P, na forum czasami zapominam zajrzeć lub nie mam czasu.

TJM

Tak wyglądają rezultaty zwracane przez skrypt php:

http://www.enigmaathome.net/p_status.php

aktualnie dorabiam cachowanie w bazie chociaż tak na 5 minut, żeby nie obciążać niepotrzebnie serwerów projektów (mimo, że projekty też cachują server-status - po prostu nieeleganckie jest ściąganie tylu plików przy każdym requeście).
Na podstawie takiej tabelki windowsowy progs jeśli zobaczy, że w projekcie są dostepne zadania przekazuje do managera polecenie zaktualizowania projektu.
Windowsowy skrypt synchronizuje się z timestampem otrzymanych danych, żeby ściągać nowe jak tylko są aktualizowane.
Kumam już też mniej więcej czemu mi to nie chciało działać: projekty z 'rzadkimi' próbkami muszą mieć resource share ustawione dużo wyżej niż reszta, najlepiej do oporu (10000) - wtedy jest prawie pewne, że manager zassie zadania.

Póki co pracuję nad poprawieniem wielu bugów w windowsowym skrypcie - obecnie największy problem to wywoływanie update za każdym razem po odczytaniu danych, jeśli dostępne są jednostki. Nie prowadzi to raczej do niczego dobrego, bo pewnie i tak po 1-2 aktualizacjach klient zapcha się jednostkami i więcej nie zassa.

P.S. w RALPHu 1 WU do ściągnięcia %-)


EDIT: które projekty oprócz RALPHa i LHC warto monitorować ?



<?
//ralph
echo "TIMESTAMP:" . Time() . "\r\n";
$cont = file_get_contents("http://ralph.bakerlab.org/rah_status.php");
if ($cont) {
$start = StrPos($cont,"<tr><td>Ready to send</td>");
$start = 9 + StrPos($cont,"</td><td>",$start);
$end = StrPos($cont,"<",$start);
$str = IntVal(SubStr($cont,$start,$end-$start));
}
else {
$str = 0;
}
echo "RALPH:$str\r\n";

//LHC
$cont = file_get_contents("http://lhcathome.cern.ch/lhcathome/server_status.php");
if ($cont) {
$start = StrPos($cont,"<tr><td>Ready to send</td>");
$start = 9 + StrPos($cont,"</td><td>",$start);
$end = StrPos($cont,"<",$start);
$str = IntVal(SubStr($cont,$start,$end-$start));
}
else {
$str = 0;
}
echo "LHC:$str\r\n";
?>



W razie jakiejś pilniejszej sprawy - jestem często dostępny na kanale IRC B@P, na forum czasami zapominam zajrzeć lub nie mam czasu.

Timaxi

Cytat: TJM w 02 Sierpień 2008, 16:36
EDIT: które projekty oprócz RALPHa i LHC warto monitorować ?
Jak na razie w Orbit@home próbki rzadko się pojawiają.


Mchl

TJM: a wiesz że w większości projektów działa taka sztuczka?
http://lhcathome.cern.ch/lhcathome/server_status.php?xml=1

W nagłych wypadkach wzywać przez: mail: mchlpl[at]gmail.com | PM|mchl[a]boincatpoland.org

TJM

W większości, ale nie we wszystkich, spróbuj np. w RALPHu.

Swoją drogą coś kiepsko się odświeża server_status RALPHa, ten 1 WU wisi tam już ze 40 minut mimo że na serwie dawno go nie ma.

Najprostsza wersja windowsowego programiku razem ze źródłami: http://plikens.no-ip.net/644xzvwt4/aupdate.zip - tu jeszcze bez synchronizacji i limitu updejtów jednego projektu. Sam progs i plik .ini wystarczy wrzucić do katalogu z exekami BOINCa i stamtąd odpalać.

Progs korzysta z bibliotek Internet Explorera (zajmuje przez to jakieś 3MB pamięci zamiast 400kB, ale kod jest prosty bo nie trzeba bawić się w sockety) i tworzy tymczasowy plik p_status (w którym są ściągnięte dane o ilości próbek)

EDIT: poprzednia wersja nie miała prawa działać poprawnie, była z czasów testów kiedy skrypt zwracał 0 lub 1 (nie ma/są zadania), nowsza wersja zwraca też liczbę i skrypt się gubił  :)

Dodatkowo url skryptu monitorującego zmieniony, żeby nie było problemów przy zmianach IP.

EDIT2: Kolejny mały update, z działającą synchronizacją do 'serwera' i opóźnieniami, tak że w razie pojawienia się zadań updejty wymuszane są co 15 minut a nie przy każdym uaktualnieniu danych.

W razie jakiejś pilniejszej sprawy - jestem często dostępny na kanale IRC B@P, na forum czasami zapominam zajrzeć lub nie mam czasu.

RAD-Poland

ta "1" w RALPH'e jest prawie zawsze
a ostatnia z podstawowego rozdania próbka została wysłana przez serwer 30 Jul 2008 22:16:57 UTC http://ralph.bakerlab.org/workunit.php?wuid=953729

osobiście mam inny sposób na łupienie jednostek ustalam adres dla kolejnej jednostki w tym wypadku http://ralph.bakerlab.org/workunit.php?wuid=953730 i czekam na zmianę nagłówka Unable to handle request -> Workunit details

EDIT: jeśli się zmieni wiem że puścili nową serię próbek w projekcie

   
WCG:
PG:         YOYO:

     

TJM

Hm dziwne ostatnio w RALPHu widziałem 0. Ale wiem skąd się bierze ta jedynka - to jest prawdopodobnie WU przypisany do aplikacji albo platformy której już nie ma, więc nigdy nie da się go wysłać. Dlatego od teraz skrypt zwraca wynik tylko jeśli jest więcej niż 10 zadań do pobrania, w przeciwnym wypadku 0.

Sposób z 'unable to handle request' będzie bardzo kiepsko działał w projektach, które mają ustawione keszowanie tych podstron na dużą wartość - domyślnie jest chyba 1 godzina, a server_status ma odświeżanie niezależne od ustawień cache, definiowane oddzielnie.

W razie jakiejś pilniejszej sprawy - jestem często dostępny na kanale IRC B@P, na forum czasami zapominam zajrzeć lub nie mam czasu.

RAD-Poland

nie wiem jak jest z tym keszowaniem, ale w RALPH po aktualizacji strony próbka jest dostępna po 6-8 sek, a w Hydrogen 12-14 sek. Robiłem ostatnio test właśnie w Hydrogenie i złapałem ponad 100 wu w 12 godzin, normalnie w tym czasie Manager BOINIC łowi 3-5 wu. Ważne, że działa.

EDIT: niestety do każdego projektu trzeba mieć inne podejście np.:

w RALPH'e jest ważny początek rozsyłania WU (przez ok 2h inaczej punktuje, wolę dostawać za próbkę 16-18 pkt/h wg mojego Managera Athlon64x2_3800+, niż później 9-11pkt/h jak widać dużo zaniżoną punktację

w Hydrogen dobrze jest zsynchronizować zegar z serwerem i odświeżać co 5min (jak mało jest jednostek to serwer rozsyła co 5min 1-2 wu)

w innych dostępność WU

   
WCG:
PG:         YOYO:

     

TJM

No z keszowaniem to chodzi o to, że wszystkie te podstrony z wynikami, statystykami itp są generowane a potem przechowywane przez jakiś czas na dysku serwera i odczytywane z cache. Domyślnie czas przechowywania to chyba 3600s więc 1h. Możliwe jednak, że strony z błędami typu unable to handle request nie są keszowane - zaraz to sprawdzę.

Edit: No i chyba tak właśnie jest, strony z błędami (Can't find workunit) nie podlegają keszowaniu, przynajmniej na moim serwie. Co oznacza że jest to ciekawa metoda i chyba zaimplementuję ją w moim skrypcie %-)

W razie jakiejś pilniejszej sprawy - jestem często dostępny na kanale IRC B@P, na forum czasami zapominam zajrzeć lub nie mam czasu.