Domanda

Sto cercando di sviluppare una piccola applicazione che i test quante richieste al secondo il mio servizio in grado di supportare, ma penso che sto facendo qualcosa di sbagliato. Il servizio è in una fase di sviluppo iniziale, ma mi piacerebbe avere a portata di mano questo test per verificare di tanto in tanto non sto facendo qualcosa che diminuire le prestazioni. Il problema è che non riesco a ottenere il server Web o il server di database andare al 100% della CPU.

sto usando tre diversi computer, in uno è il web server (winsrv standard 2008 x64 IIS7), in altri database (Win 2K, SQL Server 2005) e l'ultimo è il mio computer (Win7 x64 Ultimate), dove corro il test. I computer sono collegati attraverso un commutatore 100 ethernet. La richiesta è POST 9 byte e la risposta sarà 842 byte.

I lanci sperimentali diversi fili, ed ogni filo ha un ciclo while, in ciascun ciclo crea un oggetto WebRequest, esegue una chiamata, incrementare un contatore e attende comune tra 1 e 5 millisecondi, allora farlo di nuovo:

static int counter = 0;

static void Main(string[] args)
{
    ServicePointManager.DefaultConnectionLimit = 250;

    Console.WriteLine("Ready. Press any key...");
    Console.ReadKey();
    Console.WriteLine("Running...");

    string localhost = "localhost";
    string linuxmono = "192.168.1.74";
    string server = "192.168.1.5:8080";

    DateTime start = DateTime.Now;

    Random r = new Random(DateTime.Now.Millisecond);
    for (int i = 0; i < 50; i++)
    {
        new Thread(new ParameterizedThreadStart(Test)).Start(server);
        Thread.Sleep(r.Next(1, 3));
    }

    Thread.Sleep(2000);

    while (true)
    {
        Console.WriteLine("Request per second :"
            + counter / DateTime.Now.Subtract(start).TotalSeconds);
        Thread.Sleep(3000);
    }
}

public static void Test(object ip)
{
    Guid guid = Guid.NewGuid();

    Random r = new Random(DateTime.Now.Millisecond);
    while (true)
    {
        String test = "<lalala/>";
        WebRequest req = WebRequest.Create("http://"
            + (string) ip + "/WebApp/" + guid.ToString()
            + "/Data/Tables=whatever");
        req.Method = "POST";
        req.ContentType = "application/xml";
        req.Credentials = new NetworkCredential("aaa", "aaa","domain");
        byte[] array = Encoding.UTF8.GetBytes(test);
        req.ContentLength = array.Length;
        using (Stream reqStream = req.GetRequestStream())
        {
            reqStream.Write(array, 0, array.Length);
            reqStream.Close();
        }

        using (Stream responseStream = req.GetResponse().GetResponseStream())
        {
            String response = new StreamReader(responseStream).ReadToEnd();
            if (response.Length != 842) Console.Write(" EEEE ");
        }

        Interlocked.Increment(ref counter);

        Thread.Sleep(r.Next(1,5));
    }
}

Se si esegue il test di nessuno dei computer fanno un uso eccessivo della CPU. Diciamo che ho un X richieste al secondo, se faccio funzionare l'applicazione console due volte nello stesso momento, ho X 2 richiesta / al secondo in ognuno ... ma ancora il server web è il 30% della CPU, della server di database, il 25% ...

ho cercato di rimuovere il Thread.Sleep nel ciclo, ma non fa una grande differenza.

mi piacerebbe mettere le macchine al massimo, per verificare come possono richieste al secondo che possono fornire. Pensai che avrei potuto fare in questo modo ... ma a quanto pare mi manca qualcosa qui ... Qual è il problema?

Cordiali saluti.

È stato utile?

Soluzione

Ci sono un sacco di fattori limitanti oltre alla CPU su un server web. Ci sono un sacco di impostazioni di IIS, che della valvola a farfalla il numero di connessioni può essere servita.

Vorrei leggere questo:

http://www.eggheadcafe.com/articles/20050613.asp

so che è per IIS 6, ma ci sono cose che continueranno ad applicarsi.

Se si ha accesso a MSDN e hanno VS 2010 Ultimate, vorrei controllare il loro carico di strumenti di test. L'acquisto del programma di test di carico può essere costoso, ma se avete bisogno di prova di qualcosa di specifico, è possibile utilizzare la versione di prova per compiere quello che ti serve. È possibile utilizzarlo per monitorare e tempo di risposta, l'utilizzo dei server, ecc Vale la pena di essere esaminata.

Altri suggerimenti

IMO, è meglio utilizzare SoapUI per il test. È possibile regolare facilmente il banco di prova per il numero di thread, numero di iterazioni, ecc .. e si metterà a rappresentare graficamente i risultati. Quando si colpisce l'altopiano dove si sopraffare il server, vedrete che sul grafico. Se un PC non è sufficiente, basta eseguire più di loro su altri PC. Si può fare tutto questo con la versione gratuita.

Sono d'accordo con Chris, e sarebbe fare un passo ulteriore per raccomandare JMeter, in quanto si può anche testare il database e webapp, il tutto all'interno dello stesso script.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top