On Tue, 10 Nov 2020 at 12:55, David Rowley <dgrowle...@gmail.com> wrote: > > On Tue, 10 Nov 2020 at 12:49, Tom Lane <t...@sss.pgh.pa.us> wrote: > > > > Alvaro Herrera <alvhe...@alvh.no-ip.org> writes: > > > Are you taking into account the possibility that generated machine code > > > is a small percent slower out of mere bad luck? I remember someone > > > suggesting that they can make code 2% faster or so by inserting random > > > no-op instructions in the binary, or something like that. So if the > > > difference between v8 and v9 is that small, then it might be due to this > > > kind of effect. > > > > Yeah. I believe what this arises from is good or bad luck about relevant > > tight loops falling within or across cache lines, and that sort of thing. > > We've definitely seen performance changes up to a couple percent with > > no apparent change to the relevant code. > > It possibly is this issue. > > Normally how I build up my confidence in which is faster is why just > rebasing on master as it advances and see if the winner ever changes. > The theory here is if one patch is consistently the fastest, then > there's more chance if there being a genuine reason for it.
I kicked off a script last night that ran benchmarks on master, v8 and v9 of the patch on 1 commit per day for the past 30 days since yesterday. The idea here is that as the code changes that if the performance differences are due to code alignment then there should be enough churn in 30 days to show if this is the case. The quickly put together script is attached. It would need quite a bit of modification to run on someone else's machine. This took about 20 hours to run. I found that v8 is faster on 28 out of 30 commits. In the two cases where v9 was faster, v9 took 99.8% and 98.5% of the time of v8. In the 28 cases where v8 was faster it was generally about 2-4% faster, but a couple of times 8-10% faster. Full results attached in .csv file. Also the query I ran to compare the results once loaded into Postgres. David
#!/bin/bash seconds=30 scale=100000 pg_ctl stop -D pgdata -w for sha in e578c17d8 ae0f7b11f b94109ce3 7f4708818 bc49f8780 540849814 929c69aa1 f49b85d78 bbb927b4d 555eb1a4f f8721bd75 83d727e5b 21d36747d ba9f18abd 20d3fe900 f893e68d7 ad1c36b07 f90149e62 b401fa206 f90e80b91 b17ff07aa 5b3dca096 bf797a8d9 113d3591b 5b7bfc397 5ee180a39 b4c9695e7 8b39345a9 8f113698b d2e4bf688 do cd ~/pg_src git reset --hard git clean -f git checkout $sha ./configure --prefix=/home/drowley/pg > /dev/null for branch in master resultcache_v8 resultcache_v9 do cd ~/pg_src git reset --hard git clean -f for file in /home/drowley/$branch/* do patch -p1 < $file done make clean -s make -j -s make install -s cd contrib/pg_prewarm make -j -s make install -s cd sleep 1 # create database and load data when doing the first branch if [ $branch = master ] then rm -rf pgdata initdb -D pgdata > /dev/null cp postgresql.conf pgdata pg_ctl start -D pgdata -l pg.log psql -c "drop table if exists hundredk, lookup1, lookup100;" postgres psql -c "create table hundredk (hundredk int, tenk int, thousand int, hundred int, ten int, one int);" postgres psql -c "insert into hundredk select x%100000,x%10000,x%1000,x%100,x%10,1 from generate_Series(1,$scale) x;" postgres psql -c "create table lookup100 (a int);" postgres psql -c "insert into lookup100 select x from generate_Series(1,$scale)x,generate_Series(1,100);" postgres psql -c "create index on lookup100 (a);" postgres psql -c "create table lookup1 (a int);" postgres psql -c "insert into lookup1 select x from generate_Series(1,$scale)x;" postgres psql -c "create index on lookup1 (a);" postgres psql -c "vacuum analyze lookup1, lookup100, hundredk;" postgres psql -c "create extension pg_prewarm;" postgres pg_ctl stop -D pgdata -w fi pg_ctl start -D pgdata -l pg.log -w psql -c "select pg_prewarm('lookup1'), pg_prewarm('lookup100'), pg_prewarm('hundredk');" postgres for tbl in lookup1 lookup100 do for target in "count(*)" "count(l.a)" "'*'" do for col in thousand hundred ten one do echo "select $target from hundredk hk inner join $tbl l on hk.$col = l.a" > bench.sql echo Testing $sha $branch $tbl $target $col >> bench.log pgbench -n -T $seconds -f bench.sql postgres | grep latency >> bench.log done done done pg_ctl stop -D pgdata -w done done
resultcache_small_multiple_version.csv
Description: MS-Excel spreadsheet
git log --format="%H,%ai" --date=local > /home/drowley/commit.txt psql postgres # create table commits (sha text, author_time timestamptz); # copy commits from '/home/drowley/pg_src/commit.txt' with(format csv); # select string_agg(left(sha,9),' ' order by author_time) from (select * from (select sha,author_time at time zone 'Pacific/Auckland' author_time,row_number() over(partition by date(author_time at time zone 'Pacific/Auckland') order by author_time) rn from commits)a where rn = 1 order by author_time desc limit 30) a; Use these in script: e578c17d8 ae0f7b11f b94109ce3 7f4708818 bc49f8780 540849814 929c69aa1 f49b85d78 bbb927b4d 555eb1a4f f8721bd75 83d727e5b 21d36747d ba9f18abd 20d3fe900 f893e68d7 ad1c36b07 f90149e62 b401fa206 f90e80b91 b17ff07aa 5b3dca096 bf797a8d9 113d3591b 5b7bfc397 5ee180a39 b4c9695e7 8b39345a9 8f113698b d2e4bf688 CREATE TABLE resultcache_bench_small ( commit text, tbl text, target text, col text, latency_master numeric(10,3), latency_v8 numeric(10,3), latency_v9 numeric(10,3) ); postgres=# select commit, sum(latency_master) as master, sum(latency_v8) v8, sum(latency_v9) v9, round(avg(latency_v8/latency_master)*100,1) as v8_vs_master, round(avg(latency_v9/latency_master)*100,1) as v9_vs_master, round(avg(latency_v8/latency_v9)*100,1) as v8_vs_v9, round(avg(latency_v9/latency_v8)*100,1) as v9_vs_v8 from resultcache_bench_small group by 1; commit | master | v8 | v9 | v8_vs_master | v9_vs_master | v8_vs_v9 | v9_vs_v8 -----------+-----------+-----------+-----------+--------------+--------------+----------+---------- 5b3dca096 | 16820.478 | 11507.545 | 11578.571 | 73.9 | 79.2 | 94.3 | 106.4 f893e68d7 | 16595.615 | 11252.886 | 12065.309 | 73.8 | 82.1 | 90.7 | 110.7 b94109ce3 | 16795.774 | 11330.868 | 11446.921 | 74.0 | 79.2 | 94.6 | 106.1 f90e80b91 | 17004.737 | 11551.900 | 11316.972 | 77.2 | 77.3 | 100.3 | 99.8 7f4708818 | 16779.402 | 11235.536 | 11117.761 | 76.5 | 79.3 | 97.3 | 103.0 ba9f18abd | 17389.321 | 11623.239 | 11457.698 | 74.3 | 77.9 | 96.6 | 104.0 f8721bd75 | 16818.878 | 11460.189 | 11368.843 | 74.5 | 78.2 | 96.1 | 104.3 8b39345a9 | 16419.371 | 11467.491 | 11092.032 | 75.5 | 76.9 | 99.3 | 101.1 5b7bfc397 | 16226.153 | 11273.428 | 11369.520 | 75.5 | 79.2 | 96.5 | 104.1 e578c17d8 | 17463.136 | 11295.097 | 11225.809 | 73.5 | 75.6 | 98.1 | 102.1 f49b85d78 | 16773.226 | 11473.760 | 11044.829 | 76.3 | 79.8 | 96.9 | 103.7 d2e4bf688 | 16502.918 | 11243.120 | 11070.934 | 74.7 | 77.8 | 97.1 | 103.4 ad1c36b07 | 16902.996 | 11500.667 | 11092.086 | 74.0 | 75.8 | 98.4 | 101.9 83d727e5b | 16717.950 | 11725.605 | 11658.286 | 76.4 | 77.8 | 98.4 | 101.7 b4c9695e7 | 16523.515 | 11233.828 | 11176.714 | 74.2 | 78.2 | 95.9 | 104.7 113d3591b | 16792.197 | 11381.005 | 11301.595 | 76.0 | 78.8 | 97.5 | 102.9 bc49f8780 | 16782.435 | 11405.384 | 11093.354 | 76.2 | 77.8 | 98.7 | 101.5 20d3fe900 | 16592.252 | 11703.298 | 11215.672 | 76.5 | 78.3 | 98.9 | 101.9 b17ff07aa | 17246.041 | 11726.405 | 11376.747 | 72.1 | 74.0 | 98.0 | 102.2 f90149e62 | 17118.627 | 11244.809 | 11173.333 | 73.6 | 75.3 | 98.4 | 101.8 5ee180a39 | 16397.251 | 11523.314 | 11049.711 | 76.3 | 78.9 | 98.0 | 102.6 bf797a8d9 | 16793.719 | 11505.530 | 11371.520 | 75.2 | 77.4 | 98.0 | 102.3 b401fa206 | 17226.204 | 11306.590 | 11350.644 | 73.5 | 75.5 | 97.9 | 102.3 21d36747d | 16669.999 | 11713.185 | 11260.066 | 77.4 | 76.5 | 101.6 | 98.5 bbb927b4d | 17096.479 | 11711.497 | 11415.711 | 72.9 | 75.7 | 97.2 | 103.3 929c69aa1 | 16613.614 | 11372.493 | 11033.726 | 76.4 | 80.3 | 96.6 | 104.1 555eb1a4f | 17091.994 | 11694.371 | 11403.378 | 72.5 | 75.5 | 97.0 | 103.5 ae0f7b11f | 17052.744 | 11277.772 | 11755.258 | 74.9 | 81.6 | 92.8 | 108.1 8f113698b | 16129.810 | 11321.365 | 11138.674 | 76.5 | 78.7 | 98.0 | 102.3 540849814 | 17129.610 | 11392.372 | 11024.894 | 75.2 | 79.1 | 96.6 | 104.1 (30 rows)