Initial roughing out of some profiling context

wcat binaries (http://www.iis.net/community/default.aspx?tabid=34&g=6&i=1466)
Orchard.Profiling project to hold some wcat scripts for generating stress-style load and specflow features for generating fixed sets of requests
"add profiling data" command in Orchard.DevTools to create a number of samples page and blog content items
"build.cmd profiling" target creates build\Profiling web dir from clean build, and execs baseline setup and population via orchard cmdline

--HG--
branch : dev
This commit is contained in:
Louis DeJardin
2010-05-06 12:53:27 -07:00
parent c0519a48b1
commit 17fcea6e86
34 changed files with 5753 additions and 3 deletions

View File

@@ -0,0 +1,66 @@
scenario
{
name = "IIS Home Page";
warmup = 30;
duration = 120;
cooldown = 10;
/////////////////////////////////////////////////////////////////
//
// All requests inherit the settings from the default request.
// Defaults are overridden if specified in the request itself.
//
/////////////////////////////////////////////////////////////////
default
{
// send keep-alive header
setheader
{
name = "Connection";
value = "keep-alive";
}
// set the host header
setheader
{
name = "Host";
value = server();
}
// HTTP1.1 request
version = HTTP11;
// keep the connection alive after the request
close = ka;
}
//
// This script is made for IIS7
//
transaction
{
id = "Default Web Site Homepage";
weight = 1;
request
{
url = "/";
statuscode = 200;
}
request
{
url = "/welcome.png";
statuscode = 200;
}
//
// specifically close the connection after both files are requested
//
close
{
method = reset;
}
}
}

View File

@@ -0,0 +1,102 @@
settings
{
//--------------------------------------------------------------------------
// General controller settings
//
// clientfile - specifies the client file, relative to working dir
// server - host name of the webserver
// virtualclients - number of 'threads' per physical client
// clients - number of physical webcat client machines
//
//--------------------------------------------------------------------------
// Example:
//
// clientfile = "ubr\lcw2.light.ubr";
// server = "webserver";
// clients = 10;
// virtualclients = 100;
//
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
// Performance counters (pass '-x' option to wcctl.exe to enable)
//
// interval - polling interval in seconds (default=10)
// host - host name of machine to monitor (default=webserver)
// counter - path of counter to monitor
//
//--------------------------------------------------------------------------
// Optional:
//
// Additional machines can be monitored by adding more counters blocks.
//
// Example:
//
// counters {
// host = "sqlserver"; // name of remote machine
// interval = 5;
// counter = "...";
// }
//
//--------------------------------------------------------------------------
counters
{
interval = 10;
counter = "Processor(_Total)\\% Processor Time";
counter = "Processor(_Total)\\% Privileged Time";
counter = "Processor(_Total)\\% User Time";
counter = "Processor(_Total)\\Interrupts/sec";
counter = "Memory\\Available KBytes";
counter = "Process(w3wp)\\Working Set";
counter = "System\\Context Switches/sec";
counter = "System\\System Calls/sec";
counter = "Web Service(_Total)\\Bytes Received/sec" ;
counter = "Web Service(_Total)\\Bytes Sent/sec" ;
counter = "Web Service(_Total)\\Connection Attempts/sec" ;
counter = "Web Service(_Total)\\Get Requests/sec" ;
}
//--------------------------------------------------------------------------
// Registry Key Monitors (pass '-x' option to wcctl.exe to enable)
//
// path - registry path, relative to HKLM
// name - name of registry key
// type - type of value (REG_SZ | REG_DWORD)
//
//--------------------------------------------------------------------------
// Optional:
//
// Additional registry keys can be monitored on the web server by
// adding more registry blocks to this file. Note that simple strings and
// dwords are all that webcat currently supports.
//
// Example:
//
// registry {
// path = "System\\CurrentControlSet\\Services\\Tcpip\\Parameters";
// name = "DhcpDomain";
// type = REG_SZ;
// }
//
//--------------------------------------------------------------------------
registry
{
path = "System\\CurrentControlSet\\Control\\FileSystem";
name = "NtfsDisableLastAccessUpdate";
type = REG_DWORD;
}
registry
{
path = "System\\CurrentControlSet\\Services\\Tcpip\\Parameters";
name = "SynAttackProtect";
type = REG_DWORD;
}
}

View File

@@ -0,0 +1,14 @@
#ifndef _PRECOMP_H
#define _PRECOMP_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <winsock2.h>
#include <windows.h>
#include <ws2tcpip.h>
#include <mswsock.h>
#endif // _PRECOMP_H

View File

@@ -0,0 +1,186 @@
#include <stdlib.h>
#include <windows.h>
#include "precomp.h"
#define MAX_VIEWSTATE (1024)
#define VIEWSTATE "__VIEWSTATE"
#define VIEWSTATE_LEN (10)
#define MAX_TAG_NAME (128)
#define WCATRESULT_ERROR (-1)
#define WCATRESULT_SUCCESS (0)
#define WCATRESULT_MORE_DATA_NEEDED (1)
#define WCATRESULT_NEXT_PACKET (2)
typedef enum _USER_STATE
{
UserStateFindViewState,
UserStateFindValue,
UserStateFindEqual,
UserStateFindFirstQuote,
UserStateGetValue,
UserStateFinished
} USER_STATE;
typedef struct _USER_DATA
{
USER_STATE state;
char viewstate[MAX_VIEWSTATE];
} USER_DATA, *PUSER_DATA;
BOOL WINAPI DllMain(
IN HINSTANCE hinstDll,
IN DWORD dwReason,
IN LPVOID lpvContext
)
{
switch( dwReason ) {
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
default:
return FALSE;
}
return TRUE;
}
DWORD GetViewstate(PVOID *context, DWORD argc, PCHAR argv[], PCHAR *result)
{
PUSER_DATA user;
if (*context == NULL)
{
*result = NULL;
return 0;
}
user = *context;
*result = user->viewstate;
return 0;
}
DWORD ResponseFilter(PVOID *context, DWORD argc, PCHAR argv[], PCHAR packet, ULONG_PTR len, ULONG_PTR sequence)
{
PCHAR buffer = packet;
DWORD i = 0;
PUSER_DATA user = NULL;
if (*context == NULL)
{
*context = calloc(1, sizeof(USER_DATA));
if (NULL == *context)
{
return -1;
}
}
user = *context;
if (sequence == 0)
{
user->state = UserStateFindViewState;
user->viewstate[0] = '\0';
}
//
// fastpath for when we don't have any work to do
//
if (user->state == UserStateFinished)
{
return WCATRESULT_SUCCESS;
}
while (len && *buffer)
{
switch (user->state)
{
case UserStateFindViewState:
if (*buffer == '_')
{
if (len < VIEWSTATE_LEN)
{
return WCATRESULT_MORE_DATA_NEEDED;
}
if (_strnicmp(buffer, VIEWSTATE, VIEWSTATE_LEN) == 0)
{
len -= VIEWSTATE_LEN-1;
buffer += VIEWSTATE_LEN-1;
user->state = UserStateFindValue;
}
}
break;
case UserStateFindValue:
if (*buffer == 'v' || *buffer == 'V')
{
if (len < 5)
{
return WCATRESULT_MORE_DATA_NEEDED;
}
if (_strnicmp(buffer, "value", 5) == 0)
{
len -= 4;
buffer += 4;
user->state = UserStateFindEqual;
}
}
break;
case UserStateFindEqual:
if (*buffer == '=')
{
user->state = UserStateFindFirstQuote;
}
break;
case UserStateFindFirstQuote:
if (*buffer == '"')
{
user->state = UserStateGetValue;
}
break;
case UserStateGetValue:
i = 0;
for (i=0; len && *buffer && *buffer != '"'; i++, len--, buffer++)
{
if (i > MAX_VIEWSTATE)
{
return WCATRESULT_ERROR;
}
user->viewstate[i] = *buffer;
}
if (len == 0 || *buffer != '"')
{
return WCATRESULT_MORE_DATA_NEEDED;
}
user->viewstate[i] = '\0';
user->state = UserStateFinished;
break;
case UserStateFinished:
break;
default:
break;
}
len--; buffer++;
}
return WCATRESULT_SUCCESS;
}

View File

@@ -0,0 +1,7 @@
; MYTESTSERVICE.def : declares the module parameters for the DLL.
LIBRARY "Viewstate"
EXPORTS
GetViewstate
ResponseFilter

View File

@@ -0,0 +1,9 @@
#ifndef _WCAT_H
#define _WCAT_H
#define WCATRESULT_ERROR (-1)
#define WCATRESULT_SUCCESS (0)
#define WCATRESULT_MORE_DATA_NEEDED (1)
#define WCATRESULT_NEXT_PACKET (2)
#endif // define _WCAT_H