[pgsql-jp: 30275] ERROR: out of free buffers: time to abort !

Y.Watanabe yuw @ msj.biglobe.ne.jp
2003年 6月 30日 (月) 15:59:12 JST


ども。渡辺と申します。

PHP4.3.0, postgreSQL7.1.1 Apache1.3.27 Redhat6.2
という構成でWebサイトを組んでおります。

最近アクセス数が増えてきて、例によって23時ごろの高負荷
がかなりヤバイところまできてしまいました。

具体的には、ブラウザからの同時アクセスが増えてくると、
以下のようなログが出て、事実上アクセスできない
状態になることがあるようです。

高負荷のときのpostgreSQLのログの例:
  ※まともに動いている時間帯には何も出ない。

Jun 24 23:17:15 host postgres[13333]: [1-1] ERROR:  out of free buffers: time to abort !
Jun 24 23:17:30 host postgres[13394]: [1-1] ERROR:  out of free buffers: time to abort !
Jun 24 23:17:30 host postgres[13370]: [1-1] ERROR:  out of free buffers: time to abort !
Jun 24 23:18:52 host postgres[13363]: [1-1] ERROR:  out of free buffers: time to abort !
Jun 24 23:18:52 host postgres[13404]: [1-1] ERROR:  out of free buffers: time to abort !
Jun 24 23:19:07 host postgres[13361]: [1-1] ERROR:  out of free buffers: time to abort !
Jun 24 23:19:10 host postgres[13379]: [1-1] ERROR:  out of free buffers: time to abort !
Jun 24 23:19:10 host postgres[13356]: [1-1] ERROR:  out of free buffers: time to abort !
Jun 24 23:19:10 host postgres[13430]: [1-1] ERROR:  out of free buffers: time to abort !
Jun 24 23:20:02 host postgres[13442]: [1-1] ERROR:  out of free buffers: time to abort !
Jun 24 23:20:02 host postgres[13455]: [1-1] FATAL 1:  out of free buffers: time to abort !
Jun 24 23:20:02 host postgres[13348]: [1-1] ERROR:  out of free buffers: time to abort !
Jun 24 23:20:02 host postgres[13400]: [1-1] ERROR:  out of free buffers: time to abort !
Jun 24 23:20:02 host postgres[13383]: [1-1] ERROR:  out of free buffers: time to abort !


高負荷のときのtopコマンドの例(抜粋です): 
   ※低負荷時にはDB接続もhttpdも一つか二つずつくらいしかない。
   ※Apacheのmaxcliantsは8に絞ってるのに
     なんでこんなにDB接続が増えちゃうんだろ?・・・。

  PID USER     PRI  NI  SIZE  RSS SHARE STAT  LIB %CPU %MEM   TIME COMMAND
13445 postgres  12   0  2888 2852  1900 R       0  7.0  4.4   0:16 postgres: user01 db01
13451 postgres  12   0  2888 2852  1904 R       0  7.0  4.4   0:16 postgres: user01 db01
13496 postgres  12   0  2924 2888  1920 R       0  6.2  4.5   0:11 postgres: user01 db01
13550 postgres  13   0  2468 2432  1812 R       0  6.2  3.8   0:03 postgres: user01 db01
13554 postgres  12   0  2832 2796  1900 R       0  6.2  4.3   0:02 postgres: user01 db01
13486 postgres  12   0  2928 2892  1920 R       0  5.5  4.5   0:12 postgres: user01 db01
13487 postgres  12   0  2908 2876  1928 R       0  5.5  4.4   0:12 postgres: user01 db01
13495 postgres  12   0  2920 2884  1920 R       0  5.5  4.5   0:12 postgres: user01 db01
13508 postgres  12   0  2868 2832  1904 R       0  5.5  4.4   0:09 postgres: user01 db01
13503 postgres  12   0  2916 2880  1920 R       0  4.7  4.5   0:09 postgres: user01 db01
13509 postgres  12   0  2872 2836  1904 R       0  4.7  4.4   0:09 postgres: user01 db01
13522 postgres  12   0  2892 2856  1916 R       0  4.7  4.4   0:06 postgres: user01 db01
13575 postgres   8   0  2472 2436  1780 R       0  4.7  3.8   0:00 postgres: user01 db01
13450 postgres  11   0  2964 2928  1944 R       0  3.9  4.5   0:15 postgres: user01 db01
13534 postgres  12   0  2892 2856  1920 R       0  3.9  4.4   0:04 postgres: user01 db01
13468 postgres  10   0  2880 2844  1900 R       0  3.1  4.4   0:13 postgres: user01 db01
13458 postgres  11   0  2888 2852  1904 R       0  2.3  4.4   0:15 postgres: user01 db01
13551 postgres  10   0  2492 2456  1820 R       0  2.3  3.8   0:01 postgres: user01 db01
    4 root       3   0     0    0     0 SW      0  1.5  0.0  31:03 kswapd
32578 root       5   0  1012  256   212 S       0  1.5  0.4   0:05 /usr/local/apache/bin/httpd
13546 postgres  10   0  2764 2744  1972 R       0  1.5  4.2   0:02 postgres: user01 db01
13547 postgres   9   0  2764 2748  1968 D       0  1.5  4.2   0:02 postgres: user01 db01
32574 postgres   1   0   448  336   256 S       0  0.0  0.5   0:09 /usr/local/pgsql/bin/postmas
13511 nobody     0   0  1660 1024   900 S       0  0.0  1.6   0:00 /usr/local/apache/bin/httpd
13521 nobody     0   0  3024 2808  2036 S       0  0.0  4.3   0:00 /usr/local/apache/bin/httpd
13539 nobody     0   0  1876 1320  1172 S       0  0.0  2.0   0:00 /usr/local/apache/bin/httpd
13552 nobody     0   0  1660 1024   900 S       0  0.0  1.6   0:00 /usr/local/apache/bin/httpd
13564 nobody     2   0  3040 2832  2076 S       0  0.0  4.4   0:00 /usr/local/apache/bin/httpd
13565 nobody     0   0  1660 1024   912 S       0  0.0  1.6   0:00 /usr/local/apache/bin/httpd
13576 nobody     3   0  1660 1024   920 S       0  0.0  1.6   0:00 /usr/local/apache/bin/httpd
13577 nobody     4   0  1660 1024   920 S       0  0.0  1.6   0:00 /usr/local/apache/bin/httpd

httpd.confは以下のとおり。(抜粋)

  Timeout 60
  KeepAlive On
  MaxKeepAliveRequests 50
  KeepAliveTimeout 3
  MinSpareServers 5
  MaxSpareServers 5
  StartServers 5
  MaxClients 8
  MaxRequestsPerChild 100

postgresql.confはほとんどデフォルトのまま
(=ほとんどコメントアウトされたまま)です。以下抜粋。

#log_connections = on
#fsync = off
#max_connections = 64

#max_connections = 32 # 1-1024

#sort_mem = 512
#shared_buffers = 2*max_connections # min 16
#fsync = true

silent_mode = on
syslog = 2 # range 0-2
syslog_facility = 'LOCAL2'


PostgreSQL自体が古い(7.1.1)のでバージョンアップも考えたのですが、
実運用にはいってるのですぐにはむずかしい状況です。

個人的には、postgresql.confをに何らかの適切な値をちゃんと
設定すべきかなとは思っているのですが、
ちょっとno ideaです。
「いいチューニング方法がここに載ってるよ」
というポインタだけでも結構ですのでアドバイス求むです。

# 石井さんのpg_poolが真剣に欲しくなってきた・・・







pgsql-jp メーリングリストの案内