[pgsql-jp: 33492] Re: select文でセグメンテーション違反

Tatsuo Ishii t-ishii @ sra.co.jp
2004年 7月 4日 (日) 20:45:44 JST


石井です.

> 谷口@質問者です。
> 
> > > パラメータを論理的に調整してみる事からはじめませんか?
> > 一つずつ挑戦してみます。
> 色々と試してたところ、処理速度に変化は見られるものの
> ----------------------------------------------------------
> SELECT * FROM table_name ORDER BY key1,key2,key3,key4;
> server sent data ("D" message) without prior row description ("T" message)
> server sent data ("D" message) without prior row description ("T" message)
> ・・・延々と続きます
> セグメンテーション違反です
> 
>      以上の様にして終了します。SELECTの実行から約30分後です。
> ----------------------------------------------------------
> の状況は、変化がありませんでした。
> カーネルとPostgreSQLの両方の設定を全て初期状態に
> 戻してみましたが結果は同じでした。
> 
> ===============================
> <再度整理してみました>
> 大規模データ(100-200GB程度)のデータ分析に以下のサーバを
> スタンドアロンで使用するという単純な使用方法です。
> CPU: Xeon MP * 2CPU
> メモリ: 8GB
> OS: Red Hat Enterprise Linux ES Version 3
> PostgreSQL:Version 7.3.6
> ディスク:ext3(但し、raid5)で、700GB程度のユーザエリアで処理
> 
> ===============================
> 問題を簡単にする為に以下のテストを行いました。
> DROP TABLE test1m;
> CREATE TABLE test1m(
>     key1    char(5),
>     key2    char(5),
>     key3    char(5),
>     key4    char(5),
>     pad     char(80)
> );
> ランダムな数字を作成して、test1mに百万件登録し、
> 同様にテーブル名をtest50mにして5千万件登録しました。
> 実際のテーブルサイズは別とすると、
> test1mには、約100MByteのデータ容量になり
> test50mには、約5GByteのデータ容量になります。
> 
> psqlにより、以下の実験をしました。
> <test1mに対して>
> 1)SELECT * FROM test1m ORDER BY key1;
> 2)SELECT * FROM test1m ORDER BY key1 LIMIT 5;
> 3)SELECT * FROM test1m ORDER BY key1 OFFSET 999995;
> 4)SELECT * FROM test1m;
> 5)SELECT * FROM test1m LIMIT 5;
> 6)SELECT * FROM test1m OFFSET 999995;
> <test50mに対して>
> 7)SELECT * FROM test50m ORDER BY key1; <= ERROR *****
> 8)SELECT * FROM test50m ORDER BY key1 LIMIT 5;
> 9)SELECT * FROM test50m ORDER BY key1 OFFSET 999995;
> 10)SELECT * FROM test50m; <= ERROR *****
> 11)SELECT * FROM test50m LIMIT 5;
> 12)SELECT * FROM test50m OFFSET 49999995;
> 前述のエラーが出たのは、7)と10)でした。

psqlも同じホストで動かしているのですか?だったら7)とか10)がNGなのは当
然です.5GBのテーブルを全部psqlのメモリにコピーしようとしているんです
から.

たとえば,

SELECT count(*) FROM test50m ORDER BY key1;

とすればたぶんエラーにならないと思います.

あと,swapはどの位設定しているんですか?8GBのメモリを搭載しているのな
ら,その2倍の16GB以上は用意しないと,Linuxの場合仮想メモリを使い果たし
たときの動作が怪しくなると思います.

というわけで,アドバイスとしては,

o 処理中で使用しているメモリをきちんと計算
o 仮想メモリがその分用意されているかどうか考える

ということでしょうか.
--
Tatsuo Ishii



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