DeathAndTaxes, thank you, that was the key to my puzzle. I assumed that raising the difficulty of a share would lead to spending more time hashing for each getwork, causing fewer requests, whereas you say that the time spent is not related to difficulty? Correct me If I am wrong please...
Correct.
How it works is miner gets a block header (minus nonce)
miner adds nonce of 0, hashes it and checks if it is higher than pool's difficulty (not block difficulty).
If it is the miner submits it. If it isn't the miner discards it.
THEN regardless the miner increments the nonce to 1 and does the same thing
...
increment, hash, check (and possibly submit)
increment, hash, check (and possibly submit)
increment, hash, check (and possibly submit)
increment, hash, check (and possibly submit)
increment, hash, check (and possibly submit)
....
4 billion iterations
nonce range is exhausted. Miner requests new work via getwork. At that point miner starts all over w/ nonce of 0.
With difficulty of 1 the miner submits 1 share per getwork (on average) w/ perfect efficiency.
With a difficulty of 200 (current p2pool difficulty) the miner finds and submits 1 share per 200 getwork requests.
Still the rate of getwork requests remains the same. If miner is perfectly efficiency it is roughly one every (2^32)/(speed of GPU in hashes) seconds.
It is actually slow miners which are hard on server. 100 GH made up of 100 1GH GPU is pretty easy load but 100 GH made up of 5000 CPU is pretty rough. The reason why is slow miners are inefficient due to the low likelihood of them finding a share before it is stale. This means they make lots of getwork requests for each share submitted.
NNtimeRolling can be used to reduce the number of getworks by allowing the miner to increment timestamp locally.
A hybrid (aka split) pool can reduce the getwork load on server to zero by having miners generate blockheaders locally. While p2pool does this it could also be used by a "traditional pool".
In addition, each LP results in a storm of getworks from miners that are discarding the current work and starting fresh, is this correct? Or have I misunderstood yet another important thing on how this works?
Correct. All work issued to miners is now worthless so pool server will issue an LP w/ new work. The miner locally discards any queued up work and begins to process the new work. Obviously the pool will need to recalculate blockheaders for every miner in the pool. This can be computationally intensive. Some pools optimize pool efficiency by issuing LP to fastest miner's first.