カテゴリー: Computer

  • PostgreSQL 8.1のパフォーマンス

    PostgreSQLのパフォーマンスはpostgresql.confに大きく影響されるので、速くなったかどうか判りづらい場合も多いです。しかし、8.1では確実に速くなっているようです。現在8.1はbeta1ですが少しだけ比較してみました。

    詳しくはWikiのページを見ていただくとして以下の様にpgbenchで計測すると

    ./pgbench -v -h 192.168.100.204 -U yohgaki -c 20 -t 200

    PostgreSQL 8.0.3

    tps = 4683.835265 (excluding connections establishing) (Select only)
    tps = 1032.798585 (excluding connections establishing) (Update 省略)
    tps = 423.926137 (excluding connections establishing)

    PostgreSQL 8.1beta1

    tps = 5985.801678 (excluding connections establishing) (Select only)
    tps = 1428.605103 (excluding connections establishing)(Update省略)
    tps = 533.005286 (excluding connections establishing)

    という感じの結果になりました。
    postgresql.confの設定は多少チューニングした物を使っています。postgresql.confもWikiのページに添付してあります。

  • pthread版pgbenchの拡張

    実はpthread版pgbenchの作成には別の目的もあります。オリジナル版pgbenchのコードを見ると分かるのですが、非同期クエリを使用しているので送信するクエリのカスタマイズが面倒です。pthread版pgbenchの別の目的、と言うより本来の目的、はpostmasterが書き出したログから自動的にクエリを収集し、再生するベンチマークを簡単に行いたいので作る、と言う事にあります。

    今の所こんな感じで実装するつもりです。

    postgresql.confのログ設定が

    log_line_prefix = ‘%r’
    log_statement = true

    で出力されたログから自動的に各クライアントのクエリを出力し設定されたスレッド数(クライアント数)でベンチマーク出来るようにする予定です。

    今のコードだとログの読み取りとクエリ保存を行えるようにして、各スレッドがクエリを実行するように変更すれば良いだけです。簡単なのでそのうち変更します。

  • PHP 5.0.5リリース

    PHP 5.0.5がリリースされました。XMLRPCのセキュリティフィックスが含まれています。

    他のディストリビューションも同じとは思いますが、Momonga LinuxのXMLRPCは現行リリース(5.0.4-6m)でもセキュリティ対策済みです。

  • coMomongaのススメ

    遅ればせながら初めてcoLinuxのMomonga版であるcoMomonga2+(今のところ非公開です。8月のコミケで販売していたそうです。私はプロジェクトメンバーなのでscpでサーバから拾ってきました。)を使ってみました。非常に便利かつ思っていたよりレスポンスも良いです。

    coLinuxは初めてだったので一番最初はcoMomongaでは無くcoLinuxのインストーラから選択できるDebianをルートファイルシステムを使ってみました。このルートファイルシステムには本当に最小限のパッケージしかインストールされていないようでした。viもemacsも無い状態でした。ネットワーク経由でapt-getすれば良いのかも知れませんがviさえ無くて戸惑いました。Gentooのルートファイルシステムも選択できます。こちらはもう少し多くのパッケージがインストールされているのかも知れませんが試しませんでした。

    次にcoMomongaのISOイメージを試す事にしました。coMomongaのISOにはcoLinuxとXming(Xディスクプレイサーバ)インストール方法や設定に必要な全てのファイルが含まれています。WindowsのCDドライブにCDを挿入すると自動的にインストールマニュアルが表示されます。Xmingのバイナリも付いていてX Window環境も直ぐに構築できます。このマニュアル通りに設定するだけで簡単にセットアップできました。

    # ただし、このノートPCがWindowServerのドメインメンバー
    # であった為、ICS(インターネット接続の共有)がグループ
    # ポリシーで無効に設定されていたのでネットワークが使え
    # ませんでした。ドメインからワークグループに変えてネット
    #ワークを使えるようにしました。

    ブートが非常に速いのは助かります。同じノートPCのパーティションにインストールしたMomongaLinuxを起動するより随分速いです。Xも普通にストレスの無いパフォーマンスで動作します。コーディングなどの用途向け十分なレベルです。

    私のノートPC
    -PentiumM 1.3Ghz
    -768MB RAM
    -80GB 5200rpm HDD
    -WindowsXP Pro SP2

    スクリーンショット
    coMomonga
    (coMomongaをWindows上で実行し、coMomonga上のXクライアントに、Windowsで実行しているXmingからXDMCPでcoMomongaのXを起動している画面。正確に書くと長いですね… 説明は面倒ですがインストールは非常に簡単)

    今までノートPCのWindows環境でUNIXライクな環境が必要な場合にはcygwinを、Emacsが使いたい時はMewを使っていましたが今後はcoMomongaを使う事にします。ノートPCにもMomongaLinuxをインストールしていますが、諸事情によりWindowsがメインOSになっています。雑誌などの評価で非常に便利とは思っていたのですが食わず嫌い(嫌いではなかったですが)で今まで損をしていました。

    このcoMomonga2+ですが、Momonga Projectから今度のOSCで売りに出るそうです。是非購入(寄付?)しましょう :)

  • Advanced Bash-Scripting Guide

    名前の通りBASH専用リファレンス。ざっと見たところ結構便利そうなのでメモ。

  • PHP関西セミナーの資料

    9月3日にPHP関西のセミナー講師をさせていただきました。プレゼンテーションファイル作成の時間が足りなかった為、予定していたより内容が薄い資料になってしまいました。話を聞いて頂いた方以外にはよく分からないかも知れませんが、最近のオープンソースのPHPアプリケーション脆弱性レポートからどのように脆弱性が作られたか考察しました。

    セミナーを聞いて頂いた方向けに、その時のプレゼンファイル(PowerPoint形式)を公開します。

  • pgbenchのpthread版

    (やはりバグを発見したので修正)

    JPUG広報Blogに「pgbenchのpthread版が欲しい」と書いていましたが、先週末にPHP関西のセミナー講師を引き受けていたのでその移動時間中にテキトーに作ってみました。テキトーに作ったので勘違いしてバグを入れていました。今度はたぶん正しい結果になっていると思います。

    サーバ環境
    Athlon64 3200/3GB Memory/SATA2 HDD/Momonga Linux x86_64
    PostgreSQL 8.0.3(64bit)(全てのSQL文をホスト/ポート付きで記録。他はほぼデフォルト。)

    クライアント環境
    AthlonXP 2500+/2GB Memory

    pthread版pgbench

    [yohgaki@dev pgbench]$ time ./pgbench -v -h 192.168.100.204 -U yohgaki -c 10 -t 100
    starting vacuum…end.
    starting full vacuum…end.
    Warming up 15 seconds…
    Start benchmarking…
    End benchmarking….. (4.96586 seconds)
    transaction type: TPC-B (sort of)
    scaling factor: 10
    number of clients: 10
    number of transactions per client: 100
    total number of transactions processed: 1000
    tps = 235.404176 (excluding connections establishing)

    real 0m25.739s
    user 0m0.214s
    sys 0m0.313s
    [yohgaki@dev pgbench]$

    こんな感じです。

    何だか遅くなってしまたのでコードをもう少し効率化してみました。
    今度はオリジナル版よりは速くなりました。

    pthread版pgbench

    [yohgaki@dev pgbench]$ time ./pgbench -v -h 192.168.100.204 -U yohgaki -c 50 -t 10
    starting vacuum…end.
    starting full vacuum…end.
    Warming up 0 seconds…
    Start benchmarking…
    End benchmarking….. (1.16363 seconds)
    transaction type: TPC-B (sort of)
    scaling factor: 1
    number of clients: 50
    number of transactions per client: 10
    total number of transactions processed: 500
    tps = 429.689481 (excluding connections establishing)

    real 0m2.655s
    user 0m0.047s
    sys 0m0.088s

    オリジナル版

    [yohgaki@dev pgbench]$ time pgbench -v -h 192.168.100.204 -U yohgaki -c 50 -t 10
    starting vacuum…end.
    starting full vacuum…end.
    transaction type: TPC-B (sort of)
    scaling factor: 1
    number of clients: 50
    number of transactions per client: 10
    number of transactions actually processed: 500/500
    tps = 337.674248 (including connections establishing)
    tps = 379.093451 (excluding connections establishing)

    real 0m1.615s
    user 0m0.043s
    sys 0m0.210s

    と、多少スレッド版の方が速いです。今度は繰り返し実行してみてもスレッド版の方が速い傾向は変わりませんでした(汗

    ベンチマークを開始する前にウォーミングアップの時間を設定したかった事、クエリ実行間隔をランダムに設定したかった事もpthread版が欲しかった他の理由でした。そこで

    -w ウォームアップ時間(秒)
    -r ランダム遅延(マイクロ秒)

    も設定できるようにしました。よくあることですがサーバに負荷をかけた直後は良い性能がでるためウォームアップ時間は設定できた方が便利です。

    ウォームアップ時間を5秒に設定した場合

    [yohgaki@dev pgbench]$ time ./pgbench -v -h 192.168.100.204 -U yohgaki -c 50 -t 10 -w 5
    starting vacuum…end.
    starting full vacuum…end.
    Warming up 5 seconds…
    Start benchmarking…
    End benchmarking….. (1.48874 seconds)
    transaction type: TPC-B (sort of)
    scaling factor: 1
    number of clients: 50
    number of transactions per client: 10
    total number of transactions processed: 500
    tps = 335.854481 (excluding connections establishing)

    real 0m6.671s
    user 0m0.124s
    sys 0m0.260s

    とこの様な感じです。オリジナル版にウォームアップ時間オプションを追加して欲しいな、と書いておいたら石井さんが追加してくれるはず :)

    ソースは
    http://www.ohgaki.net/wiki/index.php?PostgreSQL%2Fppgbench
    からダウンロードできます。変更するかもしれないので日付を入れておきました。日付が入っていないソースは古いソースです。もし古いソースをお持ちの場合、新しいソースを使ってください。古い物にはバグがあります。

  • FedoraCoreのメイン開発プラットフォームはx86_64?

    PentiumDを購入したのですがMomongaのカーネルでは945/955チップセットのSATAデバイスは現状のカーネルでは認識しませんでした。少し前のブログにパッチを当てたらとりあえず認識したと書きましたが、素直に最新のカーネル使ってみようとFedoraCore develのカーネルをCVSから拾ってきました。

    x86_64でビルドしたところ問題なくビルド&動作しました。やはり基本には忠実でないと…
    i686でビルドしたところ簡単なシンタックスエラーでビルドに失敗しました。FedoraCoreの開発者のほとんどはi386からx86_64に移行しているのかも知れませんね。

    DJB先生の標準PCもAthlon64ですが、

    The 2005.05.14 standard workstation costs $552. Notes on the price:

    http://cr.yp.to/hardware/advice.html

    とたったの$552です。香川ではECCメモリは店頭で売っていないですし、通販で買っても結構高い(前回買った時はDDR2-533 1GBが24,000円ちょっとが最安値)での普通のメモリを買えばこれくらいで作れそうです。私も最近Athlon64のPCをMomongaビルド用のPCとして作りました。Athlon64 3200、nVidia gForce FX5200、メモリ3GB、250GB+400GB HDDという感じで作ったので$552とは行きませんでしたが、むかーしDynabook386SX用に買った60MB(60GBではありません)HDDと同じ程度の値段で作れました。

    しかしスーパーマルチドライブ安くなりましたね。バルクなら5000円切ってました。

  • LinuxとICH7は鬼門?!

    GigabyteのGA-8I945Gマザーボードを購入しました。このマザーボートを購入した理由はPCI Express x16用のハイエンドグラフィックスカードは必要なかった事と廉価なPCI Expressグラフィックスカードが無かった事、そしてPentinumDを使いたかった為です。
    # IntelのxxxGチップセットはグラフィックスカード機能を内蔵しています。
    # 16MBくらいのメインメモリは使えるのだろう、と思っていたらGA-8I945G
    # は最大でも8MBしか使えません…

    945チップセットはICH7によってPATA/SATA IDEインターフェース機能が提供されています。ネットで検索するとSuSEなどのディストリビューションではSATAのみの環境でもインストールできているようですがMomonga Linux 2はインストールでませんでした。ATA HDDのFAQサイトではata_piixかahciでICH7で利用できると書いてあるのですが、SATAデバイスは全く認識されない状態でした。

    仕方が無いのでPATAのHDDとDVD ROMをIDE0インターフェース接続してとりあえずインストールした後、いろいろ試して見る事にしました。しかし、このIDE0のインターフェースが悪いのかICH7サポートが悪いのか、DVD ROMをはずしてもhdparmで2MB/秒程度の速度しか出ていません。状態を確認するとDMAさえ使っていませんでした。hdparm -d1でDMAを有効に設定しようと試みても「サポートしていない」旨のエラーでDMAも有効に出来ません。

    なんとしてもSATA HDDを使えるようにしなければと思いつつネット検索していると、カーネルのデバイス認識に問題あるため(?)チェックコードを削除するとSATAドライブを認識できたケースがある事を見つけました。kernelに次のパッチを適用してやっとSATA HDDが認識できました。

    --- linux-2.6.10/drivers/scsi/ata_piix.c.orig   2005-08-01 10:44:38.000000000 +0900
    +++ linux-2.6.10/drivers/scsi/ata_piix.c        2005-08-01 10:44:53.000000000 +0900
    @@ -589,12 +589,6 @@
            port_info[0] = &piix_port_info[ent->driver_data];
            port_info[1] = NULL;
    
    -       if (port_info[0]->host_flags & PIIX_FLAG_AHCI) {
    -               int rc = piix_disable_ahci(pdev);
    -               if (rc)
    -                       return rc;
    -       }
    -
            if (port_info[0]->host_flags & PIIX_FLAG_COMBINED) {
                    u8 tmp;
                    pci_read_config_byte(pdev, ICH5_PMR, &tmp);
    

    hdparmでも66MB/秒と普通の数値が出ています。cp -ax でPATAにインストールしたMomonga Linux 2をSATAにコピーし、grub.confやinitrdイメージを作り直してパッチ付きカーネルでブートできるようにしました。ここでは書いていませんが、要所要所で適切にBIOSも設定しなければなりません。設定を間違えるとPATAのディスクさえ認識してくれません。ご注意下さい。

    他のディストリビューションでSATAのみの環境でのブートを試みたのはKnoppix3.9 日本語版だけですが、これもSATAデバイスを全く認識してくれませんでした。SuSEなら大丈夫(?!)なのかもしれませんが…

    GigabyteのGA-8I945GはLinuxで使えない事もないですがお勧めできるM/Bでは無いです。同じシリーズのM/Bも同じかと思います。M/Bの問題と言うより、もしかしてICH7/ICH7RはLinuxにとって鬼門?!

    # PS/2マウスコネクタの接触が悪いのか、他の原因なのか分かりませんが
    # マウスが動かなくなるのも困ります。抜き差しすると直ります…
    # 955チップセットに買い換えるかな…

  • DNSサーバを使ったユーザトラッキング

    前からちょくちょく見かけていたのですが最近はDNSサーバを使用しユーザトラキングを行っているSPAMメールがどんどん増えているように思えます。

    SPAMMERとしてもどのどのメールアドレスからは反応(クリック)があったのか知りたいので最も安直な手口として

    http://example.com/?u=user@example.com

    の様なメールがありました。さすがにこれではトラッキングしていることがばればれなので

    http://example.com/?id=1234

    とか

    http://example.com/?prod_id=1234

    等とトラッキングしている事を判りづらくする試みは行われていました。ちょっとコンピュータ(Web)を知っている方ならトラキングを行っている(行える)事は明らかなので、最近はドメイン名も使うSPAMMERも増えてきたようです。

    http://tracking_id.example.com/
    tracking_idはユーザを特定できるIDとなる任意文字列

    の様な形式URLが使われています。こんな事をしても全部のサーバ名を作るのが大変では?と思うかも知れませんがDNSサーバによってはワイルドカードが使用できます。

    *.example.com 10.10.10.10

    の様な定義ができるのです。ユーザがアクセスしてきたらアクセスしてきたHOST情報からユーザを特定し記録した後、別のサイトにリダイレクトする、等の方法を使っているはずです。
    # リダイレクトはしてもしなくてもどちらでも良いです。念のため。

    DJBDNSユーザなら誰でも思いつく方法と思いますが、広まるまでに時間が必要でしたね :p

  • PHPカンファレンス2005

    予告は普通だったのですが、アナウンスが急だったので知らない方もいらっしゃるかも? 今日、仕事で東京に行くのでついでに私も聞きに行く予定です :)

  • 岡山県工業技術センターでPHPセミナー

    岡山県工業技術センターでPHPの入門セミナー講師をさせていただきました。会議室に満員の70名ほどの方に聞いていただきました。

    入門といっても前半がPHPの紹介、後半がセキュリティ対策の基礎、という入門用のセミナとしては内容がPHPに特化していたと思います。PHPを使っていない方も多かったので私の本と同じで評価は大きく分かれるセミナーになったと思います。

    しかしセキュリティ対策の基礎は資料だけでも十分参考になると思うので少しでも安全なWebサイト構築の助けになればよいと思います。

  • PHPのE_STRICTエラー

    PHPのエラーレポートレベルはphp.ini設定のerror_reportingで設定されています。

    PHP5から追加されたE_STRICTで「あれ」と思われるかもしれない状況があるので書いておきます。

    PHP5でE_ALLをerror_reportingに設定してもE_STRICTレベルのエラーは報告されません。デフォルト設定ファイルではE_STRICTは無視されるようになっています。

    error_reporting = E_ALL | E_STRICT

    と設定しないとより厳しいエラーチェックが行われません。

    開発時には言語が用意しているエラーチェックを出来る限り多く使用するべきです。しかし、E_STRICTレベルのエラーレポートを行う設定を行った場合に問題が発生する場合があります。次のコードがどのように処理されるか考えると分かります。

    <?php
    error_reporting(E_ALL); // E_STRICTは不必要
    
    class foo {
      var $bar;
    }
    ?>

    E_STRICTで報告されるエラーには”var”宣言されたプロパティにpublic/private/protectedを使用するよう推奨するエラーがあります。このエラーはコンパイル時に発生するため、スクリプト中でerror_reporting関数を使ってエラー報告レベルと変更してもE_STRICTエラーを無視できません。E_STRICTエラーが有効な環境で、error_reporting関数で確実にE_STRICTエラーが発生しないようにするには、E_STRICTエラー出力を抑制するには最初に読み込まれるファイルのコード中にE_STRICTエラーが発生しないしerror_reporting関数を使用してエラー報告レベルを変更しなければなりません。

    # E_STRICTは開発時だけ使う、という方針がお勧めです。
    # PHP4用に作ったアプリの修正は手間な場合は、INSTALL
    # ファイルなどにE_STRICTは無効にするよう書くだけでも
    # 良いかもしれません。

    備考:
    E_NOTICEレベルのエラーは全て実行時に発生するエラーであるため、E_STRICTの様な問題は発生しません。念のため。

    追記:
    今時のPHPアプリケーションならE_STRICTエラーも発生しないようにプログラムを作成すべきす。

     

  • PHPのメモリ・リソースリークの修正

    気が付いていてもやってないことが多いので、せめて近日中に処理しようと思っていることくらいは公開して自分にプレッシャーをかけてみる事にしました。

    PHPにはError HandlerやException Hanlderを使った場合、メモリやリソースが開放されない場合があります。多少のリークは問題とならない場合がほとんどですが中にはサーバがフリーズしてしまうケースもあります。原因と修正すべきコード、対処方法なども分かっています。取り掛かろうとしてinternalsに軽くメールしたのち放置中…

    # この問題と原因は随分前から知っていて放置してました :(

  • 関数の戻り値と定数値(リテラル)への参照

    追記:このエントリへのアクセスが多いので加筆修正しました。

    Fatal error: Only variables can be passed by reference

    直訳すると「致命的エラー:変数のみ参照渡しが可能です」となります。エラーメッセージの通りvariable(以外)の値は参照として渡せないのでエラーになっています。エラーメッセージが適切かどうかは微妙ですが、意訳すると「致命的エラー:ソースコード中に記述した定数値(リテラル)へのアクセスはできません」あたりが妥当と思います。当然ですがdefineで定義した定数値を返す事は可能です。PHP内部では定数は変更できない「変数」の様に実装されているからです。このエントリの「定数値」を正確に書くと「ソースコード中に記述された定数値」となります。

    (さらに…)