PHP 5.5ネーティブキャッシュの話

15
PHP5.5 ネーティブキャッシュの話 廣川類 @rui_hi PHPカンファレンス2013 2013914()

description

PHP 5.5でオペコードキャッシュOPcacheが標準搭載されました。その使い方と特徴をベンチマークを交えて解説します。

Transcript of PHP 5.5ネーティブキャッシュの話

Page 1: PHP 5.5ネーティブキャッシュの話

PHP5.5 ネーティブキャッシュの話

廣川 類 @rui_hi

PHPカンファレンス2013

2013年9月14日(土)

Page 2: PHP 5.5ネーティブキャッシュの話

�キャッシュとは? データを再利用する仕組み

�オペコードキャッシュとは?

コンパイル後のバイトコードを共有メモリに保持、再利用することで、

パース/コンパイルの時間・負荷をなくす。

�キャッシュの利点: 応答速度改善、サーバ負荷低減

�実行形態:サーバ組込型:APC, Xcache, OPcache 等、分散型: memcache

キャッシュとは?

クライアント( Webブラウザ )

クライアントクライアントクライアントクライアントキャッシュキャッシュキャッシュキャッシュ

ページキャッシュページキャッシュページキャッシュページキャッシュ

データデータデータデータキャッシュキャッシュキャッシュキャッシュ

オペコードオペコードオペコードオペコードキャッシュキャッシュキャッシュキャッシュ

出力

PHPスクリプト

レスポンス

リクエストWebサーバー/PHP

フラグメントキャッシュフラグメントキャッシュフラグメントキャッシュフラグメントキャッシュ

コンパイル

出力キャッシュ出力キャッシュ出力キャッシュ出力キャッシュ

実行

関数APIDB

パース

Page 3: PHP 5.5ネーティブキャッシュの話

�オペコードキャッシュはPHP 4時代から重要技術

� スクリプトエンジンと一体で動作するため、開発が難しい

� 新バージョンへの追従遅延、動作不安定等の問題を発生

�APC 3.1.14 公開キャンセル(2013/2): 深刻なメモリの問題

� PHP 6でのAPC標準搭載化:PHP 6開発中断により延期

Opcache標準採用の流れ

https://wiki.php.net/rfc/optimizerplus

�Zend Optimizer+をOSS化, PHP 5.5組込を提案(2013/1)

� Zend Optimizer+ から Zend OPcacheに改名(2013/3)

�投票により採用決定(PHP 5.5リリースは2ヶ月遅延)(2013/3)

Page 4: PHP 5.5ネーティブキャッシュの話

OPcacheの特徴

�ユーザのメリット

�標準的に使用できる

�最新版に追従

�安定化

�APCとの違い

OPcache APC

対応PHPバージョン 5.2~5.5 5.2~5.3, 5.4(β)

使用後メモリ管理 破棄→再起動 再利用

実行速度 1~1.2 1

付加機能 最適化 データキャッシュ,プリロードアップロード進捗表示,最適化

Page 5: PHP 5.5ネーティブキャッシュの話

OPcacheインストール

�インストール

�ソースコードから組込

PHP 5.5 :バンドル、PHP 5.2~5.5はPECL, github

� configure に --enable-opcache オプション指定

� php.ini 設定

zend_extension=/usr/local/lib/php/20121212/opcache.so

opcache.enable=1

Zendエクステンションとして読込み(フルパス指定)

Opcache有効化(デフォルト:有効)

Page 6: PHP 5.5ネーティブキャッシュの話

php.ini 推奨設定オプション

opcache.memory_consumption=128opcache.interned_strings_buffer=8opcache.max_accelerated_files=4000opcache.revalidate_freq=60opcache.fast_shutdown=1

opcache.save_comments=0opcache.enable_file_override=1

性能向上が期待できるが注意を要するオプション

最大メモリ

最大メモリ(文字列)

最大ファイル数

更新確認間隔[s]再起動高速化

PHPDocキャッシュ除外

ファイル存在確認処理を代替

性能向上が期待できるオプション(要調整)

Page 7: PHP 5.5ネーティブキャッシュの話

オプション (opcache. 省略) デフォルト 説明

enable On OPcache有効/無効

memory_consumption 64 使用メモリ[MB]

interned_string_buffer 4 内部文字列用メモリ[MB]

max_accelerated_files 2000 キャッシュ用ハッシュキーの最大数

validate_timestamps On 更新日付に基づきキャッシュ更新

revalidate_freq 2 タイムスタンプ更新確認間隔[s]

revalidate_path Off include_path探索最適化有効/無効

optimization_level 0xffffffff 特定の最適化を有効/無効

enable_file_override Off ファイル存在確認関数をオーバーライド

OPcache主要設定オプション(1)

■ 基本オプション、最適化

Page 8: PHP 5.5ネーティブキャッシュの話

オプションオプションオプションオプション (opcache. 省略省略省略省略) デフォルトデフォルトデフォルトデフォルト 説明説明説明説明

blacklist_filename “” キャッシュ対象外とするファイルを指定

max_file_size 0 キャッシュ対象ファイルの最大サイズ

restrict_api “” キャッシュ対象の先頭文字列を指定

save_comments On PHPDocコメント有効/無効

load_comments On 共有メモリからPHPDocコメントをロード

OPcache主要設定オプション(2)

オプション (opcache. 省略) デフォルト 説明

force_restart_timeout 180 指定秒経過時に強制再起動

max_wasted_percentage 5 廃棄済みメモリが指定%を越えると再起動

use_cwd On カレントディレクトリをキーに追加(衝突回避)

error_log “” エラーログファイル名

log_verbosity_level 1 エラーログ詳細度(0..4)

fast_shutdown Off 高速シャットダウン処理有効/無効

■ キャッシュ対象を指定/限定(互換性に注意)

■ 安定性/デバッグ

Page 9: PHP 5.5ネーティブキャッシュの話

ベンチマーク

req/sec nominal Opcache APC 最適化無し

PHP 5.5 23.42 62.40 (+166%)

56.52(+10%)

57.65(+8%)

PHP 5.4 23.06 60.56(+163%)

55.88(+8%)

58.79(+3%)

PHP 5.3 22.30 49.04(+120%)

45.53(+8%)

47.12(+4%)

ab -n 1000 -c 20 http://www.example.com/ � WordPress 3.6 (Ubuntu 13.04, nginx 1.2.6)

40

50

60

70

キャッシュなし

Page 10: PHP 5.5ネーティブキャッシュの話

キャッシュ管理コンソール

� キャッシュ管理コンソール

https://github.com/rlerdorf/opcache-status

Page 11: PHP 5.5ネーティブキャッシュの話

� Opcacheはデータキャッシュをサポートしない

�データキャッシュ用エクステンション:

APCu 、Yac 、memcache等を使う

�APCuの関数APIはAPC互換:既存のプラグイン等を使用可能

�キャッシュに保存: apc_store($key, $var);

�キャッシュから取得: $var = apc_fetch($key);

APCuによるユーザキャッシュ

extension = apcu.soapc.enabled = 1apc.shm_size = 32M

� PECL, githubで公開� 構築: configureに –enable-apcu オプション指定

� 設定オプション

Page 12: PHP 5.5ネーティブキャッシュの話

オプション (apc. 省略) デフォルト 説明

enabled On APCu有効/無効

preload_path “” 初期化時にプリロードするパス

shm_size 32 共有メモリの大きさ[MB]

shm_segments 1 共有メモリセグメント数

ttl 0 アクセス有効時間[s]

gc_ttl 3600 キャッシュがGCリストに残る時間[s]

smart 0 expungeを実行する有効メモリ割合

entries_hint 4096 キャッシュ中に存在する変数の数の予測値

slam_defense 1 キーのslammingを防止

serializer php シリアライザを指定

rfc1867 0 ファイルアップロードメータ機能有効

rfc1867_prefix “upload_” アップロード時に生成される変数の接頭辞

rfc1867_name “APCu_UPLOAD_PROGRESS” フォーム変数

rfc1867_freq 0 更新間隔[%または大きさ]

APCu主要設定オプション

Page 13: PHP 5.5ネーティブキャッシュの話

�管理コンソール:apc.php

サーバ状況の監視、キャッシュの個別管理が可能

APCu管理コンソール

Page 14: PHP 5.5ネーティブキャッシュの話

Opcache + APCuベンチマーク

WordPress 3.6 (Ubuntu 13.04, nginx 1.2.6)APC Object Cache Backend (http://http://wordpress.org/plugins/apc/)

[1] データ(オブジェクト)キャッシュ: Tribe Object Cache[2] ページキャッシュ: Batcache

クライアント( Webブラウザ )

クライアントクライアントクライアントクライアントキャッシュキャッシュキャッシュキャッシュ

ページキャッシュページキャッシュページキャッシュページキャッシュ

データデータデータデータキャッシュキャッシュキャッシュキャッシュ

オペコードオペコードオペコードオペコードキャッシュキャッシュキャッシュキャッシュ

出力

PHPスクリプト

レスポンス

リクエストWebサーバー/PHP

フラグメントキャッシュフラグメントキャッシュフラグメントキャッシュフラグメントキャッシュ

コンパイル

出力キャッシュ出力キャッシュ出力キャッシュ出力キャッシュ

実行

関数APIDB

パース

Opcache Opcache+APCu+[1] Opcache+APCu+[2]

58.48 67.18 (+15%) 2197.18 (+3657%)

Page 15: PHP 5.5ネーティブキャッシュの話

� PHP 5.5でついにオペコードキャッシュ標準搭載化!

�今後、PHPと共に進化していく(はず)

� アプリケーション、環境毎にパラメータ調整が必要

まとめ

PHP 5.5 ネーティブキャッシュで爆速化!