Почему процесс автовакуума занимает так много памяти и подменяет память? - PullRequest
2 голосов
/ 15 июня 2011

У нас есть база данных журналов продуктов, которая производит только вставки sql we Но мы обнаружили, что процесс автоочистки занимал так много памяти。 он занимает около 16 ГБ в пике, и это происходит примерно каждые 2 месяца。Кто-нибудь знает это?

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

--top detail 
top - 16:39:46 up 225 days,  1:12,  1 user,  load average: 1.29, 1.51, 1.52
Tasks: 341 total,   2 running, 339 sleeping,   0 stopped,   0 zombie
Cpu(s):  4.8%us,  5.3%sy,  0.0%ni, 85.5%id,  4.1%wa,  0.0%hi,  0.4%si,  0.0%st

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                
29267 postgres  14  -1 27.0g  16g 2928 S  1.0 72.2 199:59.74 postgres: autovacuum launcher process  

Из вышесказанного видно, что процесс автоочистки занимает около 16 ГБ;

--current sql
postgres=# select datname, current_query from pg_stat_activity where current_query !='<IDLE>';
 datname  |                                    current_query                                    
----------+-------------------------------------------------------------------------------------
 skytf   | autovacuum: VACUUM skytf.urs_user_log_201105 (to prevent wraparound)




--table size
 skytf=> \dt+ urs_user_log_201105
                          List of relations
 Schema |        Name         | Type  | Owner  | Size  | Description 
--------+---------------------+-------+--------+-------+-------------
 skytf | urs_user_log_201105 | table | skytf | 62 GB | 
(1 row)

--memory state
postgres@logdb-> free -m
             total       used       free     shared    buffers     cached
Mem:         24104      24028         75          0          4       5545
-/+ buffers/cache:      18479       5625
Swap:        16386       8824       7561

Ответы [ 2 ]

4 голосов
/ 30 июля 2012

Если вы посмотрите на это:

autovacuum: VACUUM skytf.urs_user_log_201105 (to prevent wraparound)

, это не обычный автовакуум.он работает, чтобы предотвратить обход транзакций.этот вид автоочистки должен работать до того, как идентификатор транзакции превысит два миллиарда.подробнее здесь: http://www.postgresql.org/docs/8.3/static/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND

Вы можете контролировать его поведение с помощью vacuum_freeze_min_age, vacuum_freeze_max_age.Вы не можете отключить этот тип autovacuum независимо от того, отключили вы autovacuum или нет.

1 голос
/ 15 июня 2011

имеет только операцию вставки и не имеет операций обновления, удаления, поэтому я думаю, что в таблице нет мертвых кортежей!

Если память не изменяет, автоочистка на самом деле будет делать две вещи:

  • вакуум
  • 1010 * анализ *

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

...