Symfoware

Symfowareについての考察blog

FreeBSD 10.1にpgbouncerをインストールする

PostgreSQLのコネクションをプールしてくれる「pgbouncer」があることを知ったので試してみます。
https://github.com/pgbouncer/pgbouncer



pgbouncerのインストール



pkg installであっさりインストール出来ました。


# pkg install pgbouncer



pgbouncerというユーザーが自動的に作成されます。

/etc/rc.confを編集。


# vi /etc/rc.conf



「pgbouncer_enable="YES"」を追記し、起動を許可します。


pgbouncer_enable="YES"







設定



pgbouncer(5)
こちらを参考に設定ファイルを作成します。


# vi /usr/local/etc/pgbouncer.ini




試行錯誤しながら変更した箇所の抜粋です。


[databases]
* = host=localhost port=5432 user=pgadmin password=P@ssw0rd

[pgbouncer]
listen_addr = *
listen_port = 6432
auth_file = /usr/local/etc/pgbouncer.users




ユーザー名の追加を行います。


# vi /usr/local/etc/pgbouncer.users




適当に1行追加。
ここで指定したユーザー名、パスワードを接続時に使用します。


"user" "password"




設定が終わったら、pgbouncerを起動します。


# service pgbouncer start





接続のサンプルを修正。
ポート番号:6432
ユーザー名、パスワードはpgbouncer.usersに記載したものに変更。


  1. # -*- coding:utf-8 -*-
  2. import psycopg2
  3. con = psycopg2.connect(
  4.     host = "192.168.1.103",
  5.     port = 6432,
  6.     database="sample",
  7.     user="user",
  8.     password="password")
  9. con.close()
  10. print(u'ok')




無事つながってくれました。


$ python sample.py
ok






効果測定



本当にコネクションの獲得が高速になったのか、簡単なサンプルを作成して計測します。


  1. # -*- coding:utf-8 -*-
  2. import time
  3. import psycopg2
  4. def connect():
  5.     """
  6.     con = psycopg2.connect(
  7.         host = "192.168.1.103",
  8.         port = 5432,
  9.         database="sample",
  10.         user="pgadmin",
  11.         password="P@ssw0rd")
  12.     """
  13.     con = psycopg2.connect(
  14.         host = "192.168.1.103",
  15.         port = 6432,
  16.         database="sample",
  17.         user="user",
  18.         password="password")
  19.     
  20.     con.close()
  21. start_time = time.clock()
  22. for i in xrange(1000):
  23.     connect()
  24. end_time = time.clock()
  25. print "time = %f" %(end_time-start_time)



試行回数直接接続(秒)pgbouncer経由(秒)
10.2886850.134102
20.2606950.138507
30.2979240.123916
40.2811730.117550
50.2699600.150961
合計0.2796870.133007



2倍高速になっていますね。

1レコードだけあるテーブルを検索する速度を計測。


  1. # -*- coding:utf-8 -*-
  2. import time
  3. import psycopg2
  4. def connect():
  5.     
  6.     con = psycopg2.connect(
  7.         host = "192.168.1.103",
  8.         port = 5432,
  9.         database="sample",
  10.         user="pgadmin",
  11.         password="P@ssw0rd")
  12.     """
  13.     con = psycopg2.connect(
  14.         host = "192.168.1.103",
  15.         port = 6432,
  16.         database="sample",
  17.         user="user",
  18.         password="password")
  19.     """
  20.     
  21.     cur = con.cursor()
  22.     cur.execute('select * from t1')
  23.     
  24.     cur.close()
  25.     con.close()
  26. for x in xrange(5):
  27.     start_time = time.clock()
  28.     for i in xrange(1):
  29.         connect()
  30.     end_time = time.clock()
  31.     print "%f" %(end_time-start_time)



試行回数直接接続(秒)pgbouncer経由(秒)
10.3821910.346022
20.3550720.342898
30.3942340.338882
40.3671380.335978
50.3737340.324563
合計0.3744740.337669


プロキシを経由する都合上、データ取得を行うと優位性がちょっと下がるような。
実際に使用するときは、ここらへんをちゃんと測定しないと、
逆に遅くなるかもしれませんね。
関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2015/07/01(水) 00:39:33|
  2. PostgreSQL
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Python HTTPリクエストのUser-Agentヘッダから端末を分析する | ホーム | new collation (ja_JP.UTF-8) is incompatible with the collation of the template database (C)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1738-781dab82
この記事にトラックバックする(FC2ブログユーザー)