WARMUP=120
TEST=60
SCALE=10000
RUNS=5

for sb in 128MB 16384MB 256MB 14336MB 512MB 12288MB 1024MB 10240MB 1536MB 8192MB 2048MB 7168MB 2560MB 6144MB 3072MB 5120MB 3584MB 4096MB; do

	psql test -c "ALTER SYSTEM SET shared_buffers = '$sb'" >> run.log 2>&1

	pg_ctl -D /mnt/data/data -l pg-$sb.log restart >> run.log 2>&1

	# custom generator
	for p in 1 2 4 8 16 32; do

		echo "\SET id int((100000 * :scale) * power(random(1, 100000 * :scale) / (100000.0 * :scale), $p))
BEGIN;
SELECT * FROM pgbench_accounts WHERE aid = :id;
END;" > script.sql

		# warmup
		pgbench test -n -c 16 -j 16 -s $SCALE -f script.sql -T $WARMUP > /dev/null 2>&1

		for c in 1 8 16; do

			for r in `seq 1 $RUNS`; do

				blks_hit_start=`psql -t -A test -c "SELECT blks_hit FROM pg_stat_database WHERE datname = 'test'"`
				blks_read_start=`psql -t -A test -c "SELECT blks_read FROM pg_stat_database WHERE datname = 'test'"`

				# benchmark
				pgbench test -n -c $c -j $c -s $SCALE -f script.sql -T $TEST > bench.log 2>&1

				blks_hit=`psql -t -A test -c "SELECT blks_hit - $blks_hit_start FROM pg_stat_database WHERE datname = 'test'"`
				blks_read=`psql -t -A test -c "SELECT blks_read - $blks_read_start FROM pg_stat_database WHERE datname = 'test'"`

				tps=`cat bench.log | grep excluding | awk '{print $3}'`

				usage_stats=`psql -t -A test -c "select sum(case when usagecount is null then 1 else 0 end) unused, sum(case when usagecount = 0 then 1 else 0 end) AS usage_0, sum(case when usagecount = 1 then 1 else 0 end) AS usage_1, sum(case when usagecount = 2 then 1 else 0 end) AS usage_2, sum(case when usagecount = 3 then 1 else 0 end) AS usage_3, sum(case when usagecount = 4 then 1 else 0 end) AS usage_4, sum(case when usagecount = 5 then 1 else 0 end) AS usage_5 from pg_buffercache"`

				usage_stats=`echo $usage_stats | sed 's/|/ /g'`

				echo $sb custom $c $r $p $tps $blks_read $blks_hit $usage_stats

			done

		done

	done

	# exponential generator
        for p in 1 2 3 4 6 8 10 15 20 25 30 40 50; do

                echo "\SET id random_exponential(1, 100000 * :scale, $p)
BEGIN;
SELECT * FROM pgbench_accounts WHERE aid = :id;
END;" > script.sql

                # warmup
                pgbench test -n -c 16 -c 16 -s $SCALE -f script.sql -T $WARMUP > /dev/null 2>&1

		for c in 1 8 16; do

	                for r in `seq 1 $RUNS`; do

        	                blks_hit_start=`psql -t -A test -c "SELECT blks_hit FROM pg_stat_database WHERE datname = 'test'"`
                	        blks_read_start=`psql -t -A test -c "SELECT blks_read FROM pg_stat_database WHERE datname = 'test'"`

	                        # benchmark
        	                pgbench test -n -c $c -j $c -s $SCALE -f script.sql -T $TEST > bench.log 2>&1

	                        blks_hit=`psql -t -A test -c "SELECT blks_hit - $blks_hit_start FROM pg_stat_database WHERE datname = 'test'"`
        	                blks_read=`psql -t -A test -c "SELECT blks_read - $blks_read_start FROM pg_stat_database WHERE datname = 'test'"`

                	        tps=`cat bench.log | grep excluding | awk '{print $3}'`

				usage_stats=`psql -t -A test -c "select sum(case when usagecount is null then 1 else 0 end) unused, sum(case when usagecount = 0 then 1 else 0 end) AS usage_0, sum(case when usagecount = 1 then 1 else 0 end) AS usage_1, sum(case when usagecount = 2 then 1 else 0 end) AS usage_2, sum(case when usagecount = 3 then 1 else 0 end) AS usage_3, sum(case when usagecount = 4 then 1 else 0 end) AS usage_4, sum(case when usagecount = 5 then 1 else 0 end) AS usage_5 from pg_buffercache"`

				usage_stats=`echo $usage_stats | sed 's/|/ /g'`

                	        echo $sb exponential $c $r $p $tps $blks_read $blks_hit $usage_stats

			done

                done

        done

        # uniform

        # warmup
        pgbench test -n -c 16 -j 16 -s $SCALE -N -S -T $WARMUP > /dev/null 2>&1

	for c in 1 8 16; do

	        for r in `seq 1 $RUNS`; do

        	        blks_hit_start=`psql -t -A test -c "SELECT blks_hit FROM pg_stat_database WHERE datname = 'test'"`
                	blks_read_start=`psql -t -A test -c "SELECT blks_read FROM pg_stat_database WHERE datname = 'test'"`

	                # benchmark
        	        pgbench test -n -c $c -j $c -s $SCALE -N -S -T $TEST > bench.log 2>&1

	                blks_hit=`psql -t -A test -c "SELECT blks_hit - $blks_hit_start FROM pg_stat_database WHERE datname = 'test'"`
        	        blks_read=`psql -t -A test -c "SELECT blks_read - $blks_read_start FROM pg_stat_database WHERE datname = 'test'"`

	                tps=`cat bench.log | grep excluding | awk '{print $3}'`

        	        usage_stats=`psql -t -A test -c "select sum(case when usagecount is null then 1 else 0 end) unused, sum(case when usagecount = 0 then 1 else 0 end) AS usage_0, sum(case when usagecount = 1 then 1 else 0 end) AS usage_1, sum(case when usagecount = 2 then 1 else 0 end) AS usage_2, sum(case when usagecount = 3 then 1 else 0 end) AS usage_3, sum(case when usagecount = 4 then 1 else 0 end) AS usage_4, sum(case when usagecount = 5 then 1 else 0 end) AS usage_5 from pg_buffercache"`

			usage_stats=`echo $usage_stats | sed 's/|/ /g'`

	                echo $sb uniform $c $r $p $tps $blks_read $blks_hit $usage_stats

		done

        done

done
