PostgreSQL App Massive FEED LOG Real-time Quality Statistics

Background

Service quality control is an important part of refined quality management. For example, we could count the water level value, such as avg, sum, and count, in certain groups and at certain fixed intervals (1 minute, 5 minutes, 10 minutes) in real time.

This article introduces a case of real-time quality monitoring of a service.

Multiple point values are written in batches as arrays. For example, we write 2,500 points in a batch.

For efficient statistics and efficient cleaning of FEED LOG details, we can use the “list” partitioned table.

At the same time, the intarray plug-in is also needed to sort the values of the array, and the aggs_for_arrays plug-in is used to calculate the water level values of the ordered array.

Even if we do not use these two plug-ins, we can also use the PG quantile aggregate function to achieve the same effect.

Hardware Environment:

ECS:
56Core
224G memory
2*Local SSD cloud disk

DB:
PostgreSQL

Install the aggs_for_arrays Plug-In

wget http://api.pgxn.org/dist/aggs_for_arrays/1.3.1/aggs_for_arrays-1.3.1.zip  

unzip aggs_for_arrays-1.3.1.zip

cd aggs_for_arrays-1.3.1


export PGHOME=/home/digoal/pg11
export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH
export PATH=$PGHOME/bin:$PATH:.

USE_PGXS=1 make clean
USE_PGXS=1 make
USE_PGXS=1 make install

Load the Plug-In

postgres=# create extension intarray ;  
CREATE EXTENSION
postgres=# create extension aggs_for_arrays ;
CREATE EXTENSION

Customize the Array Aggregate Function to Aggregate Multiple Arrays into One-Dimensional Arrays

The built-in array_agg aggregate function of PostgreSQL aggregates multiple arrays into multi-dimensional arrays, but our goal is to aggregate multiple arrays into one-dimensional arrays. Therefore, we need to customize an aggregate function.

create aggregate arragg (anyarray) (sfunc = array_cat, stype=anyarray, PARALLEL=safe);    

postgres=# select arragg(info) from (values(array[1,2,3]),(array[3,4,5])) t(info);
arragg
---------------
{1,2,3,3,4,5}
(1 row)

postgres=# select arragg(info) from (values(array[1,2,3]),(array[2,3,4,5])) t(info);
arragg
-----------------
{1,2,3,2,3,4,5}
(1 row)

The aggregate function uses array_cat, which has a large number of MEMCOPY, so when the amount involved is relatively large, the performance is not very optimistic (much worse than the array_agg). We can customize an arragg with better performance later.

PostgreSQL multiple arrays are aggregated into one-dimensional arrays (array_agg)

Define a function that generates an array of random values

create or replace function gen_randarr(  
int, -- the upper limit of the random value range
int -- generate the number
) returns int[] as
$$

select array(select (random()*$1)::int from generate_series(1,$2));
$$
language sql strict;

-- Return 10 random numbers within the range of 100, like for example:postgres=# select gen_randarr(100,10);
gen_randarr
--------------------------------
{72,6,26,44,47,84,88,72,59,40}
(1 row)

Define a Feed Log Partitioned Detail Table

The streamed data is non-critical and does not need to be persisted, so you can choose the unlogged table, which greatly improves performance.

Example:

CREATE unlogged TABLE mx (      
id serial8 not null,
lt timestamp not null,
gv text,
rc int,
v1 int[],
v2 int[],
v3 int[],
v4 int[],
v5 int[],
v6 int[],
v7 int[],
v8 int[],
v9 int[]
) PARTITION BY LIST ( substring(extract('min' from lt)::text, 1, 1) );
-- CREATE unlogged TABLE mx0 PARTITION OF mx FOR VALUES IN ('0');
-- CREATE unlogged TABLE mx1 PARTITION OF mx FOR VALUES IN ('1');
-- CREATE unlogged TABLE mx2 PARTITION OF mx FOR VALUES IN ('2');
-- CREATE unlogged TABLE mx3 PARTITION OF mx FOR VALUES IN ('3');
-- CREATE unlogged TABLE mx4 PARTITION OF mx FOR VALUES IN ('4');
-- CREATE unlogged TABLE mx5 PARTITION OF mx FOR VALUES IN ('5');
-- create index idx_mx_lt on mx(lt);-- drop table mx;

There are many FEED dimensions, so each FEED dimension defines a partitioned table. We assume there are 1,024 FEED dimensions and use the following method to quickly define the 1,024 partitioned tables.

Create 1,024 partitioned tables at a time, with six partitions per partitioned table.

do language plpgsql 
$$

declare
begin
for i in 1..1024 loop
-- Create a primary table
execute format(
'
CREATE unlogged TABLE mx%s (
id serial8 not null,
lt timestamp not null,
gv text,
rc int,
v1 int[],
v2 int[],
v3 int[],
v4 int[],
v5 int[],
v6 int[],
v7 int[],
v8 int[],
v9 int[]
) PARTITION BY LIST ( substring(extract(''min'' from lt)::text, 1, 1) )
', i);
for x in 0..5 loop
-- Create partition
execute format('CREATE unlogged TABLE mx%s_%s PARTITION OF mx%s FOR VALUES IN (%L)', i, x, i, x);

-- PG 10 users should build an index as follows
execute format('create index idx_mx%s_%s_lt on mx%s_%s(lt)', i, x, i, x);
end loop;

-- PG11 users should do this instead
-- execute format('create index idx_mx%s_lt on mx%s(lt)', i, i);
end loop;
end;
$$
;

Define the Statistical Partitioned Table Corresponding to the Feed Detail Table

Example:

CREATE unlogged TABLE agg (      
id serial8 not null,
lt timestamp not null,
tu int2,
gv text,
mid int2,
_cnt int,
_sum int8,
avg float8,
min int,
max int,
p90 int,
p95 int,
p99 int
)
PARTITION BY LIST ( (extract('hour' from lt)::text) );
-- CREATE unlogged TABLE agg0 PARTITION OF agg FOR VALUES IN ('0');
-- CREATE unlogged TABLE agg1 PARTITION OF agg FOR VALUES IN ('1');
-- CREATE unlogged TABLE agg2 PARTITION OF agg FOR VALUES IN ('2');
-- CREATE unlogged TABLE agg3 PARTITION OF agg FOR VALUES IN ('3');
-- CREATE unlogged TABLE agg4 PARTITION OF agg FOR VALUES IN ('4');
-- CREATE unlogged TABLE agg5 PARTITION OF agg FOR VALUES IN ('5');
-- CREATE unlogged TABLE agg6 PARTITION OF agg FOR VALUES IN ('6');
-- CREATE unlogged TABLE agg7 PARTITION OF agg FOR VALUES IN ('7');
-- CREATE unlogged TABLE agg8 PARTITION OF agg FOR VALUES IN ('8');
-- CREATE unlogged TABLE agg9 PARTITION OF agg FOR VALUES IN ('9');
-- CREATE unlogged TABLE agg10 PARTITION OF agg FOR VALUES IN ('10');
-- CREATE unlogged TABLE agg11 PARTITION OF agg FOR VALUES IN ('11');
-- CREATE unlogged TABLE agg12 PARTITION OF agg FOR VALUES IN ('12');
-- CREATE unlogged TABLE agg13 PARTITION OF agg FOR VALUES IN ('13');
-- CREATE unlogged TABLE agg14 PARTITION OF agg FOR VALUES IN ('14');
-- CREATE unlogged TABLE agg15 PARTITION OF agg FOR VALUES IN ('15');
-- CREATE unlogged TABLE agg16 PARTITION OF agg FOR VALUES IN ('16');
-- CREATE unlogged TABLE agg17 PARTITION OF agg FOR VALUES IN ('17');
-- CREATE unlogged TABLE agg18 PARTITION OF agg FOR VALUES IN ('18');
-- CREATE unlogged TABLE agg19 PARTITION OF agg FOR VALUES IN ('19');
-- CREATE unlogged TABLE agg20 PARTITION OF agg FOR VALUES IN ('20');
-- CREATE unlogged TABLE agg21 PARTITION OF agg FOR VALUES IN ('21');
-- CREATE unlogged TABLE agg22 PARTITION OF agg FOR VALUES IN ('22');
-- CREATE unlogged TABLE agg23 PARTITION OF agg FOR VALUES IN ('23');
-- create index idx_agg_lt on agg(lt);-- drop table agg;

Create 1,024 partitioned tables at a time, with 24 partitions per partitioned table.

do language plpgsql 
$$

declare
begin
for i in 1..1024 loop
-- 创建主表
execute format(
'
CREATE unlogged TABLE agg%s (
id serial8 not null,
lt timestamp not null,
tu int2,
gv text,
mid int2,
_cnt int,
_sum int8,
avg float8,
min int,
max int,
p90 int,
p95 int,
p99 int
)
PARTITION BY LIST ( (extract(''hour'' from lt)::text) )
', i);
for x in 0..23 loop
-- 创建分区
execute format('CREATE unlogged TABLE agg%s_%s PARTITION OF agg%s FOR VALUES IN (%L)', i, x, i, x);

-- PG 10的话,请在这里建索引
execute format('create index idx_agg%s_%s_lt on agg%s_%s(lt)', i, x, i, x);
end loop;

-- 创建索引(PG 11支持)
-- execute format('create index idx_agg%s_lt on agg%s(lt)', i, i);
end loop;
end;
$$
;

Detail tables + statistical tables, a total of 30,720 tables.

For maintaining data, just truncate the earliest partition and the partition is recycled.

Define a Dynamic Write Function

For ease of stress testing, dynamic SQL is used to write data into the corresponding FEED detail table.

create or replace function ins_mx(  
int, -- suffix
text, -- GV
int, -- RC
int[], -- v1
int[], -- v2
int[], -- v3
int[], -- v4
int[], -- v5
int[], -- v6
int[], -- v7
int[], -- v8
int[] -- v9
) returns void as
$$

declare
begin
execute format(
'
insert into mx%s
(lt,gv,rc,v1,v2,v3,v4,v5,v6,v7,v8,v9)
values
(now(),%L,%s,%L,%L,%L,%L,%L,%L,%L,%L,%L)
',
$1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12
);
end;
$$
language plpgsql strict;

Example:

select ins_mx(1,'a',10,gen_randarr(100,10),gen_randarr(100,10),gen_randarr(100,10),gen_randarr(100,10),gen_randarr(100,10),gen_randarr(100,10),gen_randarr(100,10),gen_randarr(100,10),gen_randarr(100,10));  
ins_mx
--------

(1 row)

postgres=# select * from mx1;
id | lt | gv | rc | v1 | v2 | v3 | v4 | v5 | v6
| v7 | v8 | v9
----+----------------------------+----+----+-------------------------------+-------------------------------+---------------------------------+--------------------------------+---------------------------------+----------------------------
-----+------------------------------+--------------------------------+--------------------------------
1 | 2018-02-06 16:14:10.874121 | a | 10 | {17,12,33,2,73,67,73,12,87,8} | {99,34,70,82,98,9,53,73,52,8} | {96,32,41,72,98,66,14,68,99,41} | {75,16,53,8,19,26,75,92,38,61} | {99,36,95,70,18,94,79,71,67,31} | {79,62,63,20,35,60,86,49,29
,85} | {89,4,1,42,12,20,68,86,11,6} | {48,10,42,43,80,60,37,59,31,4} | {90,10,66,52,30,0,12,15,49,41}
(1 row)

Stress Testing Design 1

Define Write Stress Testing 1

Dynamic; write multiple tables; array data is dynamic data

1,024 random tables, 1,500 random groups and 2 random arrays of 2,500 elements

vi test1.sql  

\set suffix random(1,1024)
\set gv random(1,1500)
select ins_mx(:suffix,:gv,2500,gen_randarr(100,2500),gen_randarr(100,2500),'{}','{}','{}','{}','{}','{}','{}');
pgbench -M prepared -n -r -P 1 -f ./test1.sql -c 56 -j 56 -T 120


transaction type: ./test1.sql
scaling factor: 1
query mode: prepared
number of clients: 56
number of threads: 56
duration: 120 s
number of transactions actually processed: 1475459
latency average = 4.554 ms
latency stddev = 1.226 ms
tps = 12267.216576 (including connections establishing)
tps = 12269.288221 (excluding connections establishing)
statement latencies in milliseconds:
0.002 \set suffix random(1,1024)
0.001 \set gv random(1,1500)
4.556 select ins_mx(:suffix,:gv,2500,gen_randarr(100,2500),gen_randarr(100,2500),'{}','{}','{}','{}','{}','{}','{}');
top - 17:53:50 up 26 days, 22:41, 3 users, load average: 34.95, 12.67, 8.52
Tasks: 540 total, 58 running, 482 sleeping, 0 stopped, 0 zombie
%Cpu(s): 95.5 us, 4.1 sy, 0.0 ni, 0.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 23094336+total, 18962992+free, 5971540 used, 35341904 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 21054910+avail Mem

Define Write Stress Testing 2

Dynamic; write multiple tables; array data is static data

(The overhead of the database is gen_randarr, but this array is actually passed from the application, so using a static array here can avoid the extra overhead of the database and the performance is more realistic.)

vi test2.sql  

\set suffix random(1,1024)
\set gv random(1,1500)
select ins_mx(:suffix,:gv,2500,'{12,22,65,18,1,60,69,9,52,28,73,94,95,93,65,99,46,40,64,18,5,6,81,81,99,21,19,35,90,83,48,2,5,13,20,5,73,89,15,25,17,88,18,12,81,84,11,27,24,75,45,28,80,26,9,80,47,28,15,37,11,63,38,16,76,58,21,49,47,36,73,64,24,92,76,5,76,87,32,99,62,77,28,42,3,37,22,49,65,36,86,76,100,25,92,76,83,13,24,30,49,98,94,74,89,71,79,65,58,11,64,19,88,92,62,90,29,83,40,94,20,26,70,19,51,61,95,33,75,19,63,24,17,57,98,6,28,76,71,86,87,36,5,75,28,67,65,57,50,5,51,70,31,21,90,82,82,85,15,57,4,78,81,21,35,78,27,63,55,99,49,42,35,54,17,62,21,82,20,72,87,71,42,18,91,31,0,74,16,15,30,20,93,11,41,29,89,68,92,44,67,41,86,1,95,3,64,17,85,83,88,72,54,30,91,45,61,91,19,77,6,49,97,99,60,38,27,50,6,19,94,73,60,79,74,55,82,38,72,67,21,60,40,75,90,30,20,51,21,39,28,26,88,25,25,49,63,53,98,70,72,92,42,32,71,16,87,53,54,59,21,75,19,60,50,9,91,70,60,11,10,88,38,98,14,63,46,77,16,44,47,88,36,89,20,7,6,7,61,60,66,81,35,86,42,85,95,33,56,55,44,65,43,82,63,57,45,9,34,60,54,81,48,90,70,68,97,75,75,58,35,41,39,70,27,81,56,22,14,12,77,58,77,20,39,40,76,84,50,10,44,3,91,92,93,61,60,91,36,34,48,71,76,88,42,3,69,97,24,82,9,1,40,86,21,79,26,97,63,76,7,7,79,98,99,73,58,58,63,94,93,11,65,68,99,7,71,68,4,95,50,13,96,90,99,17,69,25,14,32,1,21,38,80,18,37,52,77,95,15,71,88,27,37,56,26,43,27,93,48,22,43,61,19,34,60,35,3,85,49,34,86,70,73,65,88,10,18,65,5,33,36,93,60,73,49,86,16,76,79,64,98,22,25,17,56,85,52,59,70,1,93,55,71,66,21,59,76,39,24,81,72,61,73,32,33,22,17,50,98,96,14,96,18,38,13,74,23,65,33,93,66,26,48,37,91,69,97,67,8,21,48,79,82,21,11,15,43,28,65,41,25,78,37,43,17,50,17,40,15,50,32,81,76,80,19,67,49,15,34,57,36,82,36,18,3,48,33,46,76,98,87,1,76,25,43,92,75,61,32,90,11,64,71,86,45,90,53,94,5,88,51,41,69,87,59,72,35,93,18,11,90,6,11,66,30,55,59,5,16,91,95,26,55,66,12,100,56,66,94,61,53,45,2,23,32,62,95,67,54,13,78,45,19,90,11,49,45,70,54,60,61,49,86,16,15,99,16,71,65,10,32,18,55,35,40,87,97,35,54,51,48,33,96,67,22,7,16,67,77,70,27,38,20,13,54,35,12,69,6,77,79,39,95,33,74,35,20,71,70,74,22,19,7,18,86,29,25,2,96,3,72,23,40,92,37,94,27,49,63,33,26,42,72,21,75,46,56,95,17,26,70,39,45,77,57,31,6,82,33,2,85,5,25,25,97,62,19,24,11,82,58,37,24,30,58,99,76,13,94,93,39,64,32,84,41,89,15,47,71,48,49,56,53,74,81,51,37,0,75,48,82,33,85,6,63,42,6,39,56,100,32,95,64,64,80,5,53,95,52,24,43,1,80,96,76,61,47,12,61,22,60,43,55,45,50,18,87,55,56,43,55,89,38,19,53,18,24,5,13,77,29,56,78,9,52,53,70,99,66,31,21,25,74,76,70,24,93,58,79,50,1,34,39,39,53,91,57,77,96,69,54,26,25,32,35,77,85,5,76,50,36,97,76,10,73,46,33,67,4,12,17,4,45,55,43,98,46,100,75,43,69,29,69,94,61,3,71,46,8,48,96,44,45,72,53,19,18,86,85,21,98,2,26,43,57,69,41,4,68,17,47,37,46,15,32,7,19,3,52,27,51,48,70,96,20,23,15,38,9,100,60,7,2,85,50,60,54,91,64,22,8,10,59,54,25,91,61,44,94,13,70,45,62,41,41,82,64,55,20,73,55,80,80,57,65,30,17,18,21,81,41,29,91,100,83,16,91,44,60,85,58,31,30,20,71,70,2,35,25,22,8,80,1,88,38,66,18,55,84,39,35,25,69,26,25,52,42,16,96,3,0,54,33,30,74,4,0,75,39,25,97,47,6,98,35,44,64,53,98,48,92,34,73,60,60,97,12,2,13,9,5,13,63,38,43,37,43,44,12,82,69,9,29,75,7,63,18,70,16,17,18,8,50,91,68,10,88,80,13,1,89,18,15,52,56,58,89,98,2,0,80,71,9,9,45,16,72,64,86,88,81,4,96,31,95,63,41,83,44,54,84,33,72,99,84,28,57,73,26,58,73,6,29,83,15,74,98,87,38,84,75,19,89,71,50,84,34,91,67,78,45,51,10,17,50,95,45,7,68,71,65,41,78,94,23,93,69,22,80,7,6,55,26,95,26,76,79,61,67,46,38,12,97,49,30,47,44,75,53,11,46,18,52,24,12,75,17,81,97,97,88,3,52,14,98,78,89,77,39,56,23,77,69,20,26,99,66,70,74,20,81,20,38,33,44,51,9,61,32,6,58,20,9,10,33,8,88,23,85,27,79,7,5,48,27,31,46,93,1,20,13,82,40,51,15,84,2,23,45,33,29,3,53,39,13,86,46,1,8,31,28,87,38,33,35,65,64,82,58,65,2,71,47,42,22,62,26,24,85,71,57,14,74,10,53,86,95,99,87,4,30,16,91,68,49,26,33,13,8,92,77,10,63,24,51,85,86,78,9,71,49,65,86,23,75,39,9,70,38,96,74,68,12,65,36,61,91,69,73,99,61,51,9,24,75,60,8,61,38,17,32,87,82,17,9,57,56,18,28,93,15,2,61,27,67,97,87,59,66,60,58,27,11,67,50,86,27,59,46,65,76,78,51,58,95,61,16,51,79,43,44,94,45,5,20,12,2,7,71,68,68,29,94,78,95,44,64,22,3,10,87,79,88,38,37,83,99,52,34,78,96,78,71,41,83,92,53,85,99,24,53,67,53,47,45,48,91,9,70,94,19,57,73,7,96,10,90,95,63,24,73,58,2,44,99,85,36,52,70,35,76,23,1,29,70,46,77,61,55,48,55,73,5,29,80,1,39,70,96,1,94,68,59,95,12,59,81,48,11,51,82,88,73,83,17,43,29,94,4,84,42,59,57,47,88,37,48,26,7,43,28,1,11,87,97,23,46,77,71,57,28,53,44,1,36,61,44,65,55,48,49,97,7,6,44,95,43,92,22,51,35,49,52,46,36,48,69,82,26,40,39,53,93,83,54,29,44,98,94,99,46,43,96,54,49,40,49,92,32,71,43,67,20,95,13,57,43,82,39,69,23,78,22,16,61,76,45,6,75,39,5,21,82,2,75,30,42,24,23,74,95,65,40,15,60,53,72,3,35,11,72,58,89,94,74,51,71,19,56,45,58,62,67,39,63,42,70,5,66,92,79,61,58,19,76,18,72,48,21,7,59,93,65,49,87,39,99,57,57,55,3,15,17,69,54,80,11,24,85,76,16,64,37,74,83,13,92,54,61,12,62,21,5,27,69,92,66,68,49,23,24,52,38,41,21,93,21,32,17,6,8,33,70,46,7,53,59,99,7,20,11,69,41,16,96,10,9,61,79,58,85,2,10,23,43,31,16,64,63,32,70,72,65,40,17,72,93,76,71,100,96,82,68,37,99,64,47,7,25,26,65,10,28,76,33,71,7,48,35,70,81,6,42,46,46,60,18,38,36,90,38,32,72,6,69,71,70,16,79,96,42,44,6,70,20,38,42,27,87,77,97,68,83,39,14,28,99,32,67,34,22,5,66,94,11,35,65,81,51,44,77,93,88,83,64,7,21,5,34,8,82,31,76,65,70,89,93,69,22,60,3,44,65,69,38,76,5,3,57,56,46,34,49,34,17,13,41,38,18,75,46,1,5,22,66,75,11,59,44,33,19,47,76,84,16,14,59,20,16,17,76,62,51,26,96,68,39,37,6,57,11,52,58,16,73,24,91,84,82,35,17,1,82,93,85,98,6,44,18,23,61,94,85,11,20,81,79,59,17,85,17,29,36,74,45,9,98,36,93,80,71,10,82,53,3,66,51,9,10,69,32,71,63,16,82,83,97,61,43,14,46,59,43,82,34,88,91,32,24,85,12,96,95,93,49,97,60,99,7,70,68,38,41,31,55,23,14,52,85,57,66,31,16,9,13,50,97,4,81,21,89,93,17,83,87,66,81,47,66,87,17,34,26,58,65,80,81,79,32,65,36,98,96,53,7,9,2,4,13,84,26,1,77,43,85,64,9,66,11,75,53,27,8,79,85,73,59,66,52,91,31,88,89,27,41,96,36,43,100,48,27,25,49,4,68,34,69,77,100,79,52,53,7,60,31,92,33,90,57,85,81,89,73,70,16,13,66,51,56,65,99,83,91,49,88,59,83,56,36,83,36,88,35,42,48,67,34,81,57,91,66,38,80,39,8,96,52,74,47,8,39,46,92,30,95,80,89,78,36,25,61,71,13,96,14,62,63,47,43,20,39,9,58,18,48,66,14,100,40,61,8,79,7,100,8,3,79,97,81,15,22,42,86,35,38,100,97,1,47,40,21,86,49,80,4,96,46,18,96,86,79,3,64,86,3,72,89,82,69,70,97,91,12,84,26,50,84,23,51,31,62,72,17,11,52,21,7,98,39,3,83,18,6,48,4,9,20,93,92,89,63,89,80,75,73,6,24,56,29,76,87,91,48,4,2,100,24,9,98,63,12,81,81,18,29,85,27,49,78,19,38,41,8,18,16,80,24,40,37,53,16,24,44,64,28,46,64,52,55,61,15,67,43,96,85,72,81,12,21,59,30,59,0,38,77,16,18,1,56,55,54,72,79,98,35,6,44,99,59,99,60,74,66,3,70,51,75,51,62,95,11,93,54,11,30,30,27,48,31,83,3,85,55,82,83,90,88,28,89,47,27,49,21,93,52,91,44,26,43,6,21,53,99,75,64,29,5,91,78,37,74,81,22,29,63,6,19,51,33,8,98,60,57,19,53,8,10,97,35,53,4,56,6,2,31,70,32,37,62,9,73,36,90,96,65,53,1,84,5,34,91,3,94,48,22,48,56,32,45,91,85,49,47,91,51,78,62,83,15,23,92,88,59,83,84,24,36,85,8,41,19,99,43,14,47,65,62,3,97,7,94,82,55,40,73,6,18,35,89,33,58,81,21,17,64,5,41,100,89,49,41,9,48,84,22,94,49,84,97,46,90,91,29,46,31,2,52,49,37,41,82,95,22,3,13,86,7,54,86,97,2,27,5,50,11,28,44,60,11,41,6,2,32,34,47,63,36,99,12,74,40,94,69,62,97,81,49,4,35,35,1,38,62,6,88,73,34,32,32,45,73,38,47,5,72,94,68,9,93,80,82,33,74,51,95,71,33,44,75,68,79,76,5,41,82,93,14,15,25,46,60,98,84,7,3,56,1,71,65,93,51,47,26,25,99,22,95,31,66}','{70,99,45,46,4,86,27,97,100,43,22,45,3,20,29,10,22,85,10,93,50,4,44,97,30,68,96,52,64,27,18,34,26,63,79,30,49,7,27,49,49,49,94,52,68,23,62,91,8,72,84,59,76,28,56,6,96,52,57,60,79,75,94,5,38,73,35,87,80,62,35,29,11,29,82,79,53,44,70,61,16,54,20,91,82,76,97,78,28,54,38,7,29,31,12,67,5,48,54,84,10,89,14,21,18,95,0,71,39,70,32,55,24,52,46,6,28,43,84,56,97,21,64,26,53,76,93,57,24,47,42,34,36,56,55,54,51,55,25,90,25,58,44,49,10,90,55,38,33,39,94,29,60,58,55,13,34,48,70,58,95,12,91,31,68,46,85,18,1,10,8,27,68,53,76,78,43,31,16,76,70,10,5,30,68,60,43,2,9,13,60,4,26,51,34,93,97,19,12,98,29,20,25,97,73,1,75,16,32,90,91,2,1,96,32,69,57,76,71,66,89,30,69,15,81,4,8,79,23,19,77,52,39,2,49,12,3,24,28,35,14,19,37,14,15,70,83,72,45,54,38,34,84,7,49,65,11,56,44,34,76,21,86,15,23,35,27,26,59,54,61,73,73,98,87,89,68,70,61,13,24,98,47,7,6,96,73,17,52,16,51,27,37,37,42,59,73,69,85,32,23,46,4,96,44,91,85,11,61,46,24,85,44,71,92,50,67,65,67,18,81,18,46,18,55,88,77,28,57,62,59,80,8,63,76,52,55,61,63,16,7,87,1,51,58,93,1,24,58,67,43,39,85,89,57,40,77,35,68,34,97,27,14,5,91,90,56,45,51,19,62,58,6,63,9,64,56,10,89,14,77,31,53,62,20,11,2,97,45,70,31,42,98,44,47,88,34,3,34,86,23,95,44,29,58,53,93,14,63,81,28,40,13,81,3,33,92,5,30,37,76,60,79,73,5,26,62,39,29,96,24,52,91,68,81,49,21,73,63,84,55,90,25,68,71,27,1,63,33,31,100,8,91,79,82,96,4,43,34,34,39,58,85,30,26,66,79,48,40,41,32,94,32,57,62,3,84,63,66,17,93,66,25,84,45,7,80,49,50,14,83,89,72,68,19,99,34,98,46,74,40,78,68,71,35,30,75,19,93,41,35,86,7,61,70,52,68,50,1,18,64,84,7,36,52,27,34,87,25,81,60,64,59,29,36,93,59,10,12,51,51,47,37,59,8,7,11,75,57,12,93,20,96,1,56,48,27,91,35,52,71,95,16,30,24,52,23,82,63,35,34,14,82,71,73,90,78,84,66,35,96,59,55,92,59,12,40,87,3,75,39,74,70,55,4,94,7,27,77,70,62,11,84,45,82,57,35,60,40,1,95,36,59,50,28,19,62,68,5,65,43,44,39,14,99,43,8,6,70,85,76,32,95,60,77,77,16,12,37,56,13,32,92,72,82,20,90,44,88,96,9,31,40,47,45,38,90,53,44,60,37,20,92,32,80,69,9,96,81,46,52,94,78,44,65,60,64,56,4,52,51,13,83,91,60,28,29,50,80,74,9,17,94,1,50,73,70,59,69,51,5,21,45,83,66,10,42,30,66,46,82,17,59,65,8,19,93,38,68,73,11,77,90,5,79,40,78,49,99,47,0,4,69,45,87,34,55,29,64,21,75,46,38,34,11,46,53,4,84,21,77,95,98,67,0,77,7,79,26,5,26,26,9,95,71,96,29,26,25,94,47,0,40,85,34,51,31,87,55,15,8,32,10,6,99,11,83,6,90,9,11,16,35,21,11,6,17,40,31,42,34,78,42,74,63,77,25,94,64,81,9,71,13,19,77,12,30,60,18,20,69,29,35,3,49,46,9,66,86,40,8,20,18,50,94,81,27,19,74,91,100,83,63,13,2,40,24,32,100,42,52,68,71,87,72,20,33,80,86,19,20,94,39,39,45,33,19,72,52,94,63,52,77,26,64,79,65,89,11,65,31,62,34,2,49,5,22,83,85,8,2,6,3,41,44,48,74,64,20,27,57,83,79,34,9,43,12,74,32,23,40,63,86,73,64,35,78,86,18,63,95,19,69,98,61,14,45,35,77,65,62,35,49,40,68,57,83,81,32,15,4,71,78,90,44,42,25,23,28,42,86,23,61,55,21,22,69,66,57,47,32,19,81,80,59,50,38,42,31,69,57,35,41,34,24,85,76,49,8,5,91,94,28,52,49,49,75,18,15,32,65,47,50,46,28,9,96,65,51,27,35,8,61,76,42,86,61,18,34,68,23,25,62,51,78,11,0,52,29,15,84,94,63,34,40,90,43,36,56,94,62,90,2,23,66,44,9,27,62,44,95,85,69,57,36,47,68,36,99,97,52,83,91,15,17,30,5,60,66,61,54,28,51,56,52,17,100,61,43,62,4,38,47,73,95,84,20,63,20,19,59,72,2,50,87,19,80,92,79,46,52,33,75,3,89,26,20,89,87,63,51,91,2,98,65,97,82,85,59,2,4,19,74,5,69,61,24,49,53,3,95,5,37,70,8,26,96,28,15,83,92,66,75,93,64,40,90,46,24,49,49,28,68,23,33,36,84,58,85,37,61,81,42,97,51,50,23,47,78,38,31,70,4,6,63,69,45,53,15,69,2,63,97,69,86,31,6,70,88,91,7,49,72,48,46,23,98,69,70,76,7,1,46,11,7,9,80,52,61,95,21,63,58,18,32,44,49,38,14,37,29,21,86,1,69,32,24,67,1,95,43,8,96,89,20,2,98,100,54,60,95,75,23,53,93,55,98,42,93,12,79,22,33,65,24,2,97,48,69,98,43,13,7,38,2,26,41,1,26,94,60,21,69,83,74,63,38,72,5,31,84,84,53,17,49,77,19,46,25,89,44,68,1,50,6,4,77,47,4,3,41,65,25,10,47,99,73,85,71,77,16,55,61,70,72,10,46,91,56,72,80,100,39,81,50,45,85,27,92,89,30,33,54,55,43,1,54,16,86,25,94,3,80,55,72,52,65,19,43,21,90,23,21,30,4,71,75,88,98,67,78,28,0,31,83,43,32,37,59,19,61,53,22,41,8,94,93,73,13,36,94,3,59,15,32,62,86,7,51,84,74,28,12,74,60,95,18,92,31,77,11,93,30,33,34,37,26,27,10,39,63,4,42,22,19,74,84,5,81,35,89,56,63,1,30,23,96,48,15,28,25,26,21,54,58,55,92,85,82,2,24,45,6,66,67,26,40,51,31,21,86,20,77,49,22,7,72,18,55,86,46,80,12,66,34,71,21,26,55,3,28,79,48,34,45,15,60,85,66,91,6,52,12,83,1,34,91,72,52,46,59,98,25,71,64,59,41,85,85,97,88,13,76,36,48,21,51,8,6,17,99,13,69,11,96,70,45,87,42,97,32,1,94,58,72,59,17,13,44,2,10,32,15,87,68,63,8,19,71,14,36,70,27,5,81,23,75,26,10,18,23,42,19,17,0,91,75,17,4,19,19,14,51,35,1,19,98,9,39,69,23,75,39,50,81,20,73,56,46,83,74,69,25,92,86,25,83,61,42,87,80,62,1,32,97,2,51,95,11,90,64,34,65,3,84,45,23,57,1,69,40,75,38,65,67,24,91,50,85,33,37,65,95,38,97,92,41,48,87,52,38,51,86,3,54,70,48,77,27,50,46,67,24,85,32,92,9,23,42,93,56,79,59,51,17,56,43,58,4,30,9,42,81,95,45,34,65,93,11,92,43,58,59,67,42,92,59,51,15,1,44,71,80,3,22,97,59,65,55,63,95,65,6,76,60,51,10,25,44,21,17,87,79,76,55,21,68,14,72,83,15,16,53,95,20,76,92,79,41,47,42,36,12,48,12,71,98,22,96,42,43,13,29,22,89,84,43,57,98,15,39,12,31,93,7,51,68,99,30,9,46,72,45,58,19,56,30,18,78,26,60,21,39,89,43,28,73,86,84,71,1,24,83,32,16,91,83,84,90,13,93,36,84,38,94,4,95,24,21,73,50,81,94,88,70,36,16,44,22,0,15,22,24,98,54,40,89,37,24,78,50,18,15,34,56,9,38,51,33,59,23,83,40,17,71,10,53,87,54,75,87,68,97,10,66,51,50,55,88,74,33,38,92,48,72,48,57,10,98,90,69,22,73,9,39,43,19,92,30,73,67,16,41,64,26,7,15,76,62,3,50,96,41,42,43,14,89,0,24,88,90,92,10,63,1,48,6,20,40,36,92,7,52,34,71,79,41,86,55,3,90,5,99,31,47,42,45,37,43,68,24,33,61,34,96,62,82,2,81,23,38,74,30,90,7,1,69,48,87,24,51,77,29,50,8,76,92,53,12,35,22,37,68,82,71,63,44,53,65,25,75,3,99,5,93,6,6,62,54,94,86,5,71,15,55,80,91,48,33,3,82,55,40,50,37,10,13,81,63,79,6,38,82,5,44,75,11,50,37,66,44,23,71,15,38,27,95,28,74,28,31,56,83,71,6,20,81,20,1,44,99,8,82,80,13,26,55,24,75,93,90,19,15,61,34,53,87,29,81,62,57,12,18,39,83,24,59,64,44,60,7,43,68,90,23,81,15,79,5,91,71,95,10,87,56,44,39,43,73,20,5,30,32,23,69,15,47,29,79,92,89,86,34,56,76,58,37,91,36,42,82,7,36,92,94,92,36,33,35,9,54,40,39,86,63,9,2,10,37,80,2,26,67,36,82,43,94,19,34,30,61,15,37,97,7,31,89,43,65,25,52,19,65,92,5,27,1,6,38,38,87,39,64,54,75,47,96,69,66,30,99,27,46,37,24,53,68,14,96,33,38,48,51,3,40,56,31,40,63,68,78,50,7,43,3,83,89,100,52,55,30,51,83,75,87,7,28,55,21,24,88,59,71,39,62,11,96,93,51,59,61,30,8,68,72,11,51,62,11,2,17,41,53,100,16,40,7,44,96,27,67,84,86,39,23,49,50,19,41,1,78,2,31,86,70,3,97,20,65,8,22,82,48,75,82,64,16,89,8,12,16,75,95,2,14,19,51,64,38,92,65,15,94,96,1,64,99,98,84,65,6,6,47,54,82,29,19,98,18,27,9,34,2,5,36,17,24,87,81,61,79,46,77,73,42,78,36,41,76,20,6,81,26,53,36,8,82,54,6,99,81,15,33,83,20,69,100,44,55,80,5,34,26,82,7,68,59,43,9,35,63,15,16,90,68,52,98,50,6,4,49,87,19,82,70,40,51,70,83,6,50,88,40,76,70,47,45,29,90,54,64,53,69,80,43,37,32,41,87,38,45,36,24,65,18,95,4,69,65,88,74,15,76,15,91,46,62,36,76,52,90,40,6,59,20,49,97,51,90,84,89,35,20,14,100,38,8,4,7,73,92,81,88,68,96,79,14,58,15,90,10,5,29,15,64,49,64,61,0,54,45,89,89,65,3,89,3,11,92,10,84,84,91,72,52,87,51,66,45,66,56,55,71,85,70,35,34,34,96,34,88,41,23,76,7,26,65,10,37,57,20,21,42,12,93,94,99,43,60,44,9,15,99,80,100,69,15,33,3,11,67,90,52,90,67,59,16,32,69,53,89,89,74,31,1,67,24,100,10,84,44,19,99,43,99,99,12,14,32,14}','{}','{}','{}','{}','{}','{}','{}');
pgbench -M prepared -n -r -P 1 -f ./test2.sql -c 56 -j 56 -T 120


transaction type: ./test2.sql
scaling factor: 1
query mode: prepared
number of clients: 56
number of threads: 56
duration: 120 s
number of transactions actually processed: 2404622
latency average = 2.794 ms
latency stddev = 2.429 ms
tps = 19903.967701 (including connections establishing)
tps = 19904.929587 (excluding connections establishing)
statement latencies in milliseconds:
0.002 \set suffix random(1,1024)
0.001 \set gv random(1,1500)
2.795 select ins_mx(:suffix,:gv,2500,'{12,2........................
top - 18:02:30 up 26 days, 22:50, 3 users, load average: 16.13, 21.10, 15.97
Tasks: 546 total, 60 running, 486 sleeping, 0 stopped, 0 zombie
%Cpu(s): 92.5 us, 3.8 sy, 0.0 ni, 3.5 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 23094336+total, 10642340+free, 8362460 used, 11615750+buff/cache
KiB Swap: 0 total, 0 free, 0 used. 17643998+avail Mem

Define Write Stress Testing 3

Static; write a single table; array data is static data

vi test3.sql  

\set gv random(1,1500)
insert into mx1 (lt,gv,rc,v1,v2,v3,v4,v5,v6,v7,v8,v9) values (now(),:gv,2500,'{12,22,65,18,1,60,69,9,52,28,73,94,95,93,65,99,46,40,64,18,5,6,81,81,99,21,19,35,90,83,48,2,5,13,20,5,73,89,15,25,17,88,18,12,81,84,11,27,24,75,45,28,80,26,9,80,47,28,15,37,11,63,38,16,76,58,21,49,47,36,73,64,24,92,76,5,76,87,32,99,62,77,28,42,3,37,22,49,65,36,86,76,100,25,92,76,83,13,24,30,49,98,94,74,89,71,79,65,58,11,64,19,88,92,62,90,29,83,40,94,20,26,70,19,51,61,95,33,75,19,63,24,17,57,98,6,28,76,71,86,87,36,5,75,28,67,65,57,50,5,51,70,31,21,90,82,82,85,15,57,4,78,81,21,35,78,27,63,55,99,49,42,35,54,17,62,21,82,20,72,87,71,42,18,91,31,0,74,16,15,30,20,93,11,41,29,89,68,92,44,67,41,86,1,95,3,64,17,85,83,88,72,54,30,91,45,61,91,19,77,6,49,97,99,60,38,27,50,6,19,94,73,60,79,74,55,82,38,72,67,21,60,40,75,90,30,20,51,21,39,28,26,88,25,25,49,63,53,98,70,72,92,42,32,71,16,87,53,54,59,21,75,19,60,50,9,91,70,60,11,10,88,38,98,14,63,46,77,16,44,47,88,36,89,20,7,6,7,61,60,66,81,35,86,42,85,95,33,56,55,44,65,43,82,63,57,45,9,34,60,54,81,48,90,70,68,97,75,75,58,35,41,39,70,27,81,56,22,14,12,77,58,77,20,39,40,76,84,50,10,44,3,91,92,93,61,60,91,36,34,48,71,76,88,42,3,69,97,24,82,9,1,40,86,21,79,26,97,63,76,7,7,79,98,99,73,58,58,63,94,93,11,65,68,99,7,71,68,4,95,50,13,96,90,99,17,69,25,14,32,1,21,38,80,18,37,52,77,95,15,71,88,27,37,56,26,43,27,93,48,22,43,61,19,34,60,35,3,85,49,34,86,70,73,65,88,10,18,65,5,33,36,93,60,73,49,86,16,76,79,64,98,22,25,17,56,85,52,59,70,1,93,55,71,66,21,59,76,39,24,81,72,61,73,32,33,22,17,50,98,96,14,96,18,38,13,74,23,65,33,93,66,26,48,37,91,69,97,67,8,21,48,79,82,21,11,15,43,28,65,41,25,78,37,43,17,50,17,40,15,50,32,81,76,80,19,67,49,15,34,57,36,82,36,18,3,48,33,46,76,98,87,1,76,25,43,92,75,61,32,90,11,64,71,86,45,90,53,94,5,88,51,41,69,87,59,72,35,93,18,11,90,6,11,66,30,55,59,5,16,91,95,26,55,66,12,100,56,66,94,61,53,45,2,23,32,62,95,67,54,13,78,45,19,90,11,49,45,70,54,60,61,49,86,16,15,99,16,71,65,10,32,18,55,35,40,87,97,35,54,51,48,33,96,67,22,7,16,67,77,70,27,38,20,13,54,35,12,69,6,77,79,39,95,33,74,35,20,71,70,74,22,19,7,18,86,29,25,2,96,3,72,23,40,92,37,94,27,49,63,33,26,42,72,21,75,46,56,95,17,26,70,39,45,77,57,31,6,82,33,2,85,5,25,25,97,62,19,24,11,82,58,37,24,30,58,99,76,13,94,93,39,64,32,84,41,89,15,47,71,48,49,56,53,74,81,51,37,0,75,48,82,33,85,6,63,42,6,39,56,100,32,95,64,64,80,5,53,95,52,24,43,1,80,96,76,61,47,12,61,22,60,43,55,45,50,18,87,55,56,43,55,89,38,19,53,18,24,5,13,77,29,56,78,9,52,53,70,99,66,31,21,25,74,76,70,24,93,58,79,50,1,34,39,39,53,91,57,77,96,69,54,26,25,32,35,77,85,5,76,50,36,97,76,10,73,46,33,67,4,12,17,4,45,55,43,98,46,100,75,43,69,29,69,94,61,3,71,46,8,48,96,44,45,72,53,19,18,86,85,21,98,2,26,43,57,69,41,4,68,17,47,37,46,15,32,7,19,3,52,27,51,48,70,96,20,23,15,38,9,100,60,7,2,85,50,60,54,91,64,22,8,10,59,54,25,91,61,44,94,13,70,45,62,41,41,82,64,55,20,73,55,80,80,57,65,30,17,18,21,81,41,29,91,100,83,16,91,44,60,85,58,31,30,20,71,70,2,35,25,22,8,80,1,88,38,66,18,55,84,39,35,25,69,26,25,52,42,16,96,3,0,54,33,30,74,4,0,75,39,25,97,47,6,98,35,44,64,53,98,48,92,34,73,60,60,97,12,2,13,9,5,13,63,38,43,37,43,44,12,82,69,9,29,75,7,63,18,70,16,17,18,8,50,91,68,10,88,80,13,1,89,18,15,52,56,58,89,98,2,0,80,71,9,9,45,16,72,64,86,88,81,4,96,31,95,63,41,83,44,54,84,33,72,99,84,28,57,73,26,58,73,6,29,83,15,74,98,87,38,84,75,19,89,71,50,84,34,91,67,78,45,51,10,17,50,95,45,7,68,71,65,41,78,94,23,93,69,22,80,7,6,55,26,95,26,76,79,61,67,46,38,12,97,49,30,47,44,75,53,11,46,18,52,24,12,75,17,81,97,97,88,3,52,14,98,78,89,77,39,56,23,77,69,20,26,99,66,70,74,20,81,20,38,33,44,51,9,61,32,6,58,20,9,10,33,8,88,23,85,27,79,7,5,48,27,31,46,93,1,20,13,82,40,51,15,84,2,23,45,33,29,3,53,39,13,86,46,1,8,31,28,87,38,33,35,65,64,82,58,65,2,71,47,42,22,62,26,24,85,71,57,14,74,10,53,86,95,99,87,4,30,16,91,68,49,26,33,13,8,92,77,10,63,24,51,85,86,78,9,71,49,65,86,23,75,39,9,70,38,96,74,68,12,65,36,61,91,69,73,99,61,51,9,24,75,60,8,61,38,17,32,87,82,17,9,57,56,18,28,93,15,2,61,27,67,97,87,59,66,60,58,27,11,67,50,86,27,59,46,65,76,78,51,58,95,61,16,51,79,43,44,94,45,5,20,12,2,7,71,68,68,29,94,78,95,44,64,22,3,10,87,79,88,38,37,83,99,52,34,78,96,78,71,41,83,92,53,85,99,24,53,67,53,47,45,48,91,9,70,94,19,57,73,7,96,10,90,95,63,24,73,58,2,44,99,85,36,52,70,35,76,23,1,29,70,46,77,61,55,48,55,73,5,29,80,1,39,70,96,1,94,68,59,95,12,59,81,48,11,51,82,88,73,83,17,43,29,94,4,84,42,59,57,47,88,37,48,26,7,43,28,1,11,87,97,23,46,77,71,57,28,53,44,1,36,61,44,65,55,48,49,97,7,6,44,95,43,92,22,51,35,49,52,46,36,48,69,82,26,40,39,53,93,83,54,29,44,98,94,99,46,43,96,54,49,40,49,92,32,71,43,67,20,95,13,57,43,82,39,69,23,78,22,16,61,76,45,6,75,39,5,21,82,2,75,30,42,24,23,74,95,65,40,15,60,53,72,3,35,11,72,58,89,94,74,51,71,19,56,45,58,62,67,39,63,42,70,5,66,92,79,61,58,19,76,18,72,48,21,7,59,93,65,49,87,39,99,57,57,55,3,15,17,69,54,80,11,24,85,76,16,64,37,74,83,13,92,54,61,12,62,21,5,27,69,92,66,68,49,23,24,52,38,41,21,93,21,32,17,6,8,33,70,46,7,53,59,99,7,20,11,69,41,16,96,10,9,61,79,58,85,2,10,23,43,31,16,64,63,32,70,72,65,40,17,72,93,76,71,100,96,82,68,37,99,64,47,7,25,26,65,10,28,76,33,71,7,48,35,70,81,6,42,46,46,60,18,38,36,90,38,32,72,6,69,71,70,16,79,96,42,44,6,70,20,38,42,27,87,77,97,68,83,39,14,28,99,32,67,34,22,5,66,94,11,35,65,81,51,44,77,93,88,83,64,7,21,5,34,8,82,31,76,65,70,89,93,69,22,60,3,44,65,69,38,76,5,3,57,56,46,34,49,34,17,13,41,38,18,75,46,1,5,22,66,75,11,59,44,33,19,47,76,84,16,14,59,20,16,17,76,62,51,26,96,68,39,37,6,57,11,52,58,16,73,24,91,84,82,35,17,1,82,93,85,98,6,44,18,23,61,94,85,11,20,81,79,59,17,85,17,29,36,74,45,9,98,36,93,80,71,10,82,53,3,66,51,9,10,69,32,71,63,16,82,83,97,61,43,14,46,59,43,82,34,88,91,32,24,85,12,96,95,93,49,97,60,99,7,70,68,38,41,31,55,23,14,52,85,57,66,31,16,9,13,50,97,4,81,21,89,93,17,83,87,66,81,47,66,87,17,34,26,58,65,80,81,79,32,65,36,98,96,53,7,9,2,4,13,84,26,1,77,43,85,64,9,66,11,75,53,27,8,79,85,73,59,66,52,91,31,88,89,27,41,96,36,43,100,48,27,25,49,4,68,34,69,77,100,79,52,53,7,60,31,92,33,90,57,85,81,89,73,70,16,13,66,51,56,65,99,83,91,49,88,59,83,56,36,83,36,88,35,42,48,67,34,81,57,91,66,38,80,39,8,96,52,74,47,8,39,46,92,30,95,80,89,78,36,25,61,71,13,96,14,62,63,47,43,20,39,9,58,18,48,66,14,100,40,61,8,79,7,100,8,3,79,97,81,15,22,42,86,35,38,100,97,1,47,40,21,86,49,80,4,96,46,18,96,86,79,3,64,86,3,72,89,82,69,70,97,91,12,84,26,50,84,23,51,31,62,72,17,11,52,21,7,98,39,3,83,18,6,48,4,9,20,93,92,89,63,89,80,75,73,6,24,56,29,76,87,91,48,4,2,100,24,9,98,63,12,81,81,18,29,85,27,49,78,19,38,41,8,18,16,80,24,40,37,53,16,24,44,64,28,46,64,52,55,61,15,67,43,96,85,72,81,12,21,59,30,59,0,38,77,16,18,1,56,55,54,72,79,98,35,6,44,99,59,99,60,74,66,3,70,51,75,51,62,95,11,93,54,11,30,30,27,48,31,83,3,85,55,82,83,90,88,28,89,47,27,49,21,93,52,91,44,26,43,6,21,53,99,75,64,29,5,91,78,37,74,81,22,29,63,6,19,51,33,8,98,60,57,19,53,8,10,97,35,53,4,56,6,2,31,70,32,37,62,9,73,36,90,96,65,53,1,84,5,34,91,3,94,48,22,48,56,32,45,91,85,49,47,91,51,78,62,83,15,23,92,88,59,83,84,24,36,85,8,41,19,99,43,14,47,65,62,3,97,7,94,82,55,40,73,6,18,35,89,33,58,81,21,17,64,5,41,100,89,49,41,9,48,84,22,94,49,84,97,46,90,91,29,46,31,2,52,49,37,41,82,95,22,3,13,86,7,54,86,97,2,27,5,50,11,28,44,60,11,41,6,2,32,34,47,63,36,99,12,74,40,94,69,62,97,81,49,4,35,35,1,38,62,6,88,73,34,32,32,45,73,38,47,5,72,94,68,9,93,80,82,33,74,51,95,71,33,44,75,68,79,76,5,41,82,93,14,15,25,46,60,98,84,7,3,56,1,71,65,93,51,47,26,25,99,22,95,31,66}','{70,99,45,46,4,86,27,97,100,43,22,45,3,20,29,10,22,85,10,93,50,4,44,97,30,68,96,52,64,27,18,34,26,63,79,30,49,7,27,49,49,49,94,52,68,23,62,91,8,72,84,59,76,28,56,6,96,52,57,60,79,75,94,5,38,73,35,87,80,62,35,29,11,29,82,79,53,44,70,61,16,54,20,91,82,76,97,78,28,54,38,7,29,31,12,67,5,48,54,84,10,89,14,21,18,95,0,71,39,70,32,55,24,52,46,6,28,43,84,56,97,21,64,26,53,76,93,57,24,47,42,34,36,56,55,54,51,55,25,90,25,58,44,49,10,90,55,38,33,39,94,29,60,58,55,13,34,48,70,58,95,12,91,31,68,46,85,18,1,10,8,27,68,53,76,78,43,31,16,76,70,10,5,30,68,60,43,2,9,13,60,4,26,51,34,93,97,19,12,98,29,20,25,97,73,1,75,16,32,90,91,2,1,96,32,69,57,76,71,66,89,30,69,15,81,4,8,79,23,19,77,52,39,2,49,12,3,24,28,35,14,19,37,14,15,70,83,72,45,54,38,34,84,7,49,65,11,56,44,34,76,21,86,15,23,35,27,26,59,54,61,73,73,98,87,89,68,70,61,13,24,98,47,7,6,96,73,17,52,16,51,27,37,37,42,59,73,69,85,32,23,46,4,96,44,91,85,11,61,46,24,85,44,71,92,50,67,65,67,18,81,18,46,18,55,88,77,28,57,62,59,80,8,63,76,52,55,61,63,16,7,87,1,51,58,93,1,24,58,67,43,39,85,89,57,40,77,35,68,34,97,27,14,5,91,90,56,45,51,19,62,58,6,63,9,64,56,10,89,14,77,31,53,62,20,11,2,97,45,70,31,42,98,44,47,88,34,3,34,86,23,95,44,29,58,53,93,14,63,81,28,40,13,81,3,33,92,5,30,37,76,60,79,73,5,26,62,39,29,96,24,52,91,68,81,49,21,73,63,84,55,90,25,68,71,27,1,63,33,31,100,8,91,79,82,96,4,43,34,34,39,58,85,30,26,66,79,48,40,41,32,94,32,57,62,3,84,63,66,17,93,66,25,84,45,7,80,49,50,14,83,89,72,68,19,99,34,98,46,74,40,78,68,71,35,30,75,19,93,41,35,86,7,61,70,52,68,50,1,18,64,84,7,36,52,27,34,87,25,81,60,64,59,29,36,93,59,10,12,51,51,47,37,59,8,7,11,75,57,12,93,20,96,1,56,48,27,91,35,52,71,95,16,30,24,52,23,82,63,35,34,14,82,71,73,90,78,84,66,35,96,59,55,92,59,12,40,87,3,75,39,74,70,55,4,94,7,27,77,70,62,11,84,45,82,57,35,60,40,1,95,36,59,50,28,19,62,68,5,65,43,44,39,14,99,43,8,6,70,85,76,32,95,60,77,77,16,12,37,56,13,32,92,72,82,20,90,44,88,96,9,31,40,47,45,38,90,53,44,60,37,20,92,32,80,69,9,96,81,46,52,94,78,44,65,60,64,56,4,52,51,13,83,91,60,28,29,50,80,74,9,17,94,1,50,73,70,59,69,51,5,21,45,83,66,10,42,30,66,46,82,17,59,65,8,19,93,38,68,73,11,77,90,5,79,40,78,49,99,47,0,4,69,45,87,34,55,29,64,21,75,46,38,34,11,46,53,4,84,21,77,95,98,67,0,77,7,79,26,5,26,26,9,95,71,96,29,26,25,94,47,0,40,85,34,51,31,87,55,15,8,32,10,6,99,11,83,6,90,9,11,16,35,21,11,6,17,40,31,42,34,78,42,74,63,77,25,94,64,81,9,71,13,19,77,12,30,60,18,20,69,29,35,3,49,46,9,66,86,40,8,20,18,50,94,81,27,19,74,91,100,83,63,13,2,40,24,32,100,42,52,68,71,87,72,20,33,80,86,19,20,94,39,39,45,33,19,72,52,94,63,52,77,26,64,79,65,89,11,65,31,62,34,2,49,5,22,83,85,8,2,6,3,41,44,48,74,64,20,27,57,83,79,34,9,43,12,74,32,23,40,63,86,73,64,35,78,86,18,63,95,19,69,98,61,14,45,35,77,65,62,35,49,40,68,57,83,81,32,15,4,71,78,90,44,42,25,23,28,42,86,23,61,55,21,22,69,66,57,47,32,19,81,80,59,50,38,42,31,69,57,35,41,34,24,85,76,49,8,5,91,94,28,52,49,49,75,18,15,32,65,47,50,46,28,9,96,65,51,27,35,8,61,76,42,86,61,18,34,68,23,25,62,51,78,11,0,52,29,15,84,94,63,34,40,90,43,36,56,94,62,90,2,23,66,44,9,27,62,44,95,85,69,57,36,47,68,36,99,97,52,83,91,15,17,30,5,60,66,61,54,28,51,56,52,17,100,61,43,62,4,38,47,73,95,84,20,63,20,19,59,72,2,50,87,19,80,92,79,46,52,33,75,3,89,26,20,89,87,63,51,91,2,98,65,97,82,85,59,2,4,19,74,5,69,61,24,49,53,3,95,5,37,70,8,26,96,28,15,83,92,66,75,93,64,40,90,46,24,49,49,28,68,23,33,36,84,58,85,37,61,81,42,97,51,50,23,47,78,38,31,70,4,6,63,69,45,53,15,69,2,63,97,69,86,31,6,70,88,91,7,49,72,48,46,23,98,69,70,76,7,1,46,11,7,9,80,52,61,95,21,63,58,18,32,44,49,38,14,37,29,21,86,1,69,32,24,67,1,95,43,8,96,89,20,2,98,100,54,60,95,75,23,53,93,55,98,42,93,12,79,22,33,65,24,2,97,48,69,98,43,13,7,38,2,26,41,1,26,94,60,21,69,83,74,63,38,72,5,31,84,84,53,17,49,77,19,46,25,89,44,68,1,50,6,4,77,47,4,3,41,65,25,10,47,99,73,85,71,77,16,55,61,70,72,10,46,91,56,72,80,100,39,81,50,45,85,27,92,89,30,33,54,55,43,1,54,16,86,25,94,3,80,55,72,52,65,19,43,21,90,23,21,30,4,71,75,88,98,67,78,28,0,31,83,43,32,37,59,19,61,53,22,41,8,94,93,73,13,36,94,3,59,15,32,62,86,7,51,84,74,28,12,74,60,95,18,92,31,77,11,93,30,33,34,37,26,27,10,39,63,4,42,22,19,74,84,5,81,35,89,56,63,1,30,23,96,48,15,28,25,26,21,54,58,55,92,85,82,2,24,45,6,66,67,26,40,51,31,21,86,20,77,49,22,7,72,18,55,86,46,80,12,66,34,71,21,26,55,3,28,79,48,34,45,15,60,85,66,91,6,52,12,83,1,34,91,72,52,46,59,98,25,71,64,59,41,85,85,97,88,13,76,36,48,21,51,8,6,17,99,13,69,11,96,70,45,87,42,97,32,1,94,58,72,59,17,13,44,2,10,32,15,87,68,63,8,19,71,14,36,70,27,5,81,23,75,26,10,18,23,42,19,17,0,91,75,17,4,19,19,14,51,35,1,19,98,9,39,69,23,75,39,50,81,20,73,56,46,83,74,69,25,92,86,25,83,61,42,87,80,62,1,32,97,2,51,95,11,90,64,34,65,3,84,45,23,57,1,69,40,75,38,65,67,24,91,50,85,33,37,65,95,38,97,92,41,48,87,52,38,51,86,3,54,70,48,77,27,50,46,67,24,85,32,92,9,23,42,93,56,79,59,51,17,56,43,58,4,30,9,42,81,95,45,34,65,93,11,92,43,58,59,67,42,92,59,51,15,1,44,71,80,3,22,97,59,65,55,63,95,65,6,76,60,51,10,25,44,21,17,87,79,76,55,21,68,14,72,83,15,16,53,95,20,76,92,79,41,47,42,36,12,48,12,71,98,22,96,42,43,13,29,22,89,84,43,57,98,15,39,12,31,93,7,51,68,99,30,9,46,72,45,58,19,56,30,18,78,26,60,21,39,89,43,28,73,86,84,71,1,24,83,32,16,91,83,84,90,13,93,36,84,38,94,4,95,24,21,73,50,81,94,88,70,36,16,44,22,0,15,22,24,98,54,40,89,37,24,78,50,18,15,34,56,9,38,51,33,59,23,83,40,17,71,10,53,87,54,75,87,68,97,10,66,51,50,55,88,74,33,38,92,48,72,48,57,10,98,90,69,22,73,9,39,43,19,92,30,73,67,16,41,64,26,7,15,76,62,3,50,96,41,42,43,14,89,0,24,88,90,92,10,63,1,48,6,20,40,36,92,7,52,34,71,79,41,86,55,3,90,5,99,31,47,42,45,37,43,68,24,33,61,34,96,62,82,2,81,23,38,74,30,90,7,1,69,48,87,24,51,77,29,50,8,76,92,53,12,35,22,37,68,82,71,63,44,53,65,25,75,3,99,5,93,6,6,62,54,94,86,5,71,15,55,80,91,48,33,3,82,55,40,50,37,10,13,81,63,79,6,38,82,5,44,75,11,50,37,66,44,23,71,15,38,27,95,28,74,28,31,56,83,71,6,20,81,20,1,44,99,8,82,80,13,26,55,24,75,93,90,19,15,61,34,53,87,29,81,62,57,12,18,39,83,24,59,64,44,60,7,43,68,90,23,81,15,79,5,91,71,95,10,87,56,44,39,43,73,20,5,30,32,23,69,15,47,29,79,92,89,86,34,56,76,58,37,91,36,42,82,7,36,92,94,92,36,33,35,9,54,40,39,86,63,9,2,10,37,80,2,26,67,36,82,43,94,19,34,30,61,15,37,97,7,31,89,43,65,25,52,19,65,92,5,27,1,6,38,38,87,39,64,54,75,47,96,69,66,30,99,27,46,37,24,53,68,14,96,33,38,48,51,3,40,56,31,40,63,68,78,50,7,43,3,83,89,100,52,55,30,51,83,75,87,7,28,55,21,24,88,59,71,39,62,11,96,93,51,59,61,30,8,68,72,11,51,62,11,2,17,41,53,100,16,40,7,44,96,27,67,84,86,39,23,49,50,19,41,1,78,2,31,86,70,3,97,20,65,8,22,82,48,75,82,64,16,89,8,12,16,75,95,2,14,19,51,64,38,92,65,15,94,96,1,64,99,98,84,65,6,6,47,54,82,29,19,98,18,27,9,34,2,5,36,17,24,87,81,61,79,46,77,73,42,78,36,41,76,20,6,81,26,53,36,8,82,54,6,99,81,15,33,83,20,69,100,44,55,80,5,34,26,82,7,68,59,43,9,35,63,15,16,90,68,52,98,50,6,4,49,87,19,82,70,40,51,70,83,6,50,88,40,76,70,47,45,29,90,54,64,53,69,80,43,37,32,41,87,38,45,36,24,65,18,95,4,69,65,88,74,15,76,15,91,46,62,36,76,52,90,40,6,59,20,49,97,51,90,84,89,35,20,14,100,38,8,4,7,73,92,81,88,68,96,79,14,58,15,90,10,5,29,15,64,49,64,61,0,54,45,89,89,65,3,89,3,11,92,10,84,84,91,72,52,87,51,66,45,66,56,55,71,85,70,35,34,34,96,34,88,41,23,76,7,26,65,10,37,57,20,21,42,12,93,94,99,43,60,44,9,15,99,80,100,69,15,33,3,11,67,90,52,90,67,59,16,32,69,53,89,89,74,31,1,67,24,100,10,84,44,19,99,43,99,99,12,14,32,14}','{}','{}','{}','{}','{}','{}','{}');
pgbench -M prepared -n -r -P 1 -f ./test3.sql -c 56 -j 56 -T 120


transaction type: ./test3.sql
scaling factor: 1
query mode: prepared
number of clients: 56
number of threads: 56
duration: 120 s
number of transactions actually processed: 2496879
latency average = 2.691 ms
latency stddev = 5.174 ms
tps = 20802.191560 (including connections establishing)
tps = 20803.019308 (excluding connections establishing)
statement latencies in milliseconds:
0.001 \set gv random(1,1500)
2.689 insert into mx1 (lt,gv,rc,v1,v2,v3,v4,v5,v6,v7,v8,v9) values (now(),:gv,2500,'{12,22,65,18,.......................
top - 18:04:01 up 26 days, 22:51, 3 users, load average: 11.29, 18.53, 15.60
Tasks: 546 total, 36 running, 510 sleeping, 0 stopped, 0 zombie
%Cpu(s): 44.9 us, 5.4 sy, 0.0 ni, 49.4 id, 0.4 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 23094336+total, 10651434+free, 2351516 used, 12207750+buff/cache
KiB Swap: 0 total, 0 free, 0 used. 18246070+avail Mem

Define Statistical SQL

For example, the SQL for 1-minute statistics is as follows:

INSERT INTO agg1 (lt, tu, gv, mid, _cnt, _sum, avg, min, max, p90, p95, p99)  
SELECT
date_trunc('minute', current_timestamp) - INTERVAL '1 minutes' as lt,
1,
gv,
1,
_count,
array_to_mean(sorted1) * _count AS _sum,
array_to_mean(sorted1) as avg,
(sorted_array_to_percentile(sorted1, 0)) AS min,
(sorted_array_to_percentile(sorted1, 1)) AS max,
(sorted_array_to_percentile(sorted1, 0.9)) AS P90,
(sorted_array_to_percentile(sorted1, 0.95)) AS P95,
(sorted_array_to_percentile(sorted1, 0.99)) AS P99
FROM
(
select
gv,
count(rc) as _count,
sort_asc(arragg(mg.v1)) as sorted1
FROM
mx1 mg
where
lt >= date_trunc('minute', current_timestamp) - INTERVAL '1 minutes'
and
lt < date_trunc('minute', current_timestamp)
group by gv
) t;



INSERT 0 737
Time: 410.264 ms

It can be changed to string_agg statistics, as follows:

INSERT INTO agg1 (lt, tu, gv, mid, _cnt, _sum, avg, min, max, p90, p95, p99)  
SELECT
date_trunc('minute', current_timestamp) - INTERVAL '1 minutes' as lt,
1,
gv,
1,
_count,
array_to_mean(sorted1) * _count AS _sum,
array_to_mean(sorted1) as avg,
(sorted_array_to_percentile(sorted1, 0)) AS min,
(sorted_array_to_percentile(sorted1, 1)) AS max,
(sorted_array_to_percentile(sorted1, 0.9)) AS P90,
(sorted_array_to_percentile(sorted1, 0.95)) AS P95,
(sorted_array_to_percentile(sorted1, 0.99)) AS P99
FROM
(
select
gv,
count(rc) as _count,
sort_asc(
( '{'||string_agg(rtrim(ltrim(mg.v1::text, '{'), '}'), ',')||'}' )::int[]
) as sorted1
FROM
mx1 mg
where
lt >= date_trunc('minute', current_timestamp) - INTERVAL '1 minutes'
and
lt < date_trunc('minute', current_timestamp)
group by gv
) t;

Define a Dynamic Statistical Function

The statistical SQL of 1 minute, 5 minutes and 10 minutes is defined as dynamic statistical SQL. For stress testing convenience, enter the table name suffix of FEED LOG, the statistical interval, and the LIMIT of the number of statistical records in each interval. For example, LIMIT can satisfy the demand of 6 million points per minute per dimension, or the demand of any number of points, playing the role of setting the stress testing threshold.

create or replace function stat(  
int, -- suffix
int, -- limit
text -- interval
) returns void as
$$

declare
begin
set enable_seqscan=off;
set max_parallel_workers_per_gather =0;
execute format(
$_$
INSERT INTO agg%s (lt, tu, gv, mid, _cnt, _sum, avg, min, max, p90, p95, p99) -- $1
SELECT
date_trunc('minute', current_timestamp) - INTERVAL '%s' as lt, -- $3
1,
gv,
1,
_count,
array_to_mean(sorted1) * _count AS _sum,
array_to_mean(sorted1) as avg,
(sorted_array_to_percentile(sorted1, 0)) AS min,
(sorted_array_to_percentile(sorted1, 1)) AS max,
(sorted_array_to_percentile(sorted1, 0.9)) AS P90,
(sorted_array_to_percentile(sorted1, 0.95)) AS P95,
(sorted_array_to_percentile(sorted1, 0.99)) AS P99
FROM
(
select
gv,
count(rc) as _count,
sort_asc(arragg(mg.v1)) as sorted1
from
(
select *
FROM
mx%s mg -- $1
where
lt >= date_trunc('minute', current_timestamp) - INTERVAL '%s' -- $3
and
lt < date_trunc('minute', current_timestamp)
limit %s -- $2 , 限流作用,协助压测量级调整
) mg
group by gv
) t
$_$,
$1, $3, $1, $3, $2
);
end;
$$
language plpgsql strict;
postgres=# select stat(2, 24000, '10 min'); -- 24000*2500=6000万 ,10分钟6000万个点的统计
stat
------

(1 row)

Time: 235.821 ms

Similarly, it can also be changed to string_agg statistics.

create or replace function stat(  
int, -- suffix
int, -- limit
text -- interval
) returns void as
$$

declare
begin
set enable_seqscan=off;
set max_parallel_workers_per_gather =0;
execute format(
$_$
INSERT INTO agg%s (lt, tu, gv, mid, _cnt, _sum, avg, min, max, p90, p95, p99) -- $1
SELECT
date_trunc('minute', current_timestamp) - INTERVAL '%s' as lt, -- $3
1,
gv,
1,
_count,
array_to_mean(sorted1) * _count AS _sum,
array_to_mean(sorted1) as avg,
(sorted_array_to_percentile(sorted1, 0)) AS min,
(sorted_array_to_percentile(sorted1, 1)) AS max,
(sorted_array_to_percentile(sorted1, 0.9)) AS P90,
(sorted_array_to_percentile(sorted1, 0.95)) AS P95,
(sorted_array_to_percentile(sorted1, 0.99)) AS P99
FROM
(
select
gv,
count(rc) as _count,
sort_asc(
( '{'||string_agg(rtrim(ltrim(mg.v1::text, '{'), '}'), ',')||'}' )::int[]
) as sorted1
from
(
select *
FROM
mx%s mg -- $1
where
lt >= date_trunc('minute', current_timestamp) - INTERVAL '%s' -- $3
and
lt < date_trunc('minute', current_timestamp)
limit %s -- $2 , 限流作用,协助压测量级调整
) mg
group by gv
) t
$_$,
$1, $3, $1, $3, $2
);
end;
$$
language plpgsql strict;

Display statistical results

postgres=# select * from agg2;  
id | lt | tu | gv | mid | _cnt | _sum | avg | min | max | p90 | p95 | p99
-----+---------------------+----+------+-----+------+------+------------------+-----+-----+-----+-----+-----
1 | 2018-02-06 18:00:00 | 1 | 845 | 1 | 2 | 101 | 50.6836 | 0 | 100 | 91 | 96 | 99
2 | 2018-02-06 18:00:00 | 1 | 1247 | 1 | 1 | 51 | 50.6835999999999 | 0 | 100 | 91 | 96 | 99
3 | 2018-02-06 18:00:00 | 1 | 1337 | 1 | 2 | 101 | 50.6836 | 0 | 100 | 91 | 96 | 99
4 | 2018-02-06 18:00:00 | 1 | 537 | 1 | 1 | 51 | 50.6835999999999 | 0 | 100 | 91 | 96 | 99
5 | 2018-02-06 18:00:00 | 1 | 75 | 1 | 1 | 51 | 50.6835999999999 | 0 | 100 | 91 | 96 | 99

Stress Testing Design 2

Write and statistics tests are performed in parallel.

1. Statistical Stress Testing

For example, with the goal of writing 6 million elements per minute, the statistical indicators can be satisfied. Therefore, each interval set here is 2,400, 12,000, and 240,000 respectively. They represent respectively. That is, 6 million, 30 million, and 60 million.

vi stat1.sql  

\set suffix random(1,1024)
select stat(:suffix, 2400, '1 min');


vi stat2.sql

\set suffix random(1,1024)
select stat(:suffix, 12000, '5 min');


vi stat3.sql

\set suffix random(1,1024)
select stat(:suffix, 24000, '10 min');
nohup pgbench -M prepared -n -r -P 1 -f ./stat1.sql -c 10 -j 10 -T 1200 >./log.stat1 2>&1 &
nohup pgbench -M prepared -n -r -P 1 -f ./stat2.sql -c 10 -j 10 -T 1200 >./log.stat2 2>&1 &
nohup pgbench -M prepared -n -r -P 1 -f ./stat3.sql -c 10 -j 10 -T 1200 >./log.stat3 2>&1 &

2. Write Stress Testing

nohup pgbench -M prepared -n -r -P 1 -f ./test2.sql -c 42 -j 42 -T 1200 >./log.test2 2>&1 &

The results of the parallel test for write and statistics

top - 18:37:57 up 26 days, 23:25,  3 users,  load average: 16.60, 11.64, 12.11  
Tasks: 562 total, 70 running, 492 sleeping, 0 stopped, 0 zombie
%Cpu(s): 90.7 us, 6.4 sy, 0.0 ni, 2.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 23094336+total, 73160104 free, 10510536 used, 14727273+buff/cache
KiB Swap: 0 total, 0 free, 0 used. 19740713+avail Mem

1. Write 27.73 million points/s. This is equivalent to 1.664 billion elements per minute. After dividing it by 1,024 tables, each table has about 1.625 million elements per minute.

If you want to meet the write expectation of 6 million elements per minute for a single table, you need to adjust the table to 256.

transaction type: ./test2.sql  
scaling factor: 1
query mode: prepared
number of clients: 42
number of threads: 42
duration: 1200 s
number of transactions actually processed: 13312185
latency average = 3.786 ms
latency stddev = 3.226 ms
tps = 11091.503135 (including connections establishing)
tps = 11091.624310 (excluding connections establishing)
statement latencies in milliseconds:
0.002 \set suffix random(1,1024)
0.001 \set gv random(1,1500)
3.788 select ins_mx(:suffix,:gv,2500,'{12,22,65,18,1,

2. For 1-minute statistics, the count is 383 tables per second and 23,000 tables per minute.

This exceeds expectations.

transaction type: ./stat1.sql  
scaling factor: 1
query mode: prepared
number of clients: 10
number of threads: 10
duration: 1200 s
number of transactions actually processed: 459639
latency average = 26.107 ms
latency stddev = 138.111 ms
tps = 383.032007 (including connections establishing)
tps = 383.033812 (excluding connections establishing)
statement latencies in milliseconds:
0.002 \set suffix random(1,1024)
26.116 select stat(:suffix, 2400, '1 min');

3. For 5-minute statistics, the count is 3.82 tables per second and 1,146 tables every 5 minutes.

This exceeds expectations.

transaction type: ./stat2.sql  
scaling factor: 1
query mode: prepared
number of clients: 10
number of threads: 10
duration: 1200 s
number of transactions actually processed: 4586
latency average = 2617.628 ms
latency stddev = 1478.233 ms
tps = 3.818981 (including connections establishing)
tps = 3.819014 (excluding connections establishing)
statement latencies in milliseconds:
0.004 \set suffix random(1,1024)
2617.625 select stat(:suffix, 12000, '5 min');

4. For 10-minute statistics, the count is 1.71 tables per second and 1,126 tables every 10 minutes.

This exceeds expectations.

transaction type: ./stat3.sql  
scaling factor: 1
query mode: prepared
number of clients: 10
number of threads: 10
duration: 1200 s
number of transactions actually processed: 2060
latency average = 5830.904 ms
latency stddev = 2480.596 ms
tps = 1.713737 (including connections establishing)
tps = 1.713839 (excluding connections establishing)
statement latencies in milliseconds:
0.004 \set suffix random(1,1024)
5830.900 select stat(:suffix, 24000, '10 min');

Combining the three indicators above, if you want to meet the writing expectation of 6 million elements per minute for a single table, you need to adjust the number of tables to 256. In other words, PG10 under the hardware specifications involved in this example can support 256 tables, and each table can write and count 6 million elements per minute.

Both statistics and writing can meet the requirements.

Stress Testing Design 3

Adjust the suffix to 256, which means that the interval for writing and statistics is 256 tables, and the test results are as follows:

top - 19:23:16 up 27 days, 10 min,  3 users,  load average: 33.14, 10.55, 15.39  
Tasks: 565 total, 71 running, 494 sleeping, 0 stopped, 0 zombie
%Cpu(s): 92.4 us, 6.2 sy, 0.0 ni, 0.9 id, 0.4 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 23094336+total, 1028536 free, 11676488 used, 21823833+buff/cache
KiB Swap: 0 total, 0 free, 0 used. 13886019+avail Mem

Write

transaction type: ./test2.sql  
scaling factor: 1
query mode: prepared
number of clients: 24
number of threads: 24
duration: 1200 s
number of transactions actually processed: 12113510
latency average = 2.377 ms
latency stddev = 1.319 ms
tps = 10094.572203 (including connections establishing)
tps = 10094.659895 (excluding connections establishing)
statement latencies in milliseconds:
0.002 \set suffix random(1,256)
0.001 \set gv random(1,1500)
2.374 select ins_mx(:suffix,:gv,2500,'{12,22,65,18,1,60,69,9,52,28,73,9
......

Statistics

1分钟统计2520张表  

transaction type: ./stat1.sql
scaling factor: 1
query mode: prepared
number of clients: 10
number of threads: 10
duration: 1200 s
number of transactions actually processed: 50733
latency average = 237.004 ms
latency stddev = 736.468 ms
tps = 42.130871 (including connections establishing)
tps = 42.131272 (excluding connections establishing)
statement latencies in milliseconds:
0.002 \set suffix random(1,256)
237.062 select stat(:suffix, 2400, '1 min');

5分钟统计11100张表

transaction type: ./stat2.sql
scaling factor: 1
query mode: prepared
number of clients: 10
number of threads: 10
duration: 1200 s
number of transactions actually processed: 45781
latency average = 263.367 ms
latency stddev = 1712.181 ms
tps = 37.788541 (including connections establishing)
tps = 37.788898 (excluding connections establishing)
statement latencies in milliseconds:
0.002 \set suffix random(1,256)
263.433 select stat(:suffix, 12000, '5 min');

10分钟统计19800张表

transaction type: ./stat3.sql
scaling factor: 1
query mode: prepared
number of clients: 10
number of threads: 10
duration: 1200 s
number of transactions actually processed: 41290
latency average = 292.340 ms
latency stddev = 2389.384 ms
tps = 33.831941 (including connections establishing)
tps = 33.832121 (excluding connections establishing)
statement latencies in milliseconds:
0.002 \set suffix random(1,256)
292.436 select stat(:suffix, 24000, '10 min');

Both the writing and statistics have met the indicator of 6 million per minute.

Data Maintenance and Scheduling

1. Clean up details

The next partition is truncated at a specific time. For example, partition 1 is truncated at 0 minutes. Partition 2 is truncated at 10 minutes. Partition 0 is truncated at 50 minutes.

For example:

truncate mx1_1;

2. Clean up statistical data

The next partition is truncated at a specific time. For example, partition 01 is truncated at 00:00. Partition 02 is truncated at 01:00. Partition 00 is truncated at 23:00.

For example:

truncate agg1_1;

The truncation operation cleans the file directly, which is very fast, and the cleaned data does not generate a WAL log.

Summary

1. A 56 Core RDS PG 10 can satisfy the writing and statistics of 256 feed logs. (Each feed log table has 6 million write points per minute. That is, the write and statistical throughput of the entire library is about 1.5 billion points/minute.)

2. When cleaning up historical data, you can enable scheduling tasks to truncate partitions.

3. The function of “list” partition is used. Note that in the partition of PG 10, when an operation is performed on the primary table, the corresponding locks are applied to all the sub-tables, regardless of which sub-table you finally query, write, or update. As such, there will be conflicts between writing and truncating the sub-tables. Be sure to add LOCK_TIMEOUT to truncate the sub-table.

Later, a detailed description will be provided of the difference between the native partition and pg_pathman in lock granularity.

Lock granularity difference of partition tables — pg_pathman VS native partitioned table

4. PostgreSQL multiple arrays are aggregated into one-dimensional arrays (array_agg)

Reference:https://www.alibabacloud.com/blog/postgresql-app-massive-feed-log-real-time-quality-statistics_594810?spm=a2c41.12889682.0.0

Written by

Follow me to keep abreast with the latest technology news, industry insights, and developer trends.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store