Fabien, > Hello Tatsuo, > >>> The lag is reasonnable, althought no too good. One transaction is >>> about 1.2 ms, the lag is much smaller than that, and you are at about >>> 50% of the maximum load. I've got similar figures on my box for such >>> settings. It improves if your reduce the number of clients. >> >> No, 5000 TPS = 1/5000 = 0.2 ms per transaction, no? > > Hmmm... Yes, and no:-) > > Transaction are handled in parallel because there are 10 clients. I > look at actual transaction times (latency) from a client perspective, > not the "apparent" time because of parallelism, and compare it to the > measured lag, which is also measured per client. > > The transaction time I reported is derived from your maximum tps per > client : 10 clients / 8300 tps = 1.2 ms / trans. However, there are 10 > transaction in progress in parallel. > > When you're running at 50% load, the clients basically spend 1.2 ms > doing a transaction (sending queries, getting results), and 1.2 ms > sleeping because of rate limiting. The reported 0.3 ms lag is that > when sleeping 1.2 ms it tends to start a little bit later, after 1.5 > ms, but this latency does not show up on the throuput figures because > the next sleep will just be a smaller to catch-up. > > As you have 10 clients in one pgbench thread, the scheduling say to > start a new transaction for a client at a certain time, but the > pgbench process is late to actually handle this client query because > it is doing other things, like attending one of the other clients, or > being switched off to run a server process. > >> However pgbench says average lag is 0.304 ms. So the lag is longer >> than transaction itself. > > See above. > >>> I would be surprised that this would be the issue is to compute the >>> measure, compared to network connections and the like. With -S the >>> bench is cpu bound. Possibly a better scheduler/thread management on >>> OSX? Or more available cores? >> >> The number of cores is same. I don't understand why number of cores >> is relatedx, though. > > In my mind, because "pgbench -S" is cpu bound, and with "-c 10" you > have to run pgbench and 10 "postgres" backends, that is 11 processes > competing for cpu time. If you have 11 cores that is mostly fine, if > you have less then there will be some delay depending on how the > process scheduler does thing in the OS to allocate cpu time. With a > load of 50%, about 6 cores should be okay to run the load > transparently (client & server). > >>> Well, I do not know! At high load with clients running on the same box >>> as the server, and with more clients & server than available cores, >>> there is a lot of competition between processes, and between clients >>> that share a unique thread, and a log context switching whoch will >>> result in a measured lag. >> >> Hmm... I would like to have cleaner explanation/evidence before >> committing the patch. > > The lag measures you report seems pretty consistent to me given the > load your requiring, for a cpu bound bench, with more processes to run > than available cores. At least, I'm buying my own explanation, and I > hope to be convincing. > > If you want to isolate yourself from such effects, pgbench must run on > a different host than the server, with has many threads as there are > cores available, and not too many clients per thread. This is also > true without throttling, but it shows more under throttling because of > the lag (latency) measures.
I think I'm starting to understand what's going on. Suppose there are n transactions be issued by pgbench and it decides each schedule d(0), d(1)... d(n). Actually the schedule d(i) (which is stored in st->until) is decided by the following code: int64 wait = (int64) throttle_delay * -log(getrand(thread, 1, 1000)/1000.0); thread->throttle_trigger += wait; st->until = thread->throttle_trigger; st->until represents the time for a transaction to be finished by the time. Now the transaction i finishes at t(i). So the lag l(i) = t(i) -d(i) if the transaction is behind. Then next transaction i+1 begins. The lag l(i+1) = t(i+1) - d(i+1) and so on. At the end of pgbench, it shows the average lag as sum(l(0)...l(n))/n. Now suppose we have 3 transactions and each has following values: d(0) = 10 d(1) = 20 d(2) = 30 t(0) = 100 t(1) = 110 t(2) = 120 That says pgbench expects the duration 10 for each transaction. Actually, the first transaction runs slowly for some reason and the lag = 100 - 10 = 90. However, tx(1) and tx(2) are finished on schedule because they spend only 10 (110-10 = 10, 120-110 = 10). So the expected average lag would be 90/3 = 30. However actually pgbench calculates like this: average lag = (t(0)-d(0) + t(1)-d(1) + t(2)-d(2))/3 = (100-10 + 110-20 + 120-30)/3 = (90 + 90 + 90)/3 = 90 Looks like too much lag calculated. The difference between the lag which pgbench calculates and the expected one will be growing if a lag happens eariler. I guess why my Linux box shows bigger lag than Mac OS X is, the first transaction or early transactions run slowly than the ones run later. Of course this conclusion depends on the definition of the "average rate limit lag" of pgbench. So you might have other opinion. However the way how pgbench calculates the average lag is not expected at least for me. -- Tatsuo Ishii SRA OSS, Inc. Japan English: http://www.sraoss.co.jp/index_en.php Japanese: http://www.sraoss.co.jp -- Sent via pgsql-hackers mailing list (firstname.lastname@example.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers