Производительность Postgres не увеличивается с увеличением количества ядер

Я тестировал postgres google-cloud-sql и загружал простую школьную схему

 CREATE TABLE school ( 
    id SERIAL NOT NULL PRIMARY KEY,
    name TEXT NOT NULL
);

CREATE TABLE class ( 
    id SERIAL NOT NULL PRIMARY KEY,
    name TEXT,
    school_id INTEGER NOT NULL REFERENCES school
);

CREATE TABLE student ( 
    id SERIAL NOT NULL PRIMARY KEY,
    name TEXT,
    class_id INTEGER NOT NULL REFERENCES class
);

-- ALL id and foreign keys have indexs

Загружено ~ 15 миллионов строк в общей сложности с 1500 школами, 500 классами на одну школу, 200 учениками на класс.

После этого создайте простой pgbench script

\setrandom sId1 1 20000000
\setrandom sId2 1 20000000
\setrandom sId3 1 20000000

select count(*) from school s 
join class c on s.id=c.school_id 
join student stu on c.id=stu.class_id where s.id=:sId1;

select count(*) from school s 
join class c on s.id=c.school_id 
join student stu on c.id=stu.class_id where s.id=:sId2;

select count(*) from school s 
join class c on s.id=c.school_id 
join student stu on c.id=stu.class_id where s.id=:sId3;

Теперь запустите script с помощью

pgbench -c 90 -f ./sql.sql  -n -t 1000

2 ядра, 7,5 ГБ, 90 клиентов -

OUTPUT:
number of transactions actually processed: 90000/90000
tps = 1519.690555 (including connections establishing)
tps = 2320.408683 (excluding connections establishing

26 ядер, 30 ГБ, 90 клиентов -

number of transactions actually processed: 90000/90000
tps = 1553.721286 (including connections establishing)
tps = 2405.664795 (excluding connections establishing)

Вопрос: Почему у нас есть только 80 тпс от 2 до 26 ядер?

Ответ 1

Я задал тот же вопрос о postgres irc.

Сообщество было уверено, что я максимизировал клиентский pgbench, они предложили использовать -j4 в pgbench и tps увеличен до 23k в секунду.

Ответ 2

Поскольку отдельный SELECT будет работать только в одном процессе, работающем на одном ядре. Что добавит дополнительные ядра, так это сделать несколько одновременных операций. Поэтому, если вы должны были бросить (скажем) 1000 одновременных запросов в базе данных, они будут выполняться быстрее на 26 ядрах, а не на 2 ядрах.