I'm using QALoad v5.5 Build 507 with 3 players (70 VUs) to test a web application.
The QALoad Conductor's test is configured to run 4 transactions per VU. Each transaction does a sign-in, a search, loop 100 times to process 'work items' (when an item is 'saved' the web app retuns the 'next item' automatically) then exit the loop and sign-out. The entire test takes about an hour to run and simulates 2 days of real-time "work".
At the start of the test, the 3 Players report their "% Memory Used" to the Conductor as (23%, 23%, 25%) respectively and upon completion as (55%, 56% and 55%). I seem to be leaking about 1 MB per VU per QALoad transaction!
My problem is that if I configure QALoad to run too many VUs or transactions (for example to simulate 1 week of non-stop activity) then the QAPlayers run out of memory and crash.
The PC's hosting the Players are dedicated to QALoad (the OS for the Players are Win XP/Pro SP2 and one is Win2000 Server, all loaded with MS-IE7) - nothing else is running on them. The Players are not executing any code nor files that are being downloaded during the test.
Regarding the test script, I used QALoad's VisTree to extract 3 run-time "IDs" to local variables, the generated code uses the 'Get( REPLY, STRING, sStartDelim, sEndDelim)' routine to extract the value and assigns the values to CLoadStrings. I do not see anyplace in the generated code that these extracted strings are freed/de-allocated. Should they be?
If I add this:
const char* pBuffer = Get( REPLY, ENTIRE_BUFFER);
to the generated code, do I need to do a
free( pBuffer );
?? -- I tried including the 'free' -- and this seemed to cause the Player to crash (though it reported crashing at a different line; when I comment-out the "free" then the Player runs without error)...
Aside from this run-time reference to the 'entire buffer', I suspect that my problem is in my customization of a captured DWR command that saves the work items (I need to replace the 3 QALoad-captured-IDs with the actual run-time IDs).
The DWR-command to 'save the work item' that was captured by QALoad is big - over 16K, and is assigned to a CLoadString variable. I have a routine that replaces the 3 static-captured-values using a call to "CLoadString.SetSeperator( sStaticValueToReplace )".