Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Падает скорость обработки данных / 5 сообщений из 5, страница 1 из 1
15.01.2020, 09:16
    #39914095
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает скорость обработки данных
Приветствую!
Есть постгрес 9.6. Для прописания конф файла, по совету бывалых форума, использовал https://pgtune.leopard.in.ua/

В чем проблема: есть две таблички. В одну (input_table) пишутся данные (идет инсерт сразу несколько строк (батчем)).
Приложение забирает данные из нее, обрабатывает по одной и пишет (single insert) в другую (parsed_table).
Есть нюанс: если в какой-то момент в обработку попадает запись с флагом, то нужно найти все уже существующие записи по user_id в parsed_table, удалить их и сделать insert новых.

Если таблица пустая и в нее начинают литься данные, delete и insert происходят быстро (брал данные из pg_stat_statements) около 0.3 мс. Но со временем, когда общее число записей начинает превышает 500 тыс срок начинают проявляться рост времени обработки записей.

В какой-то момент было даже до 10 секунд.
В среднем, в таблицу инсертятся от 12 до 20 тыс записей в минуту.

Скрипт создания таблиц
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
create table input_table(
	id BIGINT PRIMARY KEY NOT NULL DEFAULT nextval('input_table_seq'),
	req_id VARCHAR(300) NOT NULL,
	m_id VARCHAR(300) NOT NULL,
	type VARCHAR(100) NOT NULL,
	user_id BIGINT NOT NULL,
	body TEXT NOT NULL,
	status SMALLINT NOT NULL,
	create_time TIMESTAMP NOT NULL,
	update_time TIMESTAMP NOT NULL
);

CREATE UNIQUE INDEX idx_uniq_requests_m_id on requests (m_id);


create table parsed_table(
	id BIGINT PRIMARY KEY NOT NULL DEFAULT nextval('parsed_table_seq'),
	m_id VARCHAR(500) NOT NULL,
	type SMALLINT,
	user_id BIGINT	NOT NULL CONSTRAINT fk_users_pt_uid REFERENCES users(id),
        send_id BIGINT	CONSTRAINT fk_users_pt_sid REFERENCES users(id),
	body TEXT,
	size INT,
	status SMALLINT NOT NULL,
	create_time TIMESTAMP NOT NULL,
	update_time TIMESTAMP NOT NULL
);

CREATE UNIQUE INDEX idx_uniq_m_id ON parsed_table(m_id);
CREATE INDEX idx_status 	 ON parsed_table(status);
CREATE INDEX idx_user_id	 ON parsed_table(user_id);
CREATE INDEX idx_user_id_send_id_status_type ON parsed_table(user_id, send_id, status, type);



DELETE:
Код: sql
1.
2.
DELETE FROM parsed_table
WHERE user_id = 10 AND send_id = 2 AND type = 2 AND status = 1



Настраивал автовакуум:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
#------------------------------------------------------------------------------
# AUTOVACUUM PARAMETERS
#------------------------------------------------------------------------------

autovacuum = on			# Enable autovacuum subprocess?  'on'
					# requires track_counts to also be on.
log_autovacuum_min_duration = 100	# -1 disables, 0 logs all actions and
					# their durations, > 0 logs only
					# actions running at least this number
					# of milliseconds.
autovacuum_max_workers = 3		# max number of autovacuum subprocesses
					# (change requires restart)
autovacuum_naptime = 20s		# time between autovacuum runs
autovacuum_vacuum_threshold = 50	# min number of row updates before
					# vacuum
autovacuum_analyze_threshold = 50	# min number of row updates before
					# analyze
autovacuum_vacuum_scale_factor = 0.2	# fraction of table size before vacuum
autovacuum_analyze_scale_factor = 0.1	# fraction of table size before analyze
autovacuum_freeze_max_age = 100000000	# maximum XID age before forced vacuum
					# (change requires restart)
#autovacuum_multixact_freeze_max_age = 400000000	# maximum multixact age
					# before forced vacuum
					# (change requires restart)
autovacuum_vacuum_cost_delay = 60ms	# default vacuum cost delay for
					# autovacuum, in milliseconds;
					# -1 means use vacuum_cost_delay
autovacuum_vacuum_cost_limit = -1	# default vacuum cost limit for
					# autovacuum, -1 means use
					# vacuum_cost_limit



Код: sql
1.
2.
По железу: 4 ядра, 16 гб оперативы. SSD диски.
На нем крутиться и БД, и приложение.



Нагрузка, я так понимаю, мизерная, что-то в настройках не так или в коде приложения, потому что по паралелльным запросам тоже наблюдаются тормоза, даже с тех таблиц, где мало записей.

Помогите советами!
Спасибо!
...
Рейтинг: 0 / 0
15.01.2020, 10:27
    #39914129
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает скорость обработки данных
авторautovacuum_vacuum_scale_factor = 0.2
autovacuum_vacuum_cost_delay = 60ms

Он вообще когда-нибудь завершается?
Дефолтные 20мс (до pg12) и то для калькуляторов, а уж ухудшать ещё втрое...
...
Рейтинг: 0 / 0
15.01.2020, 11:59
    #39914198
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает скорость обработки данных
Melkij, можете, пожалуйста, подсказать, какие настройки лучше поставить?
...
Рейтинг: 0 / 0
15.01.2020, 12:31
    #39914223
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает скорость обработки данных
qi_ip,

scale_factor на порядок вниз, cost_delay вплоть до нуля. Если SSD нормальные.
Ну и заменить очередь на что-нибудь подходящее. pgq если оставаться в базе.
...
Рейтинг: 0 / 0
15.01.2020, 12:38
    #39914230
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает скорость обработки данных
Melkij
qi_ip,

scale_factor на порядок вниз, cost_delay вплоть до нуля. Если SSD нормальные.
Ну и заменить очередь на что-нибудь подходящее. pgq если оставаться в базе.

На счет pgq так и не смог найти версию, чтобы потестить на винде (((( а быстро на linux переучиваться не получится. За совет спасибо! Попробую прописать настройки!
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Падает скорость обработки данных / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]