Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    12

    Affidabilità socket Server

    Buona sera.....
    ecco il mio primo post!!!!
    Volevo un consiglio da qualche esperto.
    Ho realizzato un server in php 5, logicamente OOP, utilizzando i socket non bloccanti.

    create AF_INET, SOCK_STREAM, SOL_TCP
    bind
    listen
    select
    accept

    Il tempo della select (int $tv_sec , int $tv_usec) varia da 1 a 30 secondi in base a cosa si aspetta il server.

    Esempio:
    Server fa una domanda a client1.
    Client1 deve rispondere entro 60 secondi, se non risponde entro il limite la risposta deve risultare sbagliata;
    Quindi il tempo di uscita della select sarà + o - di 2 secondi, in modo che se il client non risponde il sistema non resta in attesa di dati e fa la domanda ai successivi client connessi.
    Qualcuno si starà chiedendo: perchè non impostarlo a 60 secondi visto che il tempo a disposizione per rispondere è di 60 secondi?
    Ovvio, mentre il server aspetta la risposta del client1 interagisce con gli altri client, quindi impostando un tempo di 60 secondi si può avere un margine di errore di 59.9 periodico
    invece impostandolo a 2 scende a 1.9 periodico (abbastanza accettabile).
    Quindi a volte c'è un polling ogni 2 secondi a volte ogni 60 secondi.
    Il tutto scritto perfettamente e funziona molto bene senza problemi (testato con 10 utenti)!
    Il server funzionerà da shell.

    i miei quesiti sono questi:
    Quanto è affidabile php? E le funzioni per la gestione dei socket quanto sono affidabili?
    Quanti utenti riesce a mantenere un server come questo,
    tenendo conto che invia a tutti gli utenti loggati una media di 20 bytes ogni 5 secondi e riceve da tutti gli utenti un media 10 bytes ogni 10 secondi?
    Quanti utenti riesce a tenere non avendo problemi di banda?
    Per quanto tempo mi resta bloccata l'applicazione nel momento in cui il server deve inviare a 1000 utenti 10 bytes, avendo il server una velocità di upload di 100 Kbytes/s e tralasciando quella in download dei client?
    Facendo 2 calcoli abbiamo 9.766 kbytes da inviare, quindi l'applicazioni dovrebbe impiegare un decimo di secondo + il tempo per l'istruzione send + il tempo per il ciclo!
    Quanto tempo ci vuole per l'esecuzione del send?
    E la domanda più importante......quanto mi conviene riscrivere il server in C# utilizzando l'invio e la ricenzione di dati in modo asincrono?


    Attendo tante risposte....
    TNX

    Peccato che php non supporta la programmazione multi-thread...

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398
    Quanto è affidabile php? E le funzioni per la gestione dei socket quanto sono affidabili?
    E' affidabile quanto il c quelle funzioni chiamano le funzioni corrispondenti in c


    Quanti utenti riesce a mantenere un server come questo,
    tenendo conto che invia a tutti gli utenti loggati una media di 20 bytes ogni 5 secondi e riceve da tutti gli utenti un media 10 bytes ogni 10 secondi?
    Quanti utenti riesce a tenere non avendo problemi di banda?
    Per quanto tempo mi resta bloccata l'applicazione nel momento in cui il server deve inviare a 1000 utenti 10 bytes, avendo il server una velocità di upload di 100 Kbytes/s e tralasciando quella in download dei client?
    Facendo 2 calcoli abbiamo 9.766 kbytes da inviare, quindi l'applicazioni dovrebbe impiegare un decimo di secondo + il tempo per l'istruzione send + il tempo per il ciclo!
    Quanto tempo ci vuole per l'esecuzione del send?
    E la domanda più importante......quanto mi conviene riscrivere il server in C# utilizzando l'invio e la ricenzione di dati in modo asincrono?
    Leggendo questo post mi e' venuta in mente questa scena

    Ci sono tantissime variabili la cosa piu conveniente e' fare un test di carico.



    Andrea

  3. #3
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    Originariamente inviato da andreamk
    Leggendo questo post mi e' venuta in mente questa scena
    Ma ROTFL, la stessa cosa che ho pensato io!

  4. #4

    Re: Affidabilità socket Server

    Originariamente inviato da IfElseIf
    Il tempo della select (int $tv_sec , int $tv_usec) varia da 1 a 30 secondi in base a cosa si aspetta il server.
    di solito conviene piuttosto mettere i millisecondi (usec) su 10 e i secondi su zero.

    questo perché tenere bloccato il processo inutilmente non conviene ... ovviamente se usi un sistema basato su un singolo processo e ti serve nel contempo effettuare altre operazioni

    se invece utilizzi il fork per gestire singolarmente le socket e poi utilizzi una socket unix/shared memory/pipe per comunicare con il processo principale non ha molta importanza la durata del bloccaggio del select perché tanto se gli arriva roba dalla socket usata per comunicare scatta il select e prosegue

    i miei quesiti sono questi:
    Quanto è affidabile php? E le funzioni per la gestione dei socket quanto sono affidabili?
    Quanti utenti riesce a mantenere un server come questo,
    tenendo conto che invia a tutti gli utenti loggati una media di 20 bytes ogni 5 secondi e riceve da tutti gli utenti un media 10 bytes ogni 10 secondi?
    Quanti utenti riesce a tenere non avendo problemi di banda?
    Per quanto tempo mi resta bloccata l'applicazione nel momento in cui il server deve inviare a 1000 utenti 10 bytes, avendo il server una velocità di upload di 100 Kbytes/s e tralasciando quella in download dei client?
    Facendo 2 calcoli abbiamo 9.766 kbytes da inviare, quindi l'applicazioni dovrebbe impiegare un decimo di secondo + il tempo per l'istruzione send + il tempo per il ciclo!
    Quanto tempo ci vuole per l'esecuzione del send?
    E la domanda più importante......quanto mi conviene riscrivere il server in C# utilizzando l'invio e la ricenzione di dati in modo asincrono?
    .
    .
    .
    Peccato che php non supporta la programmazione multi-thread...
    Beh, in realtà PHP ha un estensione nel pecl per utilizzare i thread, anche se forse è stata un pò messa da parte, perché il suo core è thread safe a differenza di alcune estensioni (estensioni che ad es su IIS fanno impazzire tutto)

    detto questo, php è affidabile fin quando non raggiungi il limite di memoria prefissato per l'esecuzione, a meno di disabilitarlo, ed è affidabile sempre ricordandosi che NON E' codice macchina eseguito ma un bytecode interpretato a differenza di C# che è un bytecode compilato in codice macchina (tramite JIT, o AOT)

    Se sei in grado di scriverlo in C#, bene, allora ti consiglio C# (ci programmo pure io) tanto mono su linux funziona perfettamente per queste cose

    detto questo ... perché scrivere un server? XML-RPC o WSDL/SOAP e php come backend su apache e ti risolvi il problema

    è vero che il sistema è stateless ma ti basta controllare dopo quanto ricevi le informazioni usando le sessioni (su database non quelle di php, se cerchi sul forum c'è tutto e di più) e ti risolvi subito il problema

    è molto meno complesso di scrivere un server (fatto bene intendo) e nel contempo è anche più flessibile e manutentibile!

    esiste un assembly per C# per interfacciarsi con XML-RPC che è estremamente comodo e per php esistono svariate classi per gestire server xml-rpc che sono estremamente facili da usare

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    12
    Un webservice credo che non vada bene per il tipo di sistema.
    Praticamente ho realizzato una piattaforma per un gioco di società culturale.
    La parte client svolge le seguenti operazioni:
    Autentificazione tramite protocollo http e ricezione di user e pass criptati.
    Ricezione dei vari giochi di società disponibili
    Scelta del gioco al quale si vuole partecipare e trasparente all'utente autentificazione tramite socket (Ogni Gioco è un server diverso in ascolto su una porta diversa)
    Entrata in gioco
    Ricezione e invio di domande e risposte
    Il server gestisce i turni tra i vari utenti collegati, fa le domande, riceve le risposte, assegna il punteggio e intanto accetta gli altri utenti che si collegano e permette di chattare e svolgere altre operazioni.
    Il tutto con un protocollo ad hoc in modo da poter risparmiare + banda possibile visto che i giochi saranno + di 20.

    Beh, in realtà PHP ha un estensione nel pecl per utilizzare i thread
    Quale?

    E' affidabile quanto il c quelle funzioni chiamano le funzioni corrispondenti in c
    Però per ogni ogni operazione impiega moltissimo tempo + del c, anche per semplici cicli, semplici comparazioni e semplici assegnazioni.
    La funzione socket_select si comporta in modo strano
    int socket_select ( array $lettura, array $scrittura, array $except, int $tv_sec [, int $tv_usec] )

    Impostando solo il valore $tv_sec la funzione si comportava in modo strano, non ricordo se usciva subito dalla select o restava in attesa senza timeout, cmq fatto sta che funziona bene solo impostando il valore in secondi (sec) e il corrispettivo in millisecondi (usec).
    Es:
    Codice PHP:
    $sockAttenzione=socket_select($changedSockets$write NULL$except NULL2,2000); 
    In C si comporta nello stesso modo?

    di solito conviene piuttosto mettere i millisecondi (usec) su 10 e i secondi su zero
    Impostando un valore di timeout molto basso si ha un sovraccarico della cpu, quindi bisogna tenerlo + alto possibile in basse alle propie esigenze.

    Il server non avrà un tempo limite di esecuzione sarà in funzione 24H al giorno, 365 giorni all'anno, php ce la fa?

  6. #6
    si php c'è la fa, ma è pesante

    ti ripeto, se hai possibilità sviluppalo in C#, le differenze sono abbissali (ovviamente direi pure)

    i millisecondi bassi, se non troppo bassi, non influiscono più di tanto sulla CPU ... già 20 millisecondi di attesa non influiscono sul processore più di tanto perché vuol dire che nell'arco di un secondo la procedurà verrà eseguita una cinquantina di volte nell'arco di un secondo

    però tutto dipende da cosa ti serve effettivamente fare ^^

    anche che scatta la select e tu procedi senza fare nulla la cpu mica fa chissa che tipo di lavoro .. e anche che c'è ne sono 20 che lo fanno ... non è che se ne accorga minimamente

    codice:
    while(...)
    {
      select(...)
      if(...)
      {
        // nessuna socket
        continue
      }
    }

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    12
    ehehehe........è dura.
    è + o - un mese che ho messo mani su c# ho creato anche un server.
    Solo che non avendo tanta esperienza in tale linguaggio ho paura di inciampare in falli che possano incidere sulla sicurezza!!!

    Qualcuno ha mai usato phalander?
    So che è php dot net magari mi permette di usare php in multithread!!!!!!!Sarebbe magia!!!!

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    12
    Inoltre C# è veloce quanto PHP ad eseguire query su mysql con mysqldrivercs?
    Mi permette di avere una connessione permanente com mysql_pconnect, non so se quella del driver ad un certo punto si chiude o resta sempre aperta, è un pò pesante connettersi eseguire la query e disconnettersi ogni volta!!!

  9. #9
    Originariamente inviato da IfElseIf
    ehehehe........è dura.
    è + o - un mese che ho messo mani su c# ho creato anche un server.
    Solo che non avendo tanta esperienza in tale linguaggio ho paura di inciampare in falli che possano incidere sulla sicurezza!!!

    Qualcuno ha mai usato phalander?
    So che è php dot net magari mi permette di usare php in multithread!!!!!!!Sarebbe magia!!!!
    Io l'ho usato per svariati progetti, nel mio caso specifico mi serviva sviluppare degli ADDIN in php, che si scaricavano tramite webservice, e farli eseguire al mio client. Il client li caricava tramite webservice e, dopo essersi assicurati che erano validi, li caricava ed eseguiva.

    Considera però che non c'è la versione stabile dell'ultima serie (che dovresti usare) anche se comunque io, usando tanta roba del .NET, non ho riscontrato problemi.

    Considera che anche se usi Phalanger, dovresti conoscere BENE come lavorare con il .NET perché vuol dire che dovresti comunque usare le funzioni del .NET e non quelle di php Motivo per il quale ti dico "tanto vale che usi C# "

    Originariamente inviato da IfElseIf
    Inoltre C# è veloce quanto PHP ad eseguire query su mysql con mysqldrivercs?
    Mi permette di avere una connessione permanente com mysql_pconnect, non so se quella del driver ad un certo punto si chiude o resta sempre aperta, è un pò pesante connettersi eseguire la query e disconnettersi ogni volta!!!
    La velocità di esecuzione di una query non dipende dal client ma dal server, poi una volta che arrivano i dati vengono trattati nello stesso modo. Nel caso del driver ufficiale di mysql per il .NET, è sviluppato interamente in codice managed motivo per il quale non solo è molto performante ma non deve fare un continuo marshalling dei dati avanti ed indietro dal mondo Nativo/Gestito per far funzionare il tutto.

    Detto questo, la connessione permanente non vedo a cosa ti serva ... LOL ... ti basta non chiuderla

    Ogni thread che effettua le operazioni comunica con il thread principale che effettua le operazioni sul database ... un ambiente multi-thread che non ti esploda vuol dire questo

    NOTA: che motivo avrebbe di chiudersi la connessione? mica lo fa per passa tempo o per piacere ... se c'è errore la chiude, certo, altrimenti rimane aperta fin quando non la chiudi tu!

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    12
    che motivo avrebbe di chiudersi la connessione? mica lo fa per passa tempo o per piacere ... se c'è errore la chiude, certo, altrimenti rimane aperta fin quando non la chiudi tu!
    ahahahahaahahah.....php lo faceva dopo un pò di ore che il server era inutilizzato la connessione non si chiudeva ma era inutilizzabile!
    Risolto con mysql_ping!!

    Certo che PHP ne ha di problemi...quando si inizia a fare qualcosa di + grosso escono tante pecche!

    Una domanda un pò off-topic....C# gestisce i float come php, costringendomi ad utilizzare la libreria BCMath?

    Cmq grazie per la disponibilità, mi hai convinto, passerò a c# per queste cose....caso mai fatti un giro nella sezione programmazione....ne avrò bisogno!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.