idle is based on a long term average.
There are two schools of thought when ramping up build resources.
You can optimize for maximum resource utilization
You can optimize for shortest waiting time
You cannot do both at the same time.
Since it is not instantaneous to start up a build node you can sometimes get a faster build if you just wait for one of the existing builds to complete... as a result firing up a build node for every job in the queue will end up wasting resources.
Similarly the decommissioning strategy is likely to leave build nodes hanging around for a minute or two it would be good if we have some work they could do rather than just throw them away.
The default strategy in Jenkins is to try to maintain the build queue length at approx the number of build nodes. (Yes this may shock you) In other words Jenkins wants there always to be a job ready for each node when it is finished its current work.
That strategy will give the maximum utilization of resources with a secondary minimum waiting time.
I intend in the near future (once I complete getting the scalability framework open sourced) to make the strategy plugable, thus allowing people to, e.g.
Provision nodes while there is a demand for them - which will minimize waiting time at the expense of wasting resources
At present the trick is to play with MARGIN and MARGIN0 and the decay rate so that you get nodes provisioned faster in response to the exponentially weighted average number of idle nodes changing... but be warned, adjusting these values will cause idle nodes to get provisioned depending on the build load.