PHP7用の新しいセッションモジュールの準備ができたので紹介します。かなりの性能向上が期待できます。
パッチ
GitHub:https://github.com/php/php-src/pull/1016
ベンチマーク
環境
- Fedora 21 x86_64/Intel Core i7/Apache 2.4/PHP 7 custom
テストコマンド
ab -c 7 -n 500000 http://localhost:8888/session.php
テストスクリプト
<?php ini_set('session.save_path', '/home/tmp'); ini_set('session.lazy_write', 1); // Change mode here ini_set('session.use_strict_mode', 0); session_id('testid'); session_start(['read_and_close'=>0]); // Change mode here //$_SESSION['test'] = ++$_SESSION['test']; $_SESSION['a'] = str_repeat('a', 102400); echo '<pre>'; var_dump(session_id(), $_SESSION['test']);
ベンチマーク結果
- 以前と同じ動作: 約15000 reqs/sec
- “read_and_close”: 約20000 reqs/sec (33%の性能向上)
- “lazy_write”:約15000 reqs/sec (ただし、httpdプロセス毎の書き込みが100MB/secから5MB/secに低減。httpdが12プロセス程あったので1200MB/secから60MB/secの書き込みに低減)
注:ビルドしなおしていないのでPHPはデバッグビルドです。
まとめ
“lazy_write”でリクエスト/秒が向上しなかった原因はカーネルがキャッシュしている内容と同じ書き込みの場合、ディスクに書き込んでいなかった事にあります。プロセスではなくディスクデバイスへの書き込みを見るとほとんど書き込みがありませんでした。今のカーネルは”lazy_write”の様です。(Btrfsを利用しています)
Memcachedなどにセッションデータを保存している場合、セッションデータがネットワークで送信されるので大幅な違いが現れると思われます。
“lazy_write”はデフォルトにするつもりです。セッションに無駄な書き込みをしないことによりWebアプリの性能が劇的に変る場合もあると考えられます。
セッション($_SESSION)への無駄な書き込みはやめましょう!
P.S. 無効なセッションを識別する為にセッションの状態とアクセスタイムスタンプを保存している方も多いと思います。まだ合意が取れていないので作っていませんが、無効なセッションを識別するためにユーザーが状態/タイムスタンプを保存しなくても良い仕組みも導入するつもりです。