Per chi non lo sapesse OpensSimulator e` la versione Open Source del server per mondi virtuali tipo Second Life. Per chi non sapesse cos'e` Second Life, invece, posso solo dire che anche i dinosauri, per quanto grossi, si sono estinti, ed e` il caso di evolversi, altrimenti si rischia la stessa fine :)
Ho installato sul mio server la versione piu` recente presa da OSGrid, precisamente la 0.6.9-post-patches, e l'ho configurata come server standalone, ovvero non collegata a nessuna grid particolare. Tuttavia e` hypergrid enabled, questo significa che se aprissi le opportune porte sul mio firewall, dall'esterno sarebbe possibile collegarsi e visitare i luoghi virtuali dei miei hackeraggi. Meglio di, non con una adsl come la mia, perlomeno.
La configurazione e` stata un discreto bagno di sangue, risolta poi scaricando una distribuzione gia` preconfezionata (Diva), e riutilizzando i config files adattandoli alle mie esigenze.
OpenSimulator e` scritto in C#, quindi dovendo girare su un server linux (non penserete mica sul serio che usi windows per un server) mi sono dovuto installare anche l'ultima versione di mono. Scaricare, compilare, insomma, le solite cosa da linux geek. Di tutto questo parlero` in dettaglio (pensando di fare cosa gradita a molti) in un altro post, per il momento preferisco buttare giu` qualche impressione a caldo mentre sevizio in modo ignobile la mia isola personale, un diario di bordo del perfetto hacker sadico, insomma.
Come prima cosa, ho creato un prim con uno script che mi mostrasse in tempo reale le statistiche principali della regione (FPS, numero di prim, occupazione di RAM):
vector color1 = <0,1,0>;
vector color2 = <1,1,0>;
vector colorw = <1,0,0>;
integer color = 1;
default
{
state_entry()
{
llSay(0, "monitor running");
llSetTimerEvent( 2.0 );
}
timer()
{
string tstr = "";
list tlist = osGetRegionStats();
vector tcolor;
tstr += "Dilatn: " + llList2String(tlist,0) + "\n";
tstr += "SimFPS: " + llList2String(tlist,1) + "\n";
tstr += "PhyFPS: " + llList2String(tlist,2) + "\n";
tstr += "Prims: " + llList2String(tlist,6) + "\n";
tstr += ".\n";
tstr += "RAM: " + (string)(osGetSimulatorMemory() / 1024 / 1204) + " Mb\n";
tstr += ".\n.\n.\n";
if (color == 1) {
tcolor = color2;
color = 2;
} else {
color = 1;
if (llList2Integer(tlist,0) <> 44000) {
tcolor = colorw;
} else {
tcolor = color1;
}
}
llSetText( tstr, tcolor, 1.0 );
}
}
Quindi ho indossato il prim (lo vedete sulla mia testa) e mi sono messo a creare prim a gogo, a mille alla volta, fino a raggiungere il massimo consentito dalla regione, che e` 45000. Per la verita` i prims in regione sono 45000 + 1, ma quello che ho sulla testa non conta riguardo al numero massimo.
Non ho capito perche`, ma la finestra di info della regione (dal client, sto usando Imprudence), mi diche il numero massimo di oggetti sulla land e` 15000, il che non e` ovviamente vero. Aggiunge anche che i 30mila oggetti in piu` saranno cancellati. Non e` vero neanche questo.
Ho continuato a creare prim (altri 1000 per la precisione), e me li ha lasciati creare. A questo punto ero perplesso. Dopo un restart le cose si sono chiarite, al reload della regione sono stati ricaricati solo 45000 prim, gli altri ... puff, andati. Il fatto che li abbia potuti creare ugualmente probabilmente e` per via che sto usando il master avatar (il super admin, insomma). Che mi da` il potere di creare cose che poi pero` saranno spazzate via. Ci deve essere un messaggio profondo in questa faccenda, ma non e` il momento di pensarci, ora.
Invece, alcuni dati: con 45mila prims l'occupazione di RAM riportata e` di circa 372Mb, ma non so per quale motivo mentre li creavo ho raggiunto un massimo di 90Mb. Solo dopo un restart della regione, quando ne ha ricaricato il contenuto, l'occupazione e` schiz zata a 372Mb.
L'occupazione reale del processo, secondo quanto dice top, e` di 438 Mb, mono ci mette il suo hoverhead, ovviamente. Segnatevi questi dati di massima, se intendete sperimentare anche voi, e non volete mandare in vacca la vostra povera macchina linux per mancanza di RAM :)
Una curiosita`, il comando "show stats" dalla console di opensim mostra un'occupazione di ram di 297Mb .. dato che dovrebbe riportare gli stessi valori della funzione usata nello script (gli altri in effetti sono uguali) non si capisce bene chi dei due abbia ragione.
Probabilmente nessuno dei due, visto che l'occupazione reale e` quella data dal sistema, che e ` quella che conta, alla fine.
Altra curiosita`: i prim sulla land sono memorizzati, nel database MySql, nelle due tabelle "prims" e "primshapes". Se li prendete su e li mettete nell'inventario, invece, finiscono nella tabella "assets". Ci sara` una ragione per cui hanno scelto di memorizzare le stesse cose in due posti differenti, invece che creare opportuni link, ma la cosa mi sfugge. Gli assets hanno un link che li collega, eventualmente, al vostro inventario. Una cosa e` certa, i prims nelle due prime tabelle sono solo quelli effettivamente sulla land, mentre gli assets non vengono mai cancellati, posso vedere che dentro ci sono le 15 o 20 versioni dello script che ho modificato piu` volte. Questa cosa non ha alcun senso, e credo funzioni allo stesso modo anche su Second Life. Il che spiega perche` questa tecnologia "non e` scalabile". Ovviamente, se ha dei flaws di progettazione di base cosi` grossolani. Spero almeno che vi sia in giro un task che permetta la pulizia del database, cosa pero` di cui dubito assai (dopo giorni di tribolazioni su questo software, sto cominciando ad entrare nella logica malata degli sviluppatori).
Durante la creazione dei prim, il motore fisico e` andato in mona, potevo passare attraverso i blocchi come se non esistessero. Dopo il restart le cose si sono sistemate, ora i prim sul terreno sono solidi come rocce. Visto anche la storia dell'occupazione iniziale di RAM piuttosto esigua, immagino che durante la creazione i prim siano stati piazzati nella scena in modo, come dire, parziale, e suppongo che ci sia un task di consolidamento che si occupa, di tanto in tanto, di rendere "reali" le cose create, task che pero` deve essere andato in mona assieme al motore fisico per la troppa roba creata (o troppa in troppo poco tempo). Anche il viewer ci mette d el suo, quando provo a sloggarmi ci mette circa un quarto d'ora per uscire. Ci metterebbe. Lo ha fatto la prima volta. Ora lo killo io prima :)
In questo momento ho creato altri 4 prim sulla land, quindi 4 oltre il limite. Nessun problema, neanche al motore fisico. Li vedete li` per terra, belli colorati. Ora faccio un restart della regione e vedo che fine fanno.
Bene, fatto. Nel senso che il comando "restart" ha ricaricato 45000 prims, e portato l'occupazione del processo a circa 600Mb. Della serie, gest iamo correttamente la reinizializzazione delle variabili, oppure e` mono (C#) che ha una garbage collection che fa cagare, o probabilmente en trambe le cose. D'altro canto un linguaggio nato in casa Microsozz non poteva essere granche`, e il fatto che sia stato scelto come base per lo sviluppo di questo progetto spiega molti dei problemi che lo affliggono. Parlo della mente contorta degli sviluppatori, non del linguaggio in se ;)
A parte gli scherzi, questo passa il convento, e comunque OpenSimulator e` uno progetto di tutto rispetto, dubito che si possa fare di meglio quando si lavora "on the edge", in un campo cosi` innovativo come questo.
Ok, evitiamo il restart. Facciamo un "quit" e facciamo ripartire l'istanza da zero, che e` meglio. Sicuramente se si ha intenzione di mettere questo mostro su un server in produzione meglio pensare ad un watchdog che appena lo vede divorare piu` ram del necessario, tak!, un colpo alla nuca e via che si riparte, meglio il crash di un'isola che il crash dell'interso sistema.
Ah ... 4 prim in piu` sono ancora li`. Anche questo e` interessante, nel senso che mi piacerebbe sapere con quale logica sono eseguiti i controlli dei limiti nel simulatore. Mi vengono in mente solo espressioni colorite e piuttosto oscene, quindi sorvoliamo.
Per ora mi fermo qui, ho hackerato abbastanza per stanotte. Vi invito a fare un giro sulle nostre isole pubbliche, qui: KUBiC HyperKUBiC, per ora sono vuote ma appena riesco a riappropriarmi della mia roba su Second Life (di questo parlero` in un altro post), si riempiranno.
Buona meta-navigazione.