Home
Slides
Blog
slide.seike460.com
Home
Slides
Blog
Home
Slides
プロ生勉強会 #55
プロ生勉強会 #55
プロ生勉強会 #55
2018年8月25日
General
Performance
Analysis
Tools
Keyboard Shortcuts
←
→
Navigate slides
Space
Next slide
F
Fullscreen
ESC
Exit fullscreen
Home
First slide
End
Last slide
B
.
Pause
S
Speaker notes
?
Reveal.js help
Close
## PHPアプリケーションにおける ## パフォーマンスチューニング プログラミング生放送勉強会 第55回@福岡 清家史郎(@seike460)
###### Who? Fusic Co., Ltd.  清家史郎  @seike460    
### tech - Program Language - PHP - Go - Elixir - infrastructure - Server - infrastructure as code - Network - Other - Serverless(AWS) - Vue.js
###### products ##### Go - s3ry (s3 prompt cli) - https://github.com/seike460/s3ry - utakata (Serverless Slack Notificatier) - https://github.com/seike460/utakata
##### Community - PHP - fukuoka.php - Go - fukuoka.go - Elixir - fukuoka.ex
###### Organizer - Serverless Meetup Fukuoka
#### Agenda - Why need performance? - Web - Application - DB(Data) - Sumally
#### Why need performance? - なぜパフォーマンスに気にする必要があるのか - 応答速度によるユーザの流出 - バーストアクセス時リソースの枯渇 - 処理効率による生産性の低下
- 考えるべき3つの層 - Web - Apache - ngnix - CDN - Application - PHP - DB(Data) - Postgresql、MySQL - Redis、Memcached、APCu
#### Web - コネクション数 - コンテンツキャッシュ - コンテンツの距離 - コンテンツの容量
#### コネクション数 WEBサーバの処理数を増やす - Apache (prefork) - StartServers - Min(Max)SpareServers - MaxClients - ngnix - worker_processes (基本auto) - worker_connections
#### コンテンツキャッシュ メモリ上にコンテンツをキャッシュして応答 - Apache - mod_cache(mod_mem_cache mode) - Nginx - proxy cache キャッシュ設計、キャッシュコントロールをしっかりすること
#### コンテンツの距離 ネットワーク遅延減らす為に 世界の各地にコンテンツを配置 - CDN(Content Delivery Network) - Akamai - Amazon CloudFront - Cloud CDN - Azure CDN TTL、キャッシュクリア制御を間違えると惨事に…
#### コンテンツの容量 適切なサイズのコンテンツを配信する - 運用・制限 - 画像リサイズ - 圧縮転送 - Apache -> mod_deflate - ngnix -> gzip
#### 効果確認 Chromeの開発者ツールで確認 - 開発者ツールの説明はとても多いので割愛 - NetworkタブでResponseHeaderが見れたり見てて楽しい 
#### Application(PHP) - 処理プロセス数 - OPcache - プロファイラ
#### 処理プロセス数 php-fpmのプロセス数を増やす - pm.start_servers - pm.min_spare_servers - pm.max_spare_servers ※mod_phpは Apache のプロセス数 = 処理プロセス数
#### OPcache コンパイル済みのバイトコードを共有メモリに保存する仕組み 必要に応じてキャッシュクリアも必要 (`opcache_reset()`) RedHat系 ``` $ sudo yum install php-opcache ``` php.iniに記述 ``` opcache.enable=1 opcache.enable_cli=1 ```
##### プロファイラ - xhprof - 公式版はPHP5では動いていたけど、PHP7では… - tideways_xhprof - tideways作成のxhprof
##### tideways_xhprofインストール phpizeが必要なのでphp-develもインストール ``` $ sudo yum install php-devel $ git clone https://github.com/tideways/php-xhprof-extension $ cd php-xhprof-extension $ phpize $ ./configure $ make $ sudo make install ``` ``` $ sudo vim /etc/php.ini 以下を追記 extension=tideways_xhprof.so ``` tideways_xhprof用の関数を作成出来るようになる
#### 利用方法 `tideways_xhprof_enable()`から`tideways_xhprof_disable()`までの間 関数の実行時間や実行回数をプロファイリングしてくれる ``` function hoge($i) { echo 'hoge' . $i; } function saveXhprofData() { $savePath = uniqid() . 'seike460.xhprof'; $data = tideways_xhprof_disable(); file_put_contents( $savePath, json_encode($data) ); } // プロファイリング開始 tideways_xhprof_enable(); // スクリプト終了時にデータ保存する関数 register_shutdown_function('saveXhprofData'); $i=1; while ($i < 100) { hoge($i); $i++; } ```
##### toolkit 出力ファイルをtidewaysのtoolkitに読み込ませる https://github.com/tideways/toolkit ※GoのTool ``` $ go get github.com/tideways/toolkit ``` ``` $ toolkit analyze-xhprof 5bd7e95b34f23.seike460.xhprof +----------+-------+-----------+------------------------------+ | FUNCTION | COUNT | WALL-TIME | EXCL WALL-TIME (>= 0.01 MS) | +----------+-------+-----------+------------------------------+ | hoge | 99 | 0.14 ms | 0.14 ms | | main() | 1 | 0.17 ms | 0.03 ms | +----------+-------+-----------+------------------------------+ ```
#### graphviz グラフ化して理解しやすい用に描画することも出来る ※graphvizのインストールが必要 ``` $ sudo wget http://www.graphviz.org/graphviz-rhel.repo -O /etc/yum.repos.d/graphviz-rhel.repo $ sudo yum --enablerepo=graphviz-stable install graphviz ``` RedHat系 ``` $ toolkit generate-xhprof-graphviz 5bd7e95b34f23.seike460.xhprof $ dot -Tpng callgraph.dot > callgraph.png $ open callgraph.png ```

#### Data(DB) - DB - Postgresql - MySQL - メモリキャッシュ - Redis - Memcached - APCu
#### DB - 遅いQueryを見つける - slowQuery設定 - 遅い原因を見つける - 実行計画
#### slowQuery設定 - 設定秒数以上かかったQueryをログ出力 - 出力されたQueryを見直す - Postgresql - log_min_duration_statement - MySQL - slow_query_log - long_query_time
#### 実行計画 EXPLAIN ANALYZE などの実行計画用SQLにて確認 Seq Scanなどの走査が走っていないかなどのチェック ``` pronama55=# EXPLAIN ANALYZE select * from users where name = '清家 史郎'; QUERY PLAN
Seq Scan on users (cost=0.00..511.54 rows=1 width=283) (actual time=0.411..0.781 rows=1 loops=1) Filter: (name = '清家 史郎'::text) Rows Removed by Filter: 4842 Planning time: 0.080 ms Execution time: 0.807 ms (5 rows) ```
#### メモリキャッシュ DB or ファイルから取得されているデータを 処理性能の早いメモリ上にキャッシュさせて速度向上をはかる - メモリキャッシュサーバ - Redis - Memcached - ローカルキャッシュ - APCu ``` $key = 'hoge'; if (apc_exists($key) ) { $val = apc_fetch($key); } else { $val = $db->get($key); apc_add($key, $val); } ```
#### Sumally - 基本的に3層アプリケーションのそれぞれに対応を行う - 感覚で対応するのでは無くて計測すること(ISUCONの凄いひとが言ってた) - Diskアクセス、Memoryアクセスなどのどこが早いのかなど意識して設計
Thank you! Fusicは技術が大好きなエンジニアを募集しています  https://fusic.github.io/
Swipe to navigate
Previous
Next
Related Slides
Fukuoka LT 2019
2019/12/20
View
kixs vol.8
2019/10/26
View
ちびでべろっぱぁ〜ず #11
2019/8/3
View