Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
12G база. Тюнинг БД. Медлиный SELECT + ORDER BY
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Первоначальные данные: OC - FreeBSD 6.1 /AMD 3200+/ 1G RAM/ SATA HDD. PostgreSQL 8.1 БД ~ 12G (40млн rows) postgresql.conf: max_connections = 180 shared_buffers = 4000 temp_buffers = 1000 work_mem = 850000 max_fsm_pages = 407000 fsync = off effective_cache_size = 102400 stats_start_collector = on stats_command_string = on stats_row_level = on sort_mem = 5024 (опции небыло. Добавил, БД приняла.) Возник следующий вопрос: Средний SELECT выполняеться достаточно быстро. Но если SELECT содержит ORDER BY то длиться он ~15 мин. Если UNION + ORDER + COUNT то все 10 часов. Больше всего меня поразили показатели нагрузок в момент такого запроса: IOSTAT ~ 2.00 MB/s (Вовремя REINDEX - 50MB/s) SWAP < 1Mb CPU Бездействие ~ 90% RAM Свободно ~ 40% Чего ему не хватает ? P.S. Ошибок в логах нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2006, 14:33 |
|
||
|
12G база. Тюнинг БД. Медлиный SELECT + ORDER BY
|
|||
|---|---|---|---|
|
#18+
Прежде всего нужно понгять сколько записей перемалывает постгрес для получения результата. Для этого посмотреть какие планы у запросов- потому как ордер бай по таблице с несколткими миллионами записей- приводит к предварительной сортировке этих даыннах - что на любом сервере затруднитеольно- о сем кстати и говорит вроде как бездействие системы - поскольку наверняка идет сортировак а данных на лискве( в памяти такой обьем не поместился) и все упирается в медленность дисковой подсистемы.. Можно также почитать про тонкую настройку постгреса- может увеличить некоторые области памяти. В общем смотреть можно в разные места- и решений твоей проблемы может быть много.Важно чтобы ты понял - где у тебя тонкое место. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2006, 10:17 |
|
||
|
12G база. Тюнинг БД. Медлиный SELECT + ORDER BY
|
|||
|---|---|---|---|
|
#18+
Я 2-е недели занимался тюнингом БД. крутил около 20 параметров. Дисковая подсистема НЕ нагружена. Я для этого показывал вывод iostat. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2006, 12:23 |
|
||
|
12G база. Тюнинг БД. Медлиный SELECT + ORDER BY
|
|||
|---|---|---|---|
|
#18+
тогда смотри в сторону запроса - сколько данных ему нужно перелопатить чтобы получить результат? таблицы то не малые ... order by - не по индексу? сортируются миллионы записей? у тебя shared_buffers = 4000 - под буффер страниц отдано 4000*8кб=32 мега- маловато для системы с гигом памяти... попробуй так: shared_buffers = 32768 -отдадим 256 мегов под буффер страниц sort_mem=10240 - 10 мегов на сортировку для каждого процесса кроме того set_config - позволяет изменять этот параметр для конкретного процесса - что дает возможность изменить обьем памяти выделенный под сортировку - если в этом процессе выполняется сложный запрос требующий много памяти на сортировку. поиграйся этими параметрами .. если же ты этим уже занимался - то дай результаты чтобы мы могли тут оценить влияние этих параметров на производительность на твоих данных.. иначе мы просто гадаем на кофейной гуще... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2006, 13:01 |
|
||
|
12G база. Тюнинг БД. Медлиный SELECT + ORDER BY
|
|||
|---|---|---|---|
|
#18+
и уменьши work_mem = 850000 - ты туда почти всю память запулил .. что по моему хреновато... дай гдето ну сажем 100 мегов.. work_mem = 100000 посмотри что измениться.. может даже уменьшить надо - ибо эта память выделяется для каждого процесса. опять таки может проще эту память изменять прямо из сессии перед выполнением запроса с большой сортировкой.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2006, 13:15 |
|
||
|
12G база. Тюнинг БД. Медлиный SELECT + ORDER BY
|
|||
|---|---|---|---|
|
#18+
А вобще мне кажется что дело в неоптимальных запросах... Настройки сервака - конечно может и могут изменить ситуацию - не не не в разы (IMHO) - а вот переосмысление запросов - может изменить ситуацию кардинально... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2006, 13:20 |
|
||
|
12G база. Тюнинг БД. Медлиный SELECT + ORDER BY
|
|||
|---|---|---|---|
|
#18+
автор IOSTAT ~ 2.00 MB/s Это не значит, что дисковая подсистема не нагружена. Очень как раз похоже на то, что план запроса содержит index scan, который и совершает беспорядочные чтения, прогружая всю дисковую подсистему. Без вывода vmstat во время запроса, описания таблицы, индексов и плана запроса здесь не обойтись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2006, 19:12 |
|
||
|
12G база. Тюнинг БД. Медлиный SELECT + ORDER BY
|
|||
|---|---|---|---|
|
#18+
ИМХО запросы не ускоришь настройками сервера Давай лучше сюда тяжёлые запросы и планы их выполнения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2006, 14:31 |
|
||
|
12G база. Тюнинг БД. Медлиный SELECT + ORDER BY
|
|||
|---|---|---|---|
|
#18+
Принял к сведению! Щас пытаюсь поправить, как только что - то появиться попытаюсь описать ? P.S. У кого то запрос ~[SELECT * FROM table ORDER BY column LIMIT 1000] отрабатывал на таких объемах меньше 5 минут ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2006, 23:34 |
|
||
|
12G база. Тюнинг БД. Медлиный SELECT + ORDER BY
|
|||
|---|---|---|---|
|
#18+
ORDER BY по неиндекированным данным размером несколько миллионов записей по лпределению не быстрая операция. особенно есмли запись широкая ( десяток полей различного длинного типа..)... Возможно поможет индекс - по сортируемым полям.. Панацеи не существует!! Нужно смотреть по конкретным метсданным и конкретной задаче - как ее можно ускорить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2006, 10:36 |
|
||
|
12G база. Тюнинг БД. Медлиный SELECT + ORDER BY
|
|||
|---|---|---|---|
|
#18+
Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2006, 10:42 |
|
||
|
12G база. Тюнинг БД. Медлиный SELECT + ORDER BY
|
|||
|---|---|---|---|
|
#18+
Roaming P.S. У кого то запрос ~[SELECT * FROM table ORDER BY column LIMIT 1000] отрабатывал на таких объемах меньше 5 минут ? Вот я одного не понимаю: а нафига в этом запросе "LIMIT 1000"? Почему не 1, и не 10000? LIMIT на время выполнения запроса в данном случае никак не влияет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2006, 11:03 |
|
||
|
12G база. Тюнинг БД. Медлиный SELECT + ORDER BY
|
|||
|---|---|---|---|
|
#18+
domanix у тебя shared_buffers = 4000 - под буффер страниц отдано 4000*8кб=32 мега- маловато для системы с гигом памяти... попробуй так: shared_buffers = 32768 -отдадим 256 мегов под буффер страниц sort_mem=10240 - 10 мегов на сортировку для каждого процесса кроме того set_config - позволяет изменять этот параметр для конкретного процесса - что дает возможность изменить обьем памяти выделенный под сортировку - если в этом процессе выполняется сложный запрос требующий много памяти на сортировку. поиграйся этими параметрами .. work_mem = 100000 sort_mem = 10240 shared_buffers =22937 Вроде добавилось 40-60% производительности. Но появился swap буду что - то урезать. Вот БОЛЬШОЙ статистический query Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2006, 11:24 |
|
||
|
12G база. Тюнинг БД. Медлиный SELECT + ORDER BY
|
|||
|---|---|---|---|
|
#18+
Kruchinin Pahan Вот я одного не понимаю: а нафига в этом запросе "LIMIT 1000"? Почему не 1, и не 10000? LIMIT на время выполнения запроса в данном случае никак не влияет. выше сказано - при наличии индекса по набору полей, используемом в ORDER BY будет использован индекс. А именно индекс скан +луп. если индекс содержит не слишком много удаленных значений, то просмотрено будет не многим больше значений индекса чем число возвращаемых записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2006, 12:04 |
|
||
|
12G база. Тюнинг БД. Медлиный SELECT + ORDER BY
|
|||
|---|---|---|---|
|
#18+
Во первых - этот запрос можно значительно упростить - если не делать ДВА прохода по таблицм как делается сейчас. Во вторых я чтото сильно сомневаюсь что обьединение таблиц p.ip LIKE serverdb.ip || '%' происходит по индексу-( даже если он есть). Т.е. на лицо все оснавания считать этот запрос самым не оптимальным из возможных - т.е. именно изза того как написан запрос - ты и получаешь значительные тормаза... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2006, 12:25 |
|
||
|
12G база. Тюнинг БД. Медлиный SELECT + ORDER BY
|
|||
|---|---|---|---|
|
#18+
Во-первых, что касается Roaming work_mem = 100000 sort_mem = 10240 shared_buffers =22937 прочтите следующее: Documentation SaysSpecifies the amount of memory to be used by internal sort operations and hash tables before switching to temporary disk files. The value is specified in kilobytes, and defaults to 1024 kilobytes (1 MB). Note that for a complex query, several sort or hash operations might be running in parallel; each one will be allowed to use as much memory as this value specifies before it starts to put data into temporary files. Also, several running sessions could be doing such operations concurrently. So the total memory used could be many times the value of work_mem; it is necessary to keep this fact in mind when choosing the value. Sort operations are used for ORDER BY, DISTINCT, and merge joins. Hash tables are used in hash joins, hashbased aggregation, and hashbased processing of IN subqueries. CommentsFormerly sort_mem, this setting name has been changed to reflect its expanded role in governing more than just sorts. Work_mem is a direct tradeoff. Adjust it upwards for: large databases, complex queries, lots of available RAM. Adjust it downwards for: low available RAM, or many concurrent users. Finding the right balance spot can be hard. Another way to set this value is to monitor the Postgres temp files (in PGDATA/base/DB_OID/pgsql_tmp) and adjust sort_mem upward if you see a lot of queries swapping from these temp files. Also keep in mind that this parameter can be adjusted per connection. So if you only have a few really large queries, you can increase the work_mem for them before query execution, and leave it low for the rest of the connections. Ваше sort_mem на самом деле либо игнорируется вообще, либо переустанавливает work_mem , что еще хуже. Уберите, а если интересует, то сделайте запрос, какое значение фактически используется. Во-вторых, ваши запросы из-за LIKE виполняются посл. сканированием. Замените двумя неравенствами, чтобы использовать индекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2006, 12:32 |
|
||
|
12G база. Тюнинг БД. Медлиный SELECT + ORDER BY
|
|||
|---|---|---|---|
|
#18+
IgorNK Ваше sort_mem на самом деле либо игнорируется вообще, либо переустанавливает work_mem , что еще хуже. Уберите, а если интересует, то сделайте запрос, какое значение фактически используется. Во-вторых, ваши запросы из-за LIKE виполняются посл. сканированием. Замените двумя неравенствами, чтобы использовать индекс. спасибо, поправил pgsql говорит : work_mem 100000 попробуем, как на производительности скажется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2006, 13:35 |
|
||
|
12G база. Тюнинг БД. Медлиный SELECT + ORDER BY
|
|||
|---|---|---|---|
|
#18+
Carrie автор IOSTAT ~ 2.00 MB/s Это не значит, что дисковая подсистема не нагружена. Очень как раз похоже на то, что план запроса содержит index scan, который и совершает беспорядочные чтения, прогружая всю дисковую подсистему. Без вывода vmstat во время запроса, описания таблицы, индексов и плана запроса здесь не обойтись. Отрабатывает 50 запросов ~ SELECT count(*) FROM tabler WHERE o='6101' AND n='1268' ~ SELECT id FROM server WHERE name='http://server.web.ru' ~ UPDATE tabl SET k=0.1 WHERE id='3805' vmstat расшифруйте (Если не сложно расшифруйте) iostat -w 5 tty ad4 ad5 cpu tin tout KB/t tps MB/s KB/t tps MB/s us ni sy in id 1 1000 20.16 154 3.03 0.68 0 0.00 24 0 10 3 64 0 775 19.85 147 2.85 0.00 0 0.00 17 0 7 1 75 0 933 18.80 152 2.79 0.00 0 0.00 31 0 9 1 59 0 845 22.36 148 3.23 0.00 0 0.00 44 0 9 3 44 0 1123 26.62 156 4.05 0.00 0 0.00 34 0 8 2 56 0 756 21.03 166 3.41 0.00 0 0.00 23 0 11 2 63 0 1072 23.50 155 3.55 0.00 0 0.00 30 0 10 2 59 0 569 25.30 169 4.18 0.00 0 0.00 42 0 9 2 47 Тут без изменений Одна из таблиц CREATE TABLE "tables" ( "t" int4 not null, "у" int4 not null, "w" float not null default 100, "validat" char(1) default 't' ) WITHOUT OIDS; ALTER TABLE ONLY "tables" ADD CONSTRAINT tables_pkey PRIMARY KEY (t,y); CREATE INDEX tables_t ON tables (t); CREATE INDEX tables_y ON tables (y); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2006, 13:55 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=33899069&tid=2006183]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
127ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 239ms |
| total: | 458ms |

| 0 / 0 |
