Re: Parallel Seq Scan
От | Robert Haas |
---|---|
Тема | Re: Parallel Seq Scan |
Дата | |
Msg-id | CA+Tgmoa7O3szt6UY97z4BWOSGcFeVkErWRPYYu-vYo0h0TpafA@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: Parallel Seq Scan (Amit Kapila <amit.kapila16@gmail.com>) |
Ответы |
Re: Parallel Seq Scan
(Stephen Frost <sfrost@snowman.net>)
|
Список | pgsql-hackers |
On Thu, Jan 22, 2015 at 5:57 AM, Amit Kapila <amit.kapila16@gmail.com> wrote: > Script used to test is attached (parallel_count.sh) Why does this use EXPLAIN ANALYZE instead of \timing ? > IBM POWER-7 16 cores, 64 hardware threads > RAM = 64GB > > Table Size - 120GB > > Used below statements to create table - > create table tbl_perf(c1 int, c2 char(1000)); > insert into tbl_perf values(generate_series(1,10000000),'aaaaa'); > insert into tbl_perf values(generate_series(10000001,30000000),'aaaaa'); > insert into tbl_perf values(generate_series(30000001,110000000),'aaaaa'); I generated this table using this same method and experimented with copying the whole file to the bit bucket using dd. I did this on hydra, which I think is the same machine you used. time for i in `seq 0 119`; do if [ $i -eq 0 ]; then f=16388; else f=16388.$i; fi; dd if=$f of=/dev/null bs=8k; done There is a considerable amount of variation in the amount of time this takes to run based on how much of the relation is cached. Clearly, there's no way for the system to cache it all, but it can cache a significant portion, and that affects the results to no small degree. dd on hydra prints information on the data transfer rate; on uncached 1GB segments, it runs at right around 400 MB/s, but that can soar to upwards of 3GB/s when the relation is fully cached. I tried flushing the OS cache via echo 1 > /proc/sys/vm/drop_caches, and found that immediately after doing that, the above command took 5m21s to run - i.e. ~321000 ms. Most of your test times are faster than that, which means they reflect some degree of caching. When I immediately reran the command a second time, it finished in 4m18s the second time, or ~258000 ms. The rate was the same as the first test - about 400 MB/s - for most of the files, but 27 of the last 28 files went much faster, between 1.3 GB/s and 3.7 GB/s. This tells us that the OS cache on this machine has anti-spoliation logic in it, probably not dissimilar to what we have in PG. If the data were cycled through the system cache in strict LRU fashion, any data that was leftover from the first run would have been flushed out by the early part of the second run, so that all the results from the second set of runs would have hit the disk. But in fact, that's not what happened: the last pages from the first run remained cached even after reading an amount of new data that exceeds the size of RAM on that machine. What I think this demonstrates is that we're going to have to be very careful to control for caching effects, or we may find that we get misleading results. To make this simpler, I've installed a setuid binary /usr/bin/drop_caches that you (or anyone who has an account on that machine) can use you drop the caches; run 'drop_caches 1'. > Block-By-Block > > No. of workers/Time (ms) 0 2 > Run-1 267798 295051 > Run-2 276646 296665 > Run-3 281364 314952 > Run-4 290231 326243 > Run-5 288890 295684 The next thing I did was run test with the block-by-block method after having dropped the caches. I did this with 0 workers and with 8 workers. I dropped the caches and restarted postgres before each test, but then ran each test a second time to see the effect of caching by both the OS and by PostgreSQL. I got these results: With 0 workers, first run took 883465.352 ms, and second run took 295050.106 ms. With 8 workers, first run took 340302.250 ms, and second run took 307767.758 ms. This is a confusing result, because you expect parallelism to help more when the relation is partly cached, and make little or no difference when it isn't cached. But that's not what happened. I've also got a draft of a prefetching implementation here that I'd like to test out, but I've just discovered that it's buggy, so I'm going to send these results for now and work on fixing that. -- Robert Haas EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company
В списке pgsql-hackers по дате отправления: