月曜日, 23 7 月 2007

PostgreSQL パフォーマンスチューニングまとめ
この記事をクリップ!
このエントリーをはてなブックマークに追加

PostgreSQLをチューニングする機会があったので
その時に調べたチューニング項目を備忘録として残しておきます。
バージョンの違いやサーバの規模などによっても
効果は変わってくると思うのであくまで参考程度のものですが。

・shared_buffers
 7系では8000〜10000程度まで引き上げる
 8系では150000程度まで引き上げることが可能、100000程度が性能のピーク
 これに多く割り当てるよりOSのバッファ領域として使う方が性能が向上する
 テーブルサイズを割り出して設定するのがベスト
 簡単に設定するなら搭載メモリ量の1/4、搭載メモリが多ければ1/2ぐらいでも可
・max_connections
 7系では256程度、8系では1000程度が性能のピーク
・work_mem(sort_mem)
 適切なサイズに調整する、2048〜4096程度
 プロセス毎に領域が割り当てられるので多すぎるとスワップする可能性も
 ソートメモリはORDER BYだけではなくMerge Join、CREATE INDEX時でも使用される
・deadlock_timeout
 長めに設定する
 1000ms×同時セッション数が理想
・effective_cache_size
 数GBメモリ積んだマシンなら総メモリの1/4〜1/2を設定
・wal_buffers
 トランザクションが多い、大きい場合に多く取っておくと書き込み効率が良くなる。32〜64程度。
・commit_delay
 同時トランザクション数が多い場合、0以上を設定すると書き込み効率が上がる
・random_page_cost
 余程巨大なテーブルが無い限り数GBのメモリのマシンなら2〜3が適当
・max_fsm_pages
 小さすぎるとクラスタ容量が増えすぎる、大きすぎると検索オーバーヘッドが大きくなる、vacuum -vの情報を見て調節
・bgwriter_maxpages
 参照系DBなら値を小さく、トランザクションが多いDBなら大きく設定する
・checkpoint_segments
 大きく設定するとハードディスクへの書き込み頻度が減り性能が向上する

・VACUUM FULLをしてもインデックスの領域は切り詰められないのでREINDEXを行い無駄な領域を削除する
・複数のハードディスク上のテーブルスペースにテーブルを作ることによりIOが分散し効率が良くなる
・walログも別ハードディスクに移すと結構IO効率が上がる
・fstabのマウント情報にnoatimeを指定し、atimeの更新を抑えると若干性能アップ
Posted by tsujitako at 9:00 午前 in Linux/

水曜日, 17 1 月 2007

Apacheチューニング: ロギングを高速化する
この記事をクリップ!
このエントリーをはてなブックマークに追加

あまり知られていません(と思われる)がApache2(2.0.41以降)にはアクセスログの書き出しをメモリにバッファリングし高速化させるという機能があります。
今回はその機能を有効にするとどれぐらい速くなるのか調べてみました。

設定方法はhttpd.confに
BufferedLogs On
と追加するだけでログのバッファリングが有効になります。

以下ベンチマークを取った結果です。

バッファリング無効984 Request/Sec
バッファリング有効1033 Request/Sec
(参考)ロギング無し1055 Request/Sec
※小さなhtmlファイルに対してab -c 100 -n 1000を何度か繰り返した結果の平均です。

体感では違いを感じられないとは思いますがベンチを取るとおよそ5%程Request per secondの値が上がっていました。
静的なファイルが中心のリクエスト数の多いWebサーバであればこれを有効にすることによって多少は速くなるのではないでしょうか。
1行追加するだけで(少し)パフォーマンスアップできるのでオススメです。

追記:
BufferedLogsディレクティブは未だにexperimentalなままなので使用には注意が必要です。
Posted by tsujitako at 11:35 午後 in Linux/

火曜日, 19 12 月 2006

FONルーター設置
この記事をクリップ!
このエントリーをはてなブックマークに追加

無線LAN共有プロジェクトであるFONの専用ルーターが届きました。
12月5日に申し込んだのでタダです、タダ。でも送料と代引き手数料で945円掛かった…。
さっそくベースステーションに有線接続し電源を入れるとワイヤレスネットワーク一覧FON_APとMyPlaceの2つのネットワークが見つかりました。すごい簡単。
FON_APは外に公開するパブリックなESSIDでMyPlaceはオーナーのみが接続できるプライベートなESSIDという棲み分けがされているようです。
FON_APにネットワークを切り替えて適当なURLを開こうとするとFONのポータルが表示されました。
どうやらここでFONで登録したIDとパスワードを入れて認証が通ればその後は自由にそのネットワークを使えるようになるという仕組みらしい、なるほど。
MyPlaceはネットワークを切り替えるだけで使えるようになるけど、ルーター裏に記載されているWEPキーが無いと接続できません。
無線LANのアクセスポイントを持ってない人はこれを買えば安価に環境が作れるのでお得ですね。同程度の機能を持ったものを1,980円では買えないです、さすがに。

で、ここに書いてあるとおりゴニョゴニョすると…おぉSSHでログイン出来た!
へーOpenWrtなんだ…初めて触ったよー。
こんな小さな箱で動いているLinuxを見て少し感動してしまった。

cpuinfoはこんな感じです。
system type             : Atheros AR531X_COBRA
processor               : 0
cpu model               : MIPS 4KEc V6.4
BogoMIPS                : 183.50
wait instruction        : yes
microsecond timers      : yes
tlb_entries             : 16
extra interrupt vector  : yes
hardware watchpoint     : no
VCED exceptions         : not available
VCEI exceptions         : not available

んーでもまだ誰もAPを使ってくれた履歴がない…。
ユーザーが増えたらこんなとこに設置されたAPでも使ってくれるのかしらん。


とにかく小さいです
Posted by tsujitako at 12:18 午前 in Linux/

木曜日, 7 9 月 2006

SCIM + Anthy
この記事をクリップ!
このエントリーをはてなブックマークに追加

んーかなり久しぶりの更新…
それはさておき、このブログを置いてるサーバは一応Xも動かしていてたまにターミナルで作業したりしてるんですが
ごくごくたまーに日本語を打つ必要があるときもあるんですね、緊急のメール返信とか。
でもYDLを4.1にしてからなぜかkinput2が無くなってしまい日本語を入力できないでいました。
Cannaは入ってるのにIMは入ってない、どういうこった。

仕方ないのでkinput2をインストールしようとも考えたんですが調べていると
SCIM + Anthyがアツイらしいので変換エンジンごと入れ替えることにしました。
余談ですがインストール方法などを調べていると大半の方がapt-getやyumを使ってインストールされてるんですよね。
YDL4.1にもyumはありますがupdateの中身はup2dateが2つあるだけで全く使えません。
yumの「y」はYellowdogの「y」なのに…。

さてインストールにあたり以下のソースtarボールを落としてきました。
anthy-7900.tar.gz
scim-1.4.4.tar.gz
scim-anthy-1.2.0.tar.gz

上から順にインストールを行っていきます。
$ tar zxvf anthy-7900.tar.gz
$ cd  anthy-7900
$ make
# make install 

$ tar zxvf scim-1.4.4.tar.gz
$ cd scim-1.4.4
$ ./configure 
$ make
# make install 

$ tar zxvf scim-anthy-1.2.0.tar.gz
$ cd scim-anthy-1.2.0
$ env PKG_CONFIG_PATH=/usr/local/lib/pkgconfig ./configure 
$ make
# make install 
で、無事インストールが終わったら以下のコマンドでSCIMを立ち上げます。
$ setenv GTK_IM_MODULE scim
$ scim -d
立ち上がりました、問題なさそうです。
試しにFirefoxなどGTKアプリケーションを立ち上げて変換できるか試してみます。
んんん…できない、Shift+SpaceでもCtl+Spacheでも切り替わらない、なぜに?Why?
色々調べた結果、gtk.immodulesを更新しなければダメみたい。
gtk.immodulesの中身はgtk-query-immodules-2.0-32の実行結果を入れればいいから
# gtk-query-immodules-2.0-32 > /etc/gtk-2.0/gtk.immodules
でOK…かなと思ったけどダメでした。
どうやらYDLの場合はgtk.immodulesのパスが異なっていて
# gtk-query-immodules-2.0-32 > /etc/gtk-2.0/powerpc-yellowdog-linux-gnu/gtk.immodules
とすると、めでたく変換できるようになりました。

Anthyは噂通り変換効率が良く、Cannaよりかなり賢いような気が。
これならメールもサクサク書けてストレスが溜まらず済みそうです。



Anthyキタコレ

Technorati Tags:

Posted by tsujitako at 12:57 午前 in Linux/

火曜日, 25 4 月 2006

qmail+MySQL
この記事をクリップ!
このエントリーをはてなブックマークに追加

qmailとMySQLを連携させてメールサーバを作る機会があったのでその時の備忘録。
でも正直qmailはあまり好きではありません。djb氏独特のディレクトリ構成、設定方法とかがヤダ。
普段はMTAとしてPostfixを選んでいます、何しろ楽だし分かりやすい。

まずはqmailのインストールですが今回はnetqmailを使用しました。
アカウントの追加など基本的な部分は省いています。
あとMySQLは既にインストールされているものとします。
$ ./collate.sh
ここでqmailをMySQLに対応させるパッチをここからダウンロードしてきて当てます。
$ patch -p0 < netqmail-mysql-1.1.15.patch
$ cd netqmail-1.05
# make setup check
これでインストール完了です。
makeでコケる場合はMakefileを変更する必要があります。
ウチでは以下のように変更しました。
MYSQL_LIBS=/usr/local/mysql/lib/mysql/libmysqlclient.a -lm -lz
MYSQL_INCLUDE=-I/usr/local/mysql/include

次にMySQLの設定をします。
qmailからMySQLへの接続情報を/var/qmail/control/sqlserverに以下のフォーマットで書きます。
server MySQLサーバホスト名
login ログインID
password ログインパスワード
db データベース名
で、上で設定したデータベースに入ってアカウント情報の入ったテーブルを作ります。
テーブル名とカラム名は固定なので以下のテーブルをそのまま作ります。
CREATE TABLE mailbox (
  id mediumint(9) NOT NULL auto_increment,
  username varchar(32) NOT NULL default '',
  uid mediumint(9) NOT NULL default '0',
  gid mediumint(9) NOT NULL default '0',
  home varchar(128) NOT NULL default '',
  password varchar(16) NOT NULL default '',
  password_type enum('Password','Crypt-Password','MySQL-Password') NOT NULL default 'Password',
  suspended enum('N','Y') NOT NULL default 'N',
  PRIMARY KEY  (id),
  UNIQUE KEY username (username),
  UNIQUE KEY home (home),
  KEY password (password)
);
テーブルが出来たらメールアカウント情報をinsertします。
insert into mailbox (username,uid,gid,home,password,password_type) values('test',1001,1001,'/var/mail/test/','test','Password');
みたいな感じで。
解説すると1つ目のカラムからユーザー名、UID、GID、メール配送ディレクトリ、パスワード、パスワード形式となってます。
パスワード形式はPasswordでプレーンパスワード、Crypt-Passwordで暗号化パスワード
MySQL-PasswordでMySQLのハッシュ形式パスワードの3種類あります。上記の例はプレーンパスを使っています。

ここまでで一応メールは届くようになるんですが、この状態だとバーチャルホストには対応していません。
バーチャルホストにして複数のドメインからのメールを受けるためには以下のテーブルを作成します。
CREATE TABLE virtual (
  id mediumint(9) NOT NULL auto_increment,
  username varchar(32) NOT NULL default '',
  ext varchar(128) NOT NULL default '',
  virtual_username varchar(32) NOT NULL default '',
  virtual_host varchar(128) NOT NULL default '',
  PRIMARY KEY  (id),
  UNIQUE KEY address (virtual_username,virtual_host),
  UNIQUE KEY virtual (username,ext,virtual_username,virtual_host),
  KEY virtual_username (virtual_username),
  KEY virtual_host (virtual_host)
);
上記テーブルのvirtual_usernameとvirtual_hostを@でくっつけたのがバーチャルメールアドレスになり、
メールが送られてきたときこのテーブルを見て該当するメールアドレスがあれば
usernameで指定されているユーザーに登録されているディレクトリへ配送されます。
例えばabc@dummy.comというバーチャルメールアドレスを作りtest宛に配送したいならば
virtualテーブルに対して以下のようなクエリを発行します。
insert into virtual(username,virtual_username,virtual_host) values('test','abc','dummy.com');
これでOK。
実はvirtual_usernameを省略することもできて、その場合はvirtual_hostに登録されているドメインに
送られてきたメールはすべてその登録されているユーザーに配送される仕組みになっています。

他にもエイリアス用のテーブルがあってエイリアスの設定もできたりします。
驚いた事にそのエイリアスからパイプで外部のプログラムにメールを渡すことも可能です。
PostfixとMySQLを連携させる場合はそれが出来ないのでこの点は魅力的ですね。

でもまぁやっぱqmailは慣れないですねぇ、なんで/var/以下に実行バイナリがインストールされるのか意味が分(ry

Technorati Tags:

Posted by tsujitako at 9:35 午後 in Linux/

木曜日, 20 4 月 2006

Apache 2.2とmod_proxy_ajp
この記事をクリップ!
このエントリーをはてなブックマークに追加

このサーバを復旧させた時にApacheを2.0系から2.2系にアップして
Tomcatとの接続をmod_jk2からmod_proxy_ajpに切替えたんでその時の備忘録を書いておきます。

まずはhttpd-2.2.0のインストール。
$ ./configure --enable-module=so --enable-proxy --enable-proxy-ajp
$ make
# make install
ここでのポイントは--enable-proxy-ajpだけじゃなくて--enable-proxyも必要なとこ。

次にhttpd.confを編集…するんじゃなくてconf/extra以下のファイルを編集します。
Apache 2.2からは機能毎に設定ファイルが分けられていて、
それをhttpd.confからIncludeするという形になっています。
このサーバはバーチャルドメインで稼働させているのでextra以下の
httpd-vhosts.confにmod_proxy_ajpの設定を書いていきます。
<VirtualHost *:80>
  ServerAdmin xxxxxxxxxxx@xxxx.xxx
  DocumentRoot /xxx/xxx/xxxx/xxxxxx
  ServerName www.xxxxxxxxxxxx

  <Location /webapp-name/>
    ProxyPass ajp://localhost:8009/webapp-name/
  </Location>
</VirtualHost>
こんな感じでOKです。
これでApacheを起動させてhttp://xxx.xxx.xxx/webapp-name/でアクセスすると
ApacheからAJP13でTomcatに接続しwebapps/webapp-name/が見れるようになります。

mod_jk2の時と比べるとworkers.propertiesも必要無いし設定がかなり楽になりました。
Apacheからリクエスト転送すんのマンドクセ('A`)と思ってた人も
これぐらい簡単ならやってみようという気になるかも知れませんね。

Technorati Tags:

Posted by tsujitako at 1:58 午前 in Linux/

土曜日, 15 4 月 2006

Linux PPCでFlash再生
この記事をクリップ!
このエントリーをはてなブックマークに追加

x86版のLinuxならAdobeから公式のFlashプレーヤーが配布されているから
ブラウザでFlashムービーが再生されるけどPPC版のLinuxはなぜか配布されていないため
Flashを使ったページが見れません。
SolarisにはSparc版とIntel版を配布してるくせに…。

そこでPPC版のLinuxで使えるFlashプレーヤーは無いものかと調べていると
GnashというオープンソースのFlashプレーヤーを発見。
まだ開発途中で完全な動作を求めるのは難しそうだけどなんとなくでも動いたらいいなと思って早速インストールです。
$ setenv CVS_RSH "ssh"
$ cvs -z3 -d:pserver:anonymous@cvs.sv.gnu.org:/sources/gnash co gnash
$ cd gnash
$ ./configure --enable-klash
$ make
# make install
これでスタンドアローンプレーヤーであるgnashとプラグインのlibgnashplugin.soがインストールされました。
早速gnashでサンプルのFlashムービーを再生すると問題なく再生されました。おぉ感動…。
で、次はFirefoxでFlash入りのページが見られるか確認…あれ?見れない。konquerorでもダメ。
about:pluginsを見てみるとShockwave Flashと認識はされているっぽい。
やはりまだ開発途中だからプラグインで再生するには問題があるのかなぁ。
でもスタンドアローンなら再生できてるし、YDLでもFlashを使ったページが見られる日はそう遠くないはず。
FSFの最重要プロジェクトにもなってるし今後のGnashから目が離せません。
Posted by tsujitako at 11:32 午後 in Linux/

木曜日, 6 4 月 2006

WebDAVでファイル共有
この記事をクリップ!
このエントリーをはてなブックマークに追加

同じネットワーク内でファイルを共有する場合
個々のPCでフォルダを公開するかSambaなどのファイルサーバを使えばいいけど
共有したい相手が離れたネットワークにいる場合はこの方法は使えない。
こういう場合はWebDAVを使うと簡単便利です。
WebDAVはWebサーバのプロトコルを拡張しファイル共有を行えるようにしたもので
Webサーバにアクセスできる環境であれば問題なく使えるのでネットワークが離れていても大丈夫。
今回apache2.0系に設定する機会があったのでそのときの備忘録を書いておきます。

まずはhttpdのインストールから。
$ ./configure --enable-module=so --enable-dav
$ make
# make install
これで一応インストールは完了で使えるようにはなるけど、このままだと日本語名のファイルを置いた場合に
ファイル名が文字化けしてしまうためmod_encodingを別途インストールする。

まずWebDAV Resources JPから mod_encoding-20021209.tar.gzmod_encoding.c.apache2.20040616を落としてくる。
で、mod_encoding-20021209.tar.gzを展開後、中のmod_encoding.cをmod_encoding.c.apache2.20040616と差し替える。
$ tar zxvf mod_encoding-20021209.tar.gz
$ cp mod_encoding.c.apache2.20040616 mod_encoding-20021209/mod_encoding.c
次にアーカイブに同梱されているiconv_hookライブラリをコンパイル、インストールする。
$ cd mod_encoding-20021209/lib
$ ./configure
$ make
# make install
その後、mod_encodingのコンパイル、インストール。
$ cd .
$ ./configure --with-apxs=/usr/local/apache2/bin/apxs
$ make
# make install
このインストール時に
cp: cannot stat `mod_encoding.so': No such file or directory
とかエラーが出る場合は手動でmod_encoding.soファイルを作ります。
$ gcc -shared -o mod_encoding.so mod_encoding.o -Wc,-Wall -L/usr/local/lib -Llib -liconv_hook
# make install
これでインストールは完了。
次にhttpd.confをWebDAVが使用できるように書き換える。
LoadModule encoding_module  modules/mod_encoding.so

<IfModule mod_encoding.c>
  EncodingEngine    on
  NormalizeUsername on
  SetServerEncoding     UTF-8
  DefaultClientEncoding JA-AUTO-SJIS-MS SJIS
  AddClientEncoding "cadaver/" EUC-JP
</IfModule>

DavLockDB /usr/local/apache2/logs/DavLock
<Directory "/usr/local/apache2/htdocs/webdav">
  Dav on
</Directory>
これでWindowsの[マイネットワーク]→[ネットワークプレースの追加]で
http://xxx.xxx.xxx.xxx/webdav/を指定してやると共有フォルダが見られるようになります。

でも最初この設定でファイルを置いてみようとすると
[error] The locks could not be queried for verification against a possible "If:" header.  [500, #0]
[error] Could not open the lock database.  [500, #400]
[error] (13)Permission denied: Could not open property database.  [500, #1]
と言われてしまって何が悪いのか調べてみるとDavLockDBで指定するのはファイルではなく
作られるファイルのプレフィックスだということに気付きました。
つまり/usr/local/apache2/logs/DavLockをtouchで作ってnobody所有にしても意味がなく
そのディレクトリに対して書き込む権限が必要だ、ということです。
で、DavLockDBを/tmp/DavLockに変えてやることによって無事動作するようになりました。

ただこの状態だと認証もないし暗号化もされていないのでBASIC認証を掛けてSSLにも対応させるべきですね。
この辺の設定は通常のApacheと同じ方法で出来るので楽チンです。
VPNもいいけど手軽にファイルを共有するならWebDAVがオススメです。
Posted by tsujitako at 11:59 午後 in Linux/

水曜日, 29 3 月 2006

rcorder
この記事をクリップ!
このエントリーをはてなブックマークに追加

今日はFreeBSDのおはなし。
Linuxでは起動時に/etc/rc.d/init.dにある起動スクリプトを設定されたランレベルに応じて実行するわけだけど
5系のFreeBSDでは/etc/rc.dに置かれている起動スクリプトが実行される。
ここまではよく似ているんだけど今日FreeBSDで起動時に立ち上げられるプログラムの
順番を変更しようとしてちょっと悩んでしまった。

Linuxならば起動スクリプトに
# chkconfig: 345 98 02
のように起動/停止シーケンス番号を書いておいてchkconfigで登録しておけば
その順番で起動されるところ、FreeBSDでは
# REQUIRE: DAEMON LOGIN
# BEFORE: NETWORKING
とそのプログラムを起動する前後のプログラムを指定しておかなければならない。
それはまぁなんとなく分かってたけどこの順番通りソートするスクリプトが見つからなかった。
きっと/etcのどこかにあるだろうとgrepでREQUIREとか調べても見つからない。
と、rcを見るとrcorderの文字が。
あぁそうかこんな関数があるんだと思ってrc.subrとか見ても無いし。
もしやと思ってwhich rcorderすると/sbin/rcorder…キタコレ!
なんだ/sbinかぁと思って開くとこれバイナリなのね。
てっきりシェルスクリプトなんだと思ってたよ。
ソートするだけなんだからシェルスクリプトでも十分作れそうなのにね。

調べるとNetBSDでは標準で伝統的な方法なんですね。
まだまだ修行が足りんわ。
Posted by tsujitako at 8:10 午後 in Linux/

火曜日, 14 3 月 2006

メモリが…
この記事をクリップ!
このエントリーをはてなブックマークに追加

YDLを4.1にして気付いたんだけどメモリが少なく認識されてるっぽい。
512MBを2枚刺して1GBにしてるのになぜか768MBしか認識しないんだよなぁ。
まだ512MBしか認識しないんだったらメモリが壊れたのかとも考えられるけど
1枚のモジュールの半分しか認識しないて事はどうもソフトウェア的な問題なのかも。
別パーテーションのOS Xでは1GBで認識されてるしカーネル作り替えたら解決するかな?

追記:
デフォルトカーネルのHigh memory supportがオフになっているのが原因でした。
4.1以前のカーネルではオンになってたのになぁ、なぜに?
最近版の2.6.15.6でHigh memory supportをオンにしてカーネルを入れ換えたところ
コンソール画面がboot:の表示を最期に何も映らなくなってしまった。
.configもYDL 4.1のものを使ってるのに、なぜ!?
結局RPMからYDL 4.1のカーネルソースをコンパイルして入れ換えました。
前は何も考えずにカーネルのバージョンアップ出来てたのに…。(´・ω・`)
Posted by tsujitako at 10:50 午前 in Linux/
前のページ   1 > 2 > 3   次のページ