I'm thinking I look at performance testing differently than a lot of people... 
For me, the objective of performance testing is to
establish what your system _can_ do, not what you need to accomplish. So when 
you are setting up your tests, you are trying to drive
your systems at maximum capacity for some extended period of time. Then you 
measure that capacity as your 'baseline'.

For every subsequent release of your code, you measure it against the 
'baseline', and determine whether the code got faster or
slower. If you determine that the slower (or faster) response is acceptable to 
your end users (because you were nowhere near the
user's acceptable standard), you can reset your baseline to that standard. If 
your slower standard is encroaching on the usability
of the system - you can declare that baseline as the minimum spec, and then 
fail any code that exceeds that standard.

As for how you determine what is acceptable to a 'user', that can be handled in 
a number of ways - without actually improving the
'real' performance of the system. Consider a web page that loads a bunch of 
rows of data in a big table. For most users, if you can
start reading the table within 1-2 seconds, that is acceptable for a system's 
performance. But if there are hundreds of rows of
data, you would not need to load _all_ the rows within 1-2 seconds to actually 
meet their performance criteria. You only need to
load enough rows that the table fills the browser - so they can start reading - 
within the 1-2 second period. JMeter cannot really
measure this timing, it can only measure the 'overall response time' (indeed, I 
don't know any testing tool that can do it). So
trying to define a performance benchmark in terms of what 'users' experience is 
really difficult, and nearly useless (to me anyway).

I look at performance testing as a way to cross-check my development team 
against the perpetual tendency to gum-up the code and slow
things down. So in order to make the testing effective for the developers, I 
need to perf test _very_specific_ things. Trying to
performance test the "system" as a whole is nearly an impossible task - not 
only because there are so many variables that influence
the tests, but precisely because "all of those variables" make it impossible to 
debug which one causes the bottleneck when there is
a change in performance from one release to the next. (Have you ever sent your 
programmers off to 'fix' a performance problem that
turned out to be caused by an O/S update on your server? I have...)

Instead, we create performance tests that test specific functional systems. 
That is, the "login" perf test. The "registration" perf
test. The "..." perf test. Each one of these tests is run independently, so 
that when we encounter a slower benchmark - we can tell
the developers immediately where to concentrate their efforts in fixing the 
problem. (We also monitor all parts of the system (CPU,
IO, Database Transactions (reads, writes, full table scans, etc.) from all 
servers involved in the test. The goal is not to simulate
'real user activity', it is to max out the capacity of at least 1 of the 
servers in the test (specifically the one executing the
'application logic'). If we max out that one server, we know that our 
'benchmark' is the most we can expect of a single member of
our cluster of machines. (We also test a cluster of 2 machines - and measure 
the fall-off in capacity between a 1-member cluster and
2-member cluster, this gives us an idea of how much impact our 'clustering' 
system has on performance as well.) I suppose you could
say that I look at it as if, we measure the 'maximum capacity', and so long as 
the number of users doesn't exceed that - we will
perform OK.

We do run some 'all-encompassing' system tests as well, but those are more for 
'stress' testing than for performance benchmarking.
We are specifically looking for things that start to break-down after hours of 
continuous operation at peak capacity. So we monitor
error logs and look to make sure that we aren't throwing errors while under 
stress.

The number one thing to keep in mind about performance testing is that you have 
to use 'real data'. We actually download our
production database every weekend, and strip out any 'personal information' 
(stuff that we protect in our production environment) by
either nulling it out, or replacing it with bogus data. This allows us to run 
our performance tests against a database that has 100s
of millions of rows of data. Nearly all of our performance 'bugs' have been 
caused by poor data handling in the code (SQL requests
that don't use indices (causing a full table scan), badly formed joins, 
fetching a few rows of data and then looping through them in
the code (when the 'few rows of data' from your 'dev' environment become 
100,000 rows with the production data, this tends to bog
the code down a lot), etc.). So if you are testing with 'faked' data, odds are 
good you will miss a lot of performance issues - no
matter what form of performance testing you use.

I will say that we have served over 130M web pages in 1 month, using only 5 
servers (4 tomcats, and 1 DB server)... Those pages
represented about 10X in "GET" requests to our servers... 

--
Robin D. Wilson
Sr. Director of Web Development
KingsIsle Entertainment, Inc.
http://www.kingsisle.com


-----Original Message-----
From: nmq [mailto:nmq0...@gmail.com] 
Sent: Monday, July 01, 2013 2:33 PM
To: JMeter Users List
Subject: Establishing baseline metrics

Hi all

This is not a JMeter specific questions but since this user list comprises of 
experts in performance testing, I figured it would be
a good place to ask this question.

My question is how do you establish baselines for a website's performance if 
you do not have any historic data?  Lets say this is a
new website and its for a limited number of customers.

How do you determine what should be the number of concurrent users you should 
simulate.

Lets say the executives say off at the top of their heads, that the maximum 
number of concurrent users would be 50 at peak times.
Does that mean I should not go beyond 50 or should I still do tests with a 
higher number?

How can I go about establishing baselines for page load times, if I do not have 
any historic data and have no industry benchmarks or
competitor data.

Would it make sense to say let's see how the website is doing throughout the 
development phase and establish our baseline using the
current response times?

I would appreciate any input.


Regards
Sam


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@jmeter.apache.org
For additional commands, e-mail: user-h...@jmeter.apache.org

Reply via email to