27
I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 - 藤原 吉規

I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

Embed Size (px)

Citation preview

Page 1: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

I/Oを極めろ! for PHPer- NewRelicを利用したパフォーマンス改善 -

藤原 吉規

Page 2: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

-自己紹介 -

ChatWork株式会社 藤原 吉規 技術部 サーバーエンジニア

ビジネスチャットツール「チャットワーク」を展開中

東京:18人

大阪:15人 USA:6人ルクセンブルクに子会社を設立

Page 3: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

チャットワークのご紹介

クラウド型ビジネスチャットツールチャットの効率性・シンプルさをビジネスへ

+

ビデオ通話

チャット タスク管理in the cloud

Page 4: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

導入ユーザー数46万ユーザー突破!

導入企業例:(2014年10月現在)

0

125000

250000

375000

500000

2011 6 9 12 2012 6 9 12 2013 6 9 12 2014 6 9

ユーザー数:

Page 5: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

アジェンダ

•はじめに

• 現在のインフラ構成

• NewRelicについて

• 具体的なボトルネックと改善例

Page 6: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

はじめに

• 2011年のサービス開始当初から、成長し続けるサービスを支えるための試行錯誤を実施

• 2013年からは、主にNewRelicを利用してサービスのボトルネックを計測しつつ改善

•今までボトルネックになった部分とのその改善方法をご紹介

Page 7: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

現在のインフラ構成

Page 8: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -
Page 9: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

NewRelicについて

Page 10: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

NewRelicについて

•アプリケーション・インフラのパフォーマンス監視サービス(有料)

• 各言語用のAgentをサーバーにインストールして利用

• Pluginを利用すると、AWSの各サービスや外部サービスの監視も可能

Page 11: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

改善サイクル

•NewRelicトレースログからボトルネック箇所の特定

• PHPのチャットコンサル等を利用して方針決定

• アプリケーション設計変更 or インフラスケールを決定

• NewRelicで改善確認

Page 12: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

具体的なボトルネックと 改善例

Page 13: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

Amazon S3 の問題

•チャットワークのファイル共有機能で利用

• Webサーバー経由のUpload/Downloadによるパフォーマンス低下

Page 14: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

Amazon S3 の解決策

•Pre-Signed URLを利用したUpload/Downloadに変更

• http://qiita.com/inokappa/items/dc3ef8b564c7d1f63be2

Page 15: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

Amazon EC2 の問題

•Elastic Block StorageのIO能力不足

• syslog

• php.ini、upload_tmp_dir(/tmp)

• TMPDIR(/tmp)

• putenv(‘TMPDIR=/tmp')

Page 16: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

Amazon EC2 の解決策

•Ephemeral Diskの利用

Page 17: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

memcached(ElastiCache)の問題

•大量のTIME_WAITとレスポンス低下

• ElastiCache側のCPU使用率の増大

Page 18: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

memcached(ElastiCache)の解決策

•php-memcachedの持続的接続を利用

• ini_set('session.save_path','PERSISTENT=1 localhost:11211');

• http://qiita.com/shin1x1/items/092588ac9b4f610b40d6

Page 19: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

MySQL(RDS)の問題

•マスタDBのCPU利用率増加

• デッドロック

• Replica遅延

Page 20: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

MySQL(RDS)の解決策

•接続タイムアウトの適切な指定

• $mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5)

• innodb_lock_wait_timeoutの指定

• $mysqli->query("SET innodb_lock_wait_timeout=5")

Page 21: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

MySQL(RDS)の解決策

•持続的接続の利用

• $mysqli->real_connect('p:localhost', 'my_user', 'my_password', 'my_db')

• AutoCommit OFF

• $mysqli->autocommit(FALSE);

Page 22: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

MySQL(RDS)の解決策

•mysqlnd.net_read_timeoutの指定

• http://jp1.php.net/manual/en/mysqlnd.config.php#ini.mysqlnd.net-read-timeout

Page 23: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

Amazon SQS,DynamoDB の問題

•大量のTIME_WAITとレスポンス低下

• AWS SDK for PHPのパフォーマンスが出ない

Page 24: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

Amazon SQS,DynamoDB の解決策

•カーネルパラメータ変更

• http://understeer.hatenablog.com/entry/2014/02/25/173810

!

/etc/sysctl.conf net.core.somaxconn = 10240 net.core.netdev_max_backlog = 10240 net.ipv4.tcp_max_syn_backlog = 10240 net.ipv4.tcp_max_syn_backlog = 10240 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.ip_local_port_range = 1024 65535 net.ipv4.tcp_fin_timeout = 10

Page 25: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

Amazon SQS,DynamoDB の解決策

•AWS SDK for PHP Performance Guide

• http://docs.aws.amazon.com/aws-sdk-php/guide/latest/performance.html

• Class Preloader for PHP

• https://github.com/mtdowling/ClassPreloader

Page 26: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

そして、Scalaへ!

Page 27: I/Oを極めろ! for PHPer - NewRelicを利用したパフォーマンス改善 -

ありがとうございました!