This repository was archived by the owner on Jun 18, 2024. It is now read-only.
This repository was archived by the owner on Jun 18, 2024. It is now read-only.
concurrently update will generate huge buffer_content locks #15
Open
Description
HI,
there is some testing for zedstore, when i use concurrent insert into on conflict test, here is some buffer_content locks
and qps=0;
postgres=# do language plpgsql $$
declare
sql text;
begin
sql := 'create table t_heap (id int8,';
for i in 1..10 loop
sql := sql||'int'||i||' int,';
end loop;
for i in 1..10 loop
sql := sql||'text'||i||' text,';
end loop;
sql := sql||'crt_time timestamp) using heap';
execute sql;
end;
$$;
postgres=# do language plpgsql $$
declare
sql text;
begin
sql := 'create table t_zedstore (id int8,';
for i in 1..10 loop
sql := sql||'int'||i||' int,';
end loop;
for i in 1..10 loop
sql := sql||'text'||i||' text,';
end loop;
sql := sql||'crt_time timestamp) using zedstore';
execute sql;
end;
$$;
postgres=# \d+ t_heap
Table "public.t_heap"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
----------+-----------------------------+-----------+----------+---------+----------+--------------+-------------
id | bigint | | | | plain | |
int1 | integer | | | | plain | |
int2 | integer | | | | plain | |
int3 | integer | | | | plain | |
int4 | integer | | | | plain | |
int5 | integer | | | | plain | |
int6 | integer | | | | plain | |
int7 | integer | | | | plain | |
int8 | integer | | | | plain | |
int9 | integer | | | | plain | |
int10 | integer | | | | plain | |
text1 | text | | | | extended | |
text2 | text | | | | extended | |
text3 | text | | | | extended | |
text4 | text | | | | extended | |
text5 | text | | | | extended | |
text6 | text | | | | extended | |
text7 | text | | | | extended | |
text8 | text | | | | extended | |
text9 | text | | | | extended | |
text10 | text | | | | extended | |
crt_time | timestamp without time zone | | | | plain | |
Access method: heap
postgres=# \d+ t_zedstore
Table "public.t_zedstore"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
----------+-----------------------------+-----------+----------+---------+----------+--------------+-------------
id | bigint | | | | plain | |
int1 | integer | | | | plain | |
int2 | integer | | | | plain | |
int3 | integer | | | | plain | |
int4 | integer | | | | plain | |
int5 | integer | | | | plain | |
int6 | integer | | | | plain | |
int7 | integer | | | | plain | |
int8 | integer | | | | plain | |
int9 | integer | | | | plain | |
int10 | integer | | | | plain | |
text1 | text | | | | extended | |
text2 | text | | | | extended | |
text3 | text | | | | extended | |
text4 | text | | | | extended | |
text5 | text | | | | extended | |
text6 | text | | | | extended | |
text7 | text | | | | extended | |
text8 | text | | | | extended | |
text9 | text | | | | extended | |
text10 | text | | | | extended | |
crt_time | timestamp without time zone | | | | plain | |
Access method: zedstore
\timing
insert into t_heap
select
id,
random()*10,
random()*100,
random()*1000,
random()*10000,
random()*100000,
random()*10,
random()*100,
random()*1000,
random()*10000,
random()*100000,
md5((random()*10)::int::text),
md5((random()*100)::int::text),
md5((random()*1000)::int::text),
md5((random()*10000)::int::text),
md5((random()*10)::int::text),
md5((random()*100)::int::text),
md5((random()*1000)::int::text),
md5((random()*10000)::int::text),
md5((random()*100)::int::text),
md5((random()*100)::int::text),
clock_timestamp()
from
generate_series(1,10000000) t(id);
INSERT 0 10000000
Time: 55137.382 ms (00:55.137)
checkpoint;
insert into t_zedstore
select
id,
random()*10,
random()*100,
random()*1000,
random()*10000,
random()*100000,
random()*10,
random()*100,
random()*1000,
random()*10000,
random()*100000,
md5((random()*10)::int::text),
md5((random()*100)::int::text),
md5((random()*1000)::int::text),
md5((random()*10000)::int::text),
md5((random()*10)::int::text),
md5((random()*100)::int::text),
md5((random()*1000)::int::text),
md5((random()*10000)::int::text),
md5((random()*100)::int::text),
md5((random()*100)::int::text),
clock_timestamp()
from
generate_series(1,10000000) t(id);
INSERT 0 10000000
Time: 156857.767 ms (02:36.858)
postgres=# \dt+
List of relations
Schema | Name | Type | Owner | Persistence | Size | Description
--------+------------+-------+----------+-------------+---------+-------------
public | t_heap | table | postgres | permanent | 4113 MB |
public | t_zedstore | table | postgres | permanent | 1941 MB |
(2 rows)
统计分析测试:
postgres=# explain select int1,count(*) from t_heap group by 1;
QUERY PLAN
-----------------------------------------------------------------------
HashAggregate (cost=676315.01..676315.12 rows=11 width=12)
Group Key: int1
-> Seq Scan on t_heap (cost=0.00..626315.34 rows=9999934 width=4)
(3 rows)
Time: 0.405 ms
postgres=# explain select int1,count(*) from t_zedstore group by 1;
QUERY PLAN
---------------------------------------------------------------------------
HashAggregate (cost=151860.92..151861.03 rows=11 width=12)
Group Key: int1
-> Seq Scan on t_zedstore (cost=0.00..101861.95 rows=9999795 width=4)
(3 rows)
Time: 0.155 ms
postgres=# select int1,count(*) from t_zedstore group by 1;
int1 | count
------+---------
5 | 999956
4 | 1000395
10 | 501530
6 | 998901
2 | 999192
7 | 1000936
1 | 999489
8 | 998940
9 | 1000325
3 | 1000801
0 | 499535
(11 rows)
Time: 1343.633 ms (00:01.344)
postgres=# select text1,count(*) from t_zedstore group by 1;
text1 | count
----------------------------------+---------
c4ca4238a0b923820dcc509a6f75849b | 1001059
8f14e45fceea167a5a36dedd4bea2543 | 999705
d3d9446802a44259755d38e6d163e820 | 499813
1679091c5a880faf6fb5e6087eb1b2dc | 1001648
e4da3b7fbbce2345d7772b0674a318d5 | 999392
eccbc87e4b5ce2fe28308fd9f2a7baf3 | 999374
cfcd208495d565ef66e7dff9f98764da | 501183
c9f0f895fb98ab9159f51fd0297e236d | 1001479
45c48cce2e2d7fbdea1afc51c7c6ad26 | 998835
a87ff679a2f3e71d9181a67b7542122c | 999037
c81e728d9d4c2f636f067f89cc14862c | 998475
(11 rows)
Time: 1863.111 ms (00:01.863)
postgres=# select int1,count(*) from t_heap group by 1;
int1 | count
------+---------
5 | 1000662
4 | 999872
10 | 499901
6 | 1000942
2 | 1000378
7 | 999201
1 | 1001494
8 | 998922
9 | 998764
3 | 999863
0 | 500001
(11 rows)
Time: 2655.144 ms (00:02.655)
postgres=# select text1,count(*) from t_heap group by 1;
text1 | count
----------------------------------+---------
c4ca4238a0b923820dcc509a6f75849b | 999925
8f14e45fceea167a5a36dedd4bea2543 | 1000277
d3d9446802a44259755d38e6d163e820 | 497869
1679091c5a880faf6fb5e6087eb1b2dc | 1000732
e4da3b7fbbce2345d7772b0674a318d5 | 999516
eccbc87e4b5ce2fe28308fd9f2a7baf3 | 1002371
cfcd208495d565ef66e7dff9f98764da | 500511
c9f0f895fb98ab9159f51fd0297e236d | 996678
45c48cce2e2d7fbdea1afc51c7c6ad26 | 1000367
a87ff679a2f3e71d9181a67b7542122c | 1001158
c81e728d9d4c2f636f067f89cc14862c | 1000596
(11 rows)
Time: 3062.112 ms (00:03.062)
alter table t_heap add constraint pk primary key(id);
alter table t_zedstore add constraint pk1 primary key(id);
postgres=# \di+
List of relations
Schema | Name | Type | Owner | Table | Persistence | Size | Description
--------+------+-------+----------+------------+-------------+--------+-------------
public | pk | index | postgres | t_heap | permanent | 214 MB |
public | pk1 | index | postgres | t_zedstore | permanent | 214 MB |
(2 rows)
大宽表明细KV查询测试:
vi test1.sql
\set id random(1,10000000)
select * from t_heap where id=:id;
select * from t_zedstore where id=:id;
pgbench -M prepared -n -r -P 1 -f ./test1.sql -c 52 -j 52 -T 120
transaction type: ./test1.sql
scaling factor: 1
query mode: prepared
number of clients: 52
number of threads: 52
duration: 120 s
number of transactions actually processed: 6932745
latency average = 0.900 ms
latency stddev = 0.176 ms
tps = 57772.190636 (including connections establishing)
tps = 57774.347762 (excluding connections establishing)
statement latencies in milliseconds:
0.001 \set id random(1,10000000)
0.061 select * from t_heap where id=:id;
0.838 select * from t_zedstore where id=:id;
高并发更新测试:
vi test2.sql
\set id random(1,100000000)
insert into t_heap values (:id,
random()*10,
random()*100,
random()*1000,
random()*10000,
random()*100000,
random()*10,
random()*100,
random()*1000,
random()*10000,
random()*100000,
md5((random()*10)::int::text),
md5((random()*100)::int::text),
md5((random()*1000)::int::text),
md5((random()*10000)::int::text),
md5((random()*10)::int::text),
md5((random()*100)::int::text),
md5((random()*1000)::int::text),
md5((random()*10000)::int::text),
md5((random()*100)::int::text),
md5((random()*100)::int::text),
clock_timestamp()
) on conflict (id)
do update set
int1=excluded.int1,
int2=excluded.int2,
int3=excluded.int3,
int4=excluded.int4,
int5=excluded.int5,
int6=excluded.int6,
int7=excluded.int7,
int8=excluded.int8,
int9=excluded.int9,
int10=excluded.int10,
text1=excluded.text1,
text2=excluded.text2,
text3=excluded.text3,
text4=excluded.text4,
text5=excluded.text5,
text6=excluded.text6,
text7=excluded.text7,
text8=excluded.text8,
text9=excluded.text9,
text10=excluded.text10,
crt_time=excluded.crt_time;
insert into t_zedstore values (:id,
random()*10,
random()*100,
random()*1000,
random()*10000,
random()*100000,
random()*10,
random()*100,
random()*1000,
random()*10000,
random()*100000,
md5((random()*10)::int::text),
md5((random()*100)::int::text),
md5((random()*1000)::int::text),
md5((random()*10000)::int::text),
md5((random()*10)::int::text),
md5((random()*100)::int::text),
md5((random()*1000)::int::text),
md5((random()*10000)::int::text),
md5((random()*100)::int::text),
md5((random()*100)::int::text),
clock_timestamp()
) on conflict (id)
do update set
int1=excluded.int1,
int2=excluded.int2,
int3=excluded.int3,
int4=excluded.int4,
int5=excluded.int5,
int6=excluded.int6,
int7=excluded.int7,
int8=excluded.int8,
int9=excluded.int9,
int10=excluded.int10,
text1=excluded.text1,
text2=excluded.text2,
text3=excluded.text3,
text4=excluded.text4,
text5=excluded.text5,
text6=excluded.text6,
text7=excluded.text7,
text8=excluded.text8,
text9=excluded.text9,
text10=excluded.text10,
crt_time=excluded.crt_time;
pgbench -M prepared -n -r -P 1 -f ./test2.sql -c 52 -j 52 -T 120
postgres=# select wait_event from pg_stat_activity ;
wait_event
---------------------
AutoVacuumMain
LogicalLauncherMain
buffer_content
buffer_content
buffer_content
buffer_content
buffer_content
buffer_content
buffer_content
buffer_content
page
buffer_content
buffer_content
page
page
buffer_content
buffer_content
page
buffer_content
buffer_content
page
buffer_content
buffer_content
buffer_content
buffer_content
buffer_content
buffer_content
buffer_content
buffer_content
buffer_content
buffer_content
buffer_content
buffer_content
buffer_content
page
buffer_content
page
buffer_content
buffer_content
buffer_content
buffer_content
buffer_content
buffer_content
buffer_content
page
buffer_content
buffer_content
buffer_content
buffer_content
buffer_content
buffer_content
buffer_content
buffer_content
buffer_content
BgWriterHibernate
CheckpointerMain
WalWriterMain
br, digoal
Metadata
Metadata
Assignees
Labels
No labels