powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите с настройками пожалуйста. 64 Гб рамы и тормозит.
14 сообщений из 14, страница 1 из 1
Помогите с настройками пожалуйста. 64 Гб рамы и тормозит.
    #39227933
balak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытаюсь заставить работать постгре без тормозов.
Индексы на всех полях, по которым делается поиск.
Сценарий: таблица с >2 млн. записей, в которую вставляется примерно 300-500 тыс. строк в сутки, в 60 потоков.
Бинарных данных нет, есть json и служебная инфа, есть ещё несколько небольших таблиц (10-100 записей) в которых эти же потоки постоянно обновляют статус операций и счётчики (select/update).

Что я хочу понять:
1. Почему тормозит. Чухом нюю, что можно быстрее, но может я не прав?
2. Может быть можно как-то оптимизировать запрос? Ускорят ли процесс вьюхи?

Версия 9.5.2, в системе 64 Гб ОЗУ, linux 64бит ядро 4.5.1.

Вот такой запрос может занимать до минуты (это статистика, дёргаю раз в пять минут):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT 
      ( SELECT count(*) from bot.acquires WHERE ( status = 'stored' OR status = 'on_fs' ) AND curl_exitstatus = 0 ) AS images_ok,
      ( SELECT count(*) from bot.acquires WHERE (status = 'badurl' OR status = 'lost' OR ( pic_file_size IS NOT NULL AND pic_file_size < 20))) AS images_404,  
      ( SELECT count(*) FROM bot.acquires WHERE status IS NULL OR status = 'new' ) AS images_waiting,
      ( SELECT count(*) FROM bot.acquires WHERE updated_at > (now() AT TIME ZONE 'UTC') - interval '1 hour') AS lasthour,
      ( SELECT count(*) FROM bot.acquires WHERE updated_at > (now() AT TIME ZONE 'UTC') - interval '1 hour' AND status = 'badurl') AS bad_lasthour,
      ( SELECT count(*) FROM bot.acquires WHERE updated_at > (now() AT TIME ZONE 'UTC') - interval '24 hour') AS lastday,
      ( SELECT count(*) FROM bot.acquires WHERE updated_at > (now() AT TIME ZONE 'UTC') - interval '24 hour' AND status = 'badurl') AS bad_lastday,
      ( SELECT sum((pagestats->>'dup_counter')::integer) FROM bot.packages ) AS duplicates
      LIMIT 1



Вот настройки постгре:
Код: plaintext
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
data_directory = '/work/postgres/data-9.5'
external_pid_file = '/var/lib/postgres/data/postmaster.pid'     # write an extra PID file
listen_addresses = 'localhost'    # what IP address(es) to listen on;
port = 5432       # (change requires restart)
max_connections = 200     # (change requires restart)
superuser_reserved_connections = 3  # (change requires restart)
unix_socket_directories = '/run/postgresql' # comma-separated list of directories
tcp_keepalives_idle = 30    # TCP_KEEPIDLE, in seconds;
shared_buffers = 1GB     # min 128kB
huge_pages = try      # on, off, or try
temp_buffers = 16MB      # min 800kB
max_prepared_transactions = 5   # zero disables the feature
work_mem = 8MB        # min 64kB
maintenance_work_mem = 64MB   # min 1MB
autovacuum_work_mem = -1    # min 1MB, or -1 to use maintenance_work_mem
dynamic_shared_memory_type = posix  # the default is the first option
vacuum_cost_delay = 75      # 0-100 milliseconds
effective_io_concurrency = 1    # 1-1000; 0 disables prefetching
max_worker_processes = 40
wal_level = minimal     # minimal, archive, hot_standby, or logical
full_page_writes = on      # recover from partial page writes
wal_compression = on      # enable compression of full-page writes
wal_buffers = -1     # min 32kB, -1 sets based on shared_buffers
commit_delay = 100     # range 0-100000, in microseconds
commit_siblings = 5      # range 1-1000
checkpoint_timeout = 15min    # range 30s-1h
max_wal_size = 1GB
min_wal_size = 80MB
checkpoint_completion_target = 0.75 # checkpoint target duration, 0.0 - 1.0
checkpoint_warning = 1min   # 0 disables
log_timezone = 'W-SU'
track_counts = on
stats_temp_directory = '/run/postgresql/stats'
autovacuum = on      # Enable autovacuum subprocess?  'on'
log_autovacuum_min_duration = 1000
autovacuum_max_workers = 10
autovacuum_naptime = 10min
autovacuum_vacuum_threshold = 50
autovacuum_analyze_threshold = 50
autovacuum_vacuum_scale_factor = 0.2
autovacuum_analyze_scale_factor = 0.1  # fraction of table size before analyze
datestyle = 'iso, dmy'
timezone = 'W-SU'
lc_messages = 'ru_RU.UTF-8'     # locale for system error message
lc_monetary = 'ru_RU.UTF-8'     # locale for monetary formatting
lc_numeric = 'ru_RU.UTF-8'      # locale for number formatting
lc_time = 'ru_RU.UTF-8'       # locale for time formatting
default_text_search_config = 'pg_catalog.russian'


И вот схема базы - сделал дамп, почистил руками.
Код: 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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
CREATE SCHEMA bot;

SET search_path = bot, pg_catalog;
SET default_tablespace = '';
SET default_with_oids = false;

CREATE TABLE bindata (
    id integer NOT NULL,
    created_at timestamp without time zone DEFAULT now() NOT NULL,
    image_id bigint,
    image_bin bytea,
    status character varying(32) DEFAULT 'new'::character varying NOT NULL
);
CREATE SEQUENCE bindata_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;

CREATE TABLE acquires (
    id integer NOT NULL,
    created_at timestamp without time zone DEFAULT now() NOT NULL,
    updated_at timestamp without time zone DEFAULT now() NOT NULL,
    url character varying,
    icode character varying(127),
    iid bigint,
    owner_id bigint,
    status character varying(32) DEFAULT 'new'::character varying NOT NULL,
    image_data jsonb DEFAULT '{}'::jsonb NOT NULL,
    curl_stderr text,
    curl_exitstatus smallint,
    page_id integer NOT NULL,
    pic_file_name character varying,
    pic_path character varying,
    pic_content_type character varying,
    pic_file_size integer,
    pic_updated_at timestamp without time zone,
    pic_fingerprint character varying,
    pic_processing boolean DEFAULT false NOT NULL,
    bot_id integer
);
CREATE SEQUENCE acquires_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;

CREATE TABLE service_names (
    id integer NOT NULL,
    created_at timestamp without time zone DEFAULT now() NOT NULL,
    orig_id bigint NOT NULL,
    name character varying
);
CREATE SEQUENCE service_names_id_seq START WITH 1  INCREMENT BY 1  NO MINVALUE  NO MAXVALUE CACHE 1;

CREATE TABLE packages (
    id integer NOT NULL,
    created_at timestamp without time zone DEFAULT now() NOT NULL,
    updated_at timestamp without time zone DEFAULT now() NOT NULL,
    tag character varying NOT NULL,
    cookie text,
    nextid character varying,
    status character varying(32) DEFAULT 'new'::character varying NOT NULL,
    counter bigint DEFAULT 0 NOT NULL,
    page_data jsonb,
    bot_id integer,
    curlog text,
    curlretval smallint,
    pagetats jsonb
);
CREATE SEQUENCE packages_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;

CREATE TABLE robots (
    id integer NOT NULL,
    created_at timestamp without time zone DEFAULT now() NOT NULL,
    updated_at timestamp without time zone DEFAULT now() NOT NULL,
    bot_id character varying(256) NOT NULL,
    descr text,
    status character varying(32) DEFAULT 'new'::character varying NOT NULL,
    hostname character varying(127) NOT NULL,
    username character varying(64) NOT NULL,
    port integer NOT NULL,
    job public.robot_job_type,
    syslog text,
    proxyport integer,
    process_id integer
);
CREATE SEQUENCE robots_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;

ALTER TABLE ONLY bindata ALTER COLUMN id SET DEFAULT nextval('bindata_id_seq'::regclass);
ALTER TABLE ONLY acquires ALTER COLUMN id SET DEFAULT nextval('acquires_id_seq'::regclass);
ALTER TABLE ONLY service_names ALTER COLUMN id SET DEFAULT nextval('service_names_id_seq'::regclass);
ALTER TABLE ONLY packages ALTER COLUMN id SET DEFAULT nextval('packages_id_seq'::regclass);
ALTER TABLE ONLY robots ALTER COLUMN id SET DEFAULT nextval('robots_id_seq'::regclass);
ALTER TABLE ONLY bindata ADD CONSTRAINT bindata_pkey PRIMARY KEY (id);
ALTER TABLE ONLY acquires ADD CONSTRAINT acquires_pkey PRIMARY KEY (id);
ALTER TABLE ONLY service_names ADD CONSTRAINT service_names_pkey PRIMARY KEY (id);
ALTER TABLE ONLY packages ADD CONSTRAINT packages_pkey PRIMARY KEY (id);
ALTER TABLE ONLY robots ADD CONSTRAINT robots_pkey PRIMARY KEY (id);
ALTER TABLE ONLY robots ADD CONSTRAINT robots_proxyport_key UNIQUE (proxyport);
CREATE INDEX image_bot_id_idx ON acquires USING btree (bot_id);
CREATE INDEX image_created_idx ON acquires USING btree (created_at);
CREATE INDEX image_updated_idx ON acquires USING btree (updated_at);
CREATE INDEX bot_curl_idx ON acquires USING btree (curl_exitstatus);
CREATE INDEX bot_imagebin_status_idx ON bindata USING btree (status);
CREATE INDEX bot_imagefk_idx ON bindata USING btree (image_id);
CREATE UNIQUE INDEX bot_imageid_idx ON acquires USING btree (icode, iid);
CREATE INDEX bot_imageurl_idx ON acquires USING btree (url);
CREATE UNIQUE INDEX bot_instagram_id_idx ON service_names USING btree (orig_id);
CREATE INDEX bot_page_status_idx ON packages USING btree (status);
CREATE INDEX bot_people_name_idx ON service_names USING btree (name);
CREATE INDEX bot_picfile_idx ON acquires USING btree (pic_file_name, pic_path);
CREATE INDEX bot_pichash_idx ON acquires USING btree (pic_fingerprint);
CREATE UNIQUE INDEX bot_robot_id_idx ON robots USING btree (bot_id);
CREATE INDEX bot_robot_job_idx ON robots USING btree (job);
CREATE INDEX bot_robot_status_idx ON robots USING btree (status);
CREATE INDEX page_bot_id_idx ON packages USING btree (bot_id);
CREATE INDEX packages_curl_status_idx ON packages USING btree (curlretval);
CREATE INDEX packages_lastpage_idx ON packages USING gin (packagestats);
CREATE INDEX process_id_idx ON robots USING btree (process_id);
ALTER TABLE ONLY bindata ADD CONSTRAINT bindata_image_id_fkey FOREIGN KEY (image_id) REFERENCES acquires(id) ON DELETE CASCADE;
ALTER TABLE ONLY acquires ADD CONSTRAINT acquires_bot_id_fkey FOREIGN KEY (bot_id) REFERENCES robots(id) ON DELETE RESTRICT;
ALTER TABLE ONLY acquires ADD CONSTRAINT acquires_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES service_names(orig_id) ON DELETE CASCADE; 
ALTER TABLE ONLY acquires ADD CONSTRAINT acquires_page_id_fkey FOREIGN KEY (page_id) REFERENCES packages(id) ON DELETE RESTRICT;
ALTER TABLE ONLY packages ADD CONSTRAINT packages_bot_id_fkey FOREIGN KEY (bot_id) REFERENCES robots(id) ON DELETE RESTRICT;

...
Рейтинг: 0 / 0
Помогите с настройками пожалуйста. 64 Гб рамы и тормозит.
    #39227962
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
balak,

1)Сначала вам нужен графический мониторинг чтобы понять где и чего вам не хватает (дисков? памяти? cpu? сети?)

2)с конкретным проблемным запросом вам надо сделать explain (analyze, costs, buffers, timing) ... и прислать результаты чтобы вам что то подсказали.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Помогите с настройками пожалуйста. 64 Гб рамы и тормозит.
    #39228026
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
balak
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT 
      ( SELECT count(*) from bot.acquires WHERE ( status = 'stored' OR status = 'on_fs' ) AND curl_exitstatus = 0 ) AS images_ok,
      ( SELECT count(*) from bot.acquires WHERE (status = 'badurl' OR status = 'lost' OR ( pic_file_size IS NOT NULL AND pic_file_size < 20))) AS images_404,  
      ( SELECT count(*) FROM bot.acquires WHERE status IS NULL OR status = 'new' ) AS images_waiting,
      ( SELECT count(*) FROM bot.acquires WHERE updated_at > (now() AT TIME ZONE 'UTC') - interval '1 hour') AS lasthour,
      ( SELECT count(*) FROM bot.acquires WHERE updated_at > (now() AT TIME ZONE 'UTC') - interval '1 hour' AND status = 'badurl') AS bad_lasthour,
      ( SELECT count(*) FROM bot.acquires WHERE updated_at > (now() AT TIME ZONE 'UTC') - interval '24 hour') AS lastday,
      ( SELECT count(*) FROM bot.acquires WHERE updated_at > (now() AT TIME ZONE 'UTC') - interval '24 hour' AND status = 'badurl') AS bad_lastday,
      ( SELECT sum((pagestats->>'dup_counter')::integer) FROM bot.packages ) AS duplicates
      LIMIT 1

Ну зачем же 7 раз устраивать сканирование по одной и той же таблице? Можно же это делать за один проход, считая поля через CASE.
...
Рейтинг: 0 / 0
Помогите с настройками пожалуйста. 64 Гб рамы и тормозит.
    #39228103
balak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ChA,

Большое спасибо, я не знал про CASE
После получаса перебора различных комбинаций получилось:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT
	SUM( CASE WHEN (status = 'stored' OR status = 'on_fs') AND curl_exitstatus = 0 THEN 1 ELSE 0 END ) AS images_ok,
	SUM( CASE WHEN (status = 'badurl' OR status = 'lost' OR ( pic_file_size IS NOT NULL AND pic_file_size < 20)) THEN 1 ELSE 0 END ) AS images_404,
	SUM( CASE WHEN status IS NULL OR status = 'new' THEN 1 ELSE 0 END ) AS images_waiting,
	SUM( CASE WHEN updated_at > (now() AT TIME ZONE 'UTC') - interval '1 hour' THEN 1 ELSE 0 END ) AS lasthour,
	SUM( CASE WHEN updated_at > (now() AT TIME ZONE 'UTC') - interval '1 hour' AND status = 'badurl' THEN 1 ELSE 0 END ) AS bad_lasthour,
	SUM( CASE WHEN updated_at > (now() AT TIME ZONE 'UTC') - interval '24 hour' THEN 1 ELSE 0 END ) AS lastday,
	SUM( CASE WHEN updated_at > (now() AT TIME ZONE 'UTC') - interval '24 hour' AND status = 'badurl' THEN 1 ELSE 0 END ) AS bad_lastday
	FROM bot.acquires;


8.258155116 сек

Слегка коробит от прямого перебора 1 или 0, но никак не придумал как воткнуть count().
Код: sql
1.
SELECT ( CASE WHEN (status = 'stored' OR status = 'on_fs') AND curl_exitstatus = 0 THEN count(status) ELSE 0 END ) AS images_ok FROM bot.acquires


Код: plaintext
PG::GroupingError: ОШИБКА:  столбец "acquires.status" должен фигурировать в предложении GROUP BY или использоваться в агрегатной функции
Но выражения все разные, и зависят не только от status.
...
Рейтинг: 0 / 0
Помогите с настройками пожалуйста. 64 Гб рамы и тормозит.
    #39228112
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
balak,

Подстроку "ELSE 0 " можно смело удалять, суммируются только не-NULL значения. Вместо SUM можно было написать COUNT, COUNT(выражение), опять же, считает количество не-NULL значений. Впрочем, это по смыслу практически не отличается от суммирования единиц, так что это чисто на ваше усмотрение.
...
Рейтинг: 0 / 0
Помогите с настройками пожалуйста. 64 Гб рамы и тормозит.
    #39228260
Rhim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
balakСлегка коробит от прямого перебора 1 или 0, но никак не придумал как воткнуть count().


Посмотрите в сторону 4.2. Value Expressions раздел - 4.2.7. Aggregate Expressions

aggregate_name ( * ) [ FILTER ( WHERE filter_clause ) ]


Но я в вашем случае прислушался бы к совету Максима.
...
Рейтинг: 0 / 0
Помогите с настройками пожалуйста. 64 Гб рамы и тормозит.
    #39228431
balak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Rhim, спасибо за подсказку. Посмотрю на агрегатные функции.

Я понимаю, что Максим, по большому счёту, прав. Но если бы я знал что запускать и куда смотреть, я бы здесь не спрашивал (=
Кроме того - времени на процесс изучения у меня немного, вот трачу по часу в день пытаясь что-то понять.

Пока что мне удалось ещё в два раза ускорить запросы и сильно повысить отзывчивость постгреса. Я обнаружил, что (ruby) гемы pg и activerecord, которыми я пользуюсь в разных скриптах - все ходят через tcp 127.0.0.1. Срочно перевёл все подключения на pipe.
Вот данные по нагрузке и отчёт из pgadmin прикреплён, но что на самом деле означают многие из тамошних цифр я не понимаю.

Заодно в чётвертый раз переписал настройки.

$ iostat -c -d
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Linux 4.5.1-1-ARCH () 	02.05.2016 	_x86_64_	(12 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          15,71    0,00    1,38   13,25    0,00   69,67

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sdb             137,14      1368,36      2806,72 1078084001 2211326579
sda              13,79        10,17       243,10    8010208  191530228
sdc              51,82        27,29      1048,75   21502618  826275401
dm-0           1015,03      1395,59      3855,47 1099539544 3037601716


postgresql.conf
Код: plaintext
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
grep -Ev '^\s*#|^\s*$' /etc/postgresql/9.5/postgresql.conf
data_directory = '/media/work/postgres/data-9.5'
external_pid_file = '/var/lib/postgres/data/postmaster.pid'     # write an extra PID file
listen_addresses = 'localhost'    # what IP address(es) to listen on;
port = 5432       # (change requires restart)
max_connections = 400     # (change requires restart)
superuser_reserved_connections = 3  # (change requires restart)
unix_socket_directories = '/run/postgresql' # comma-separated list of directories
tcp_keepalives_idle = 30    # TCP_KEEPIDLE, in seconds;
shared_buffers = 16GB     # min 128kB
huge_pages = try      # on, off, or try
temp_buffers = 8MB      # min 800kB
max_prepared_transactions = 5   # zero disables the feature
work_mem = 32MB        # min 64kB
maintenance_work_mem = 2GB   # min 1MB
autovacuum_work_mem = -1    # min 1MB, or -1 to use maintenance_work_mem
dynamic_shared_memory_type = posix  # the default is the first option
vacuum_cost_delay = 10      # 0-100 milliseconds
vacuum_cost_page_miss = 10   # 0-10000 credits
vacuum_cost_limit = 200    # 1-10000 credits
bgwriter_delay = 512ms     # 10-10000ms between rounds
effective_io_concurrency = 5    # 1-1000; 0 disables prefetching
max_worker_processes = 100
wal_level = minimal     # minimal, archive, hot_standby, or logical
fsync = on       # turns forced synchronization on or off
full_page_writes = on      # recover from partial page writes
wal_compression = on      # enable compression of full-page writes
wal_buffers = 16MB     # min 32kB, -1 sets based on shared_buffers
commit_delay = 250     # range 0-100000, in microseconds
commit_siblings = 5      # range 1-1000
checkpoint_timeout = 15min    # range 30s-1h
max_wal_size = 8GB
min_wal_size = 2GB
checkpoint_completion_target = 0.8 # checkpoint target duration, 0.0 - 1.0
checkpoint_warning = 1min   # 0 disables
random_page_cost = 4.0     # same scale as above
effective_cache_size = 32GB
default_statistics_target = 500  # range 1-10000
log_timezone = 'W-SU'
track_counts = on
stats_temp_directory = '/run/postgresql/stats'
autovacuum = on      # Enable autovacuum subprocess?  'on'
log_autovacuum_min_duration = 1000
autovacuum_max_workers = 100
autovacuum_naptime = 10min
autovacuum_vacuum_threshold = 50
autovacuum_analyze_threshold = 50
autovacuum_vacuum_scale_factor = 0.2
autovacuum_analyze_scale_factor = 0.1  # fraction of table size before analyze
datestyle = 'iso, dmy'
timezone = 'W-SU'
lc_messages = 'ru_RU.UTF-8'     # locale for system error message
lc_monetary = 'ru_RU.UTF-8'     # locale for monetary formatting
lc_numeric = 'ru_RU.UTF-8'      # locale for number formatting
lc_time = 'ru_RU.UTF-8'       # locale for time formatting
default_text_search_config = 'pg_catalog.russian'
...
Рейтинг: 0 / 0
Помогите с настройками пожалуйста. 64 Гб рамы и тормозит.
    #39228436
balak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На всякий случай, для тех, кто после меня.
Подключение ruby pg activerecord на локальный сокет postgresql, вместо tcp/ip 127.0.0.1

Для того, чтобы подключение было на pipe - в парметрах как PG.connect так и ActiveRecord.establish_connection надо удалить (или не указать) параметры:
Код: ruby
1.
:connect_timeout, :read_timeout, :write_timeout, :host, :port


Причем если речь идёт о автоподключении ActiveRecord с настройками из RAILS_ENV, то эти ключи надо удалить из config/database.yml
Либо отдавать параметры насильно -
Код: ruby
1.
2.
3.
cfgdb ||= YAML.read_file('config/database.yml')
[:connect_timeout, :read_timeout, :write_timeout, :host,:port].each{|k| cfgdb.delete k }
 ActiveRecord::Base.establish_connection(cfgdb)


Я проверял результат так:
Код: plaintext
bundle exec pry -r ./файл-со-скриптом.rb
> И в консоли любой запрос, например
Код: ruby
1.
rv = pgconn.exec("SELECT * FROM #{ table } LIMIT 1").first


затем смотрю в pgadmin /браузер объектов/подключение, справа во вкладке "Статистика" отображается этот запрос и в колонке "Клиент" - "локальный pipe".
...
Рейтинг: 0 / 0
Помогите с настройками пожалуйста. 64 Гб рамы и тормозит.
    #39228459
Rhim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вначале вашего проблемного запроса добавьте explain (analyze, costs, buffers, timing) пример:

explain (analyze, costs, buffers, timing) ваш_запрос;

Покажите результат запроса.

Про EXPLAIN можно почитать цикл статей EXPLAINING THE UNEXPLAINABLE и перевод цикла Объясняя необъяснимое
...
Рейтинг: 0 / 0
Помогите с настройками пожалуйста. 64 Гб рамы и тормозит.
    #39228466
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shared_buffers = 1GB

автор64 Гб рамы
Не ясно, сколько занимают данные, но если сервер выделенный, то не соответствует 100%.
...
Рейтинг: 0 / 0
Помогите с настройками пожалуйста. 64 Гб рамы и тормозит.
    #39231266
balak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Локшин Марк,

shared_buffers = 1GB - случайно удалил, там было 16GB. Сейчас уже выставил 24GB.

Нашли первое узкое место - lvm + reiserfs на 5,7Tb томе давали удивительно низкую производительность, не больше 12Мб/сек, а в среднем - 1-2Мб/сек. Сейчас убил LVM и форматнул физические винты на xfs каждый свои разделом. (На второй сыпятся данные кроме базы в большом объёме), в итоге скорость iotop показывает 100-200 Мб/сек.

Я долго добивался от всех окружающих любых суждений о reiserfs 3, но ничего кроме "старьё" не услышал и не нашёл.
Итог: reiserfs нельзя использовать потому что на большом диске он показал ужасающе низкую производительность на всех файлах, кроме больших (больше ~100 Мб). Да, и он не поддерживает trim на SSD, но это был не наш случай.

Вот теперь время eхplain делать :)
...
Рейтинг: 0 / 0
Помогите с настройками пожалуйста. 64 Гб рамы и тормозит.
    #39231291
Фотография zzdima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
помощь нужна
я можеет прйёл не туда
ПО Secoros работает на основе постгреса
ну вот пять камер категоричесски не хотят подключатся
что делоть
помогите!11
...
Рейтинг: 0 / 0
Помогите с настройками пожалуйста. 64 Гб рамы и тормозит.
    #39231292
Фотография zzdima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и главные суки мельккнкли
ну может там что есть про у постгреса про реиндедекс
ну дайте инфу, умоляю
...
Рейтинг: 0 / 0
Помогите с настройками пожалуйста. 64 Гб рамы и тормозит.
    #39231294
Фотография zzdima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тех помощь ну только 10-го
что делоть?
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите с настройками пожалуйста. 64 Гб рамы и тормозит.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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