SlideShare a Scribd company logo
Web技術勉強会
Webパフォーマンス改善編
田実 誠
今回は一般的かつ超絶基本的なWeb/DBサーバ
のパフォーマンスチューニングに関するお話をします。
※C10Kとかマルチスレッドとかの話はしません
• Webサーバのパフォーマンス改善
• 基本的なHTMLの評価順序
• TCP Connection
• Keep-Alive
• CDN(RTT/キャッシュ)
• ブラウザのキャッシュ
• ドメインシャーディング
• 圧縮
• gzip
• minify/concat
• 非同期処理
• キューイング
• DBのパフォーマンス改善
• Index
• バッファキャッシュ
• NoSQL
アジェンダ
基本的なHTMLの評価順序
• ドキュメント(HTML)のロード
• DNS、TCP 3way、TLS、TCP
• HTMLのレンダリング
• JS, CSS, 画像ファイルのダウンロード
• DNS、TCP 3way、TLS、TCP
• JSの評価
Keep-Alive
• TCP 3way handshakeは時間のオーバーヘッドがあり効率的ではない
→TCP 3way handshakeを省略したい
• Keep-Aliveは一つのTCP接続を使い回す仕組み
→HTTPヘッダにConnection: Keep-Aliveを指定することでWebブラウザ側がTCP接続を使いま
わしてくれる
• HerokuはデフォルトでKeep-Aliveしてくれるっぽい(ブラウザ – Heroku Router間?)
HTTPリクエスト(HTMLくださーい)
HTTPレスポンス(HTML渡しまーす)
SYN(これから通信するよー)
SYN/ACK(OKよろしくー)
ACK(じゃあ次のリクエストで送るよー)
リクエスト/レスポンスの前段で200ms
Keep-Alive
• オレンジ=>TCP 3way handshake
• 緑=>TTFB(Time To First Byte):HTTPリクエストからレスポンスのfirst byteまでの時間
• 青=>ダウンロード時間
• 灰色=>待機時間
• 紫=>TLS handshake
• 緑+青=>HTTPリクエスト~HTTPレスポンスを全て受け取るまでの時間
Keep-Alive
2回目以降はTCP接続を使い回すようになっている
ちなみにTLSありだと…
• TLS/SSLハンドシェイク分のオーバーヘッドがかかるが、こちらも使い回しの概念が有る
CDNによる改善
• Contents Delivery Network
→静的コンテンツを返すためのサーバ
• Akamai、Cloud Front(AWS)、cloud flare
• 負荷分散(静的コンテンツはCDN、動的コンテンツはアプリサーバ)
• クライアントから一番近いエッジサーバ(配信サーバ)からファイルを取得
→レイテンシ(RTT)の改善
• CDNが各リソース(静的ファイル)をキャッシュするので高速なレスポンスを実現
→アプリケーションサーバが静的ファイルを返すよりかは効率的
Client CDN Webサーバ
キャッシュ切れの時だけ
リクエスト
静的ファイル
リクエスト
レスポンス(CDNのキャッシュ)
CDNのエッジサーバに対するアクセス
出典:http://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-tech-amazon-cloudfront
ブラウザキャッシュによる改善
• HTTPのキャッシュ機構を利用して、ブラウザ自体にHTTPレスポンスをキャッシュし、レスポンスを使い
回す→これを使って静的ファイルのロード短縮が可能
• Cache-Control、Expiresヘッダを使ってブラウザにキャッシュの有効期限を伝達
キャッシュを利用しているので
Heavy.js(1.7MB)のロード時間が短縮される
ドメインシャーディングによる改善
• ブラウザの同一ドメインに対するHTTP同時接続数は6つまで
• ドメインを分けてリクエストすればMAX同時接続数をドメイン数×6まで伸ばせる
同時!
圧縮(gzip)
圧縮前
圧縮後(1.7MB=>12.3KBに圧縮)
圧縮(minify/concat)
• JavaScriptのソースコードをminifyすることでファイルを小さくできる
→構文上削除しても問題ない改行や空白の削除、変数名を短くしたり
• 複数のJavaScriptを読みこませる場合は、読み込ませる順番にJavaScriptを連結すればクライア
ント側は一つのJavaScriptをダウンロードすれば良いのでTCP接続としては効率的
• webpackは画像ファイルもBase64形式でJSファイルに取り込む
• AngularのminifyタスクではテンプレートのHTMLファイルでさえJSファイルにする。そのHTML
ファイルの内容も改行等の無駄な文字列を削除したり…
• CSSスプライトもTCP接続数削減の一つ
重い処理は非同期に
• 画像処理等の重い処理は非同期にして他のサーバ(ワーカ)に処理を回す
• Herokuでは1リクエスト30秒ルールがあるので、重い処理はワーカー等を使った非同期処理に回す
※Herokuに限らず同期処理で30秒待たされるのはUX的にNGな感じだと思うので一般的な話とし
て…
• SQS(AWS)、RabbitMQ(AMQP)、Redis(Resqueとか併用して)
workerQueue
Enqueue Dequeue
Client
HTTP/2
• TCP接続の多重化(一つのTCP接続で複数のリクエストを同時に実行できる)
→アセットの結合がいらなくなる?
• バイナリープロトコル(HTTP/1.1はテキストプロトコル)
• ヘッダ圧縮
• 優先度制御
• サーバプッシュ
リクエスト1
レスポンス1
リクエスト2
リクエスト2
リクエスト3
リクエスト3
DBパフォーマンス改善
• Indexを効かせるSQL(EXPLAINを見る)
• 効率的なSQL(INとかJOINを使って、できるだけまとめて取得する)
• O/Rマッパだと良くも悪くもSQLが隠蔽されてしまうのでパフォーマンスの悪い箇所はSQL文をデバッグして確かめる
• コネクションプール(TCP 3way handshakeと接続処理の省略)
• メモリ系のDB設定値の調整
• ファイルキャッシュ(メモリに載せよう)※後述
• メモリが足りなければスケールアップ(メモリ増設)を検討
• JOINでコストがかかるクエリは予めJOINさせる
• 全文検索はElasticSearch等の全文検索エンジンを使う
• 利用できればNoSQLと併用
• MemcachedやRedisなどのインメモリ系KVSはアプリキャッシュとして有用
• シャーディング/テーブル分割/非正規化
Linuxファイルキャッシュ(ページキャッシュ)
• Linuxには開いたファイルの内容を自動的にキャッシュする機構がある
• RDBのレコード読み込みも結局のところファイル読み込みなので、DBのファイルがメモリに乗ればインメモリDBっぽ
く処理される(とはいえNoSQLのインメモリDBは色々と最適化されているので性能差は大きい)
SELECT * FROM performance_test WHERE int_field = 10000000;
ページキャッシュ HDD SSD
× 27674.021 ms 13330.887 ms
○ 4516.920 ms 4642.373 ms
メモリに載ってしまえば、ディ
スクは関係ない
クエリによるが3~4倍くらいの差
HDDとSSDの速度差は
2倍くらい?
どうやってボトルネックを探すか?
• Chrome Developer Tool
• クライアントから見たパフォーマンス/挙動を確認可能
• HTTPのRTT、ファイルサイズ、TCP接続数
• NewRelic
• アプリに特定のコードを仕込むことでアプリケーションサイドのパフォーマンスを確認可能
• CPUを使いまくって遅い(画像処理等)のであれば非同期化
• I/O系が遅いのであれば…
• DB→SQLのチューニング or インメモリなNoSQLを使うとか
• Webサービス→非同期化
• 各RDBのEXPLAIN
• Indexが効くSQLに
• DBの設定
• RTTの壁は超えれないので何とか工夫する
• TCP接続の特性を理解して正しいチューニングをしましょう
• Keep-alive
• ドメインシャーディング
• CDN
• キャッシュ
• 圧縮(gzip, minify)
• 重い処理は非同期で。ワーカーに回して負荷分散。
• HTTP/2が色々と解決してくれるかも
• DBは基本的なSQLのチューニングとインメモリKVSによるアプリキャッシュ等で工夫する
まとめ
• ブラウザのキャッシュコントロールについて
http://qiita.com/hkusu/items/d40aa8a70bacd2015dfa
• Heroku Router
https://devcenter.heroku.com/articles/http-routing
• 書籍
• ハイパフォーマンス ブラウザネットワーキング ―ネットワークアプリケーションのためのパフォーマンス最適化
• SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)
• 内部構造から学ぶPostgreSQL 設計・運用計画の鉄則 (Software Design plus)
• ウェブパフォーマンスの基礎とこれから
http://www.slideshare.net/kawada_hiroshi/ss-46149727
• HTTP/2
http://www.slideshare.net/kazuho/http2-51888328
http://www.slideshare.net/asumaslv/http2-57141644
• ファイルキャッシュ
http://d.hatena.ne.jp/naoya/20070521/1179754203
• コネクションプール
http://blog.yuuk.io/entry/architecture-of-database-connection
参考URL

More Related Content

PDF
Mavenの真実とウソ
PDF
Kuberneteの運用を支えるGitOps
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
PPTX
ネットワーク機器のAPIあれこれ入門 (NetOpsCoding#2)
PDF
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
PDF
構成情報データベースをGitで管理したいネットワーク運用者の憂鬱
PDF
"Yahoo! JAPAN の Kubernetes-as-a-Service" で加速するアプリケーション開発
PDF
大規模サービスを支えるネットワークインフラの全貌
Mavenの真実とウソ
Kuberneteの運用を支えるGitOps
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
ネットワーク機器のAPIあれこれ入門 (NetOpsCoding#2)
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
構成情報データベースをGitで管理したいネットワーク運用者の憂鬱
"Yahoo! JAPAN の Kubernetes-as-a-Service" で加速するアプリケーション開発
大規模サービスを支えるネットワークインフラの全貌

What's hot (20)

PDF
UnboundとNSDの紹介 BIND9との比較編
PDF
グラフデータベース:Neo4j、そしてRDBからの移行手順の紹介
PDF
[GKE & Spanner 勉強会] GKE 入門
PDF
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
PDF
BGP Unnumbered で遊んでみた
PDF
[D20] 高速Software Switch/Router 開発から得られた高性能ソフトウェアルータ・スイッチ活用の知見 (July Tech Fest...
PDF
Javaはどのように動くのか~スライドでわかるJVMの仕組み
PDF
なぜディスクレスハイパーバイザに至ったのか / Why did we select to the diskless hypervisor? #builde...
PDF
Kubernetesの良さを活かして開発・運用!Cloud Native入門 / An introductory Cloud Native #osc19tk
PDF
そろそろレガシーな.Net開発をやめなイカ?
PDF
"SRv6の現状と展望" ENOG53@上越
PPTX
「おうちクラウド」が今熱い!
PDF
Micrometer/Prometheusによる大規模システムモニタリング #jsug #sf_26
PPTX
Spring CloudとZipkinを利用した分散トレーシング
PPTX
Jenkins x Kubernetesが簡単だと思ったら大変だった話
PDF
さくらのVPS で IPv4 over IPv6ルータの構築
PDF
「ドメイン駆動設計」の複雑さに立ち向かう
PDF
ネットワークでなぜ遅延が生じるのか
PDF
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
UnboundとNSDの紹介 BIND9との比較編
グラフデータベース:Neo4j、そしてRDBからの移行手順の紹介
[GKE & Spanner 勉強会] GKE 入門
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
BGP Unnumbered で遊んでみた
[D20] 高速Software Switch/Router 開発から得られた高性能ソフトウェアルータ・スイッチ活用の知見 (July Tech Fest...
Javaはどのように動くのか~スライドでわかるJVMの仕組み
なぜディスクレスハイパーバイザに至ったのか / Why did we select to the diskless hypervisor? #builde...
Kubernetesの良さを活かして開発・運用!Cloud Native入門 / An introductory Cloud Native #osc19tk
そろそろレガシーな.Net開発をやめなイカ?
"SRv6の現状と展望" ENOG53@上越
「おうちクラウド」が今熱い!
Micrometer/Prometheusによる大規模システムモニタリング #jsug #sf_26
Spring CloudとZipkinを利用した分散トレーシング
Jenkins x Kubernetesが簡単だと思ったら大変だった話
さくらのVPS で IPv4 over IPv6ルータの構築
「ドメイン駆動設計」の複雑さに立ち向かう
ネットワークでなぜ遅延が生じるのか
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
Ad

Viewers also liked (10)

PDF
いろいろなSSL/TLS設定ガイドライン (JNSA電子署名WG 実世界の暗号・認証技術勉強会資料)
PDF
セキュリティ勉強会 暗号技術入門 1章
PPTX
私はここでつまづいた! Oracle database 11g から 12cへのアップグレードと Oracle Database 12c の新機能@201...
PDF
第3回web技術勉強会 暗号技術編その1
PDF
qpstudy 2015.11.14 一歩先を行くインフラエンジニアに知ってほしいSSL/TLS
PDF
第4回web技術勉強会 暗号技術編その2
PDF
第5回web技術勉強会 暗号技術編その3
PPTX
Analytics CloudとEmbulkを使った社会的データの分析
PDF
Certificate TransparencyによるSSLサーバー証明書公開監査情報とその課題の議論
PDF
introduction to jsrsasign
いろいろなSSL/TLS設定ガイドライン (JNSA電子署名WG 実世界の暗号・認証技術勉強会資料)
セキュリティ勉強会 暗号技術入門 1章
私はここでつまづいた! Oracle database 11g から 12cへのアップグレードと Oracle Database 12c の新機能@201...
第3回web技術勉強会 暗号技術編その1
qpstudy 2015.11.14 一歩先を行くインフラエンジニアに知ってほしいSSL/TLS
第4回web技術勉強会 暗号技術編その2
第5回web技術勉強会 暗号技術編その3
Analytics CloudとEmbulkを使った社会的データの分析
Certificate TransparencyによるSSLサーバー証明書公開監査情報とその課題の議論
introduction to jsrsasign
Ad

Similar to 第2回Web技術勉強会 webパフォーマンス改善編 (17)

KEY
Tuiningathonにいってみた
PPTX
AWSとmod_pagespeedで 楽々サクサク高速化!!
PDF
WTM52 あなたの作ったWEBサイト、生きてますか?
PPT
2013/2/15 gooya社内ディスカッション「早いサイト」石川チーム資料
PPTX
今だから!Amazon CloudFront 徹底活用
PDF
高速化はじめの一歩
PDF
WordBench Saitama vol.6
PDF
Aws summits2014 amazon_cloudfrontを利用したサイト高速化とセキュア配信
PDF
2012/6/10 Webのパフォーマンスを考える @ 【第三回】初心者向けホームページ勉強会
PPTX
サーバーの初歩的な話セミナー@大阪20120901
PDF
20191204_WordPressの教科書出版記念イベント_パフォーマンスチューニングとセキュリティ_小川
PPT
Yahoo!検索のパフォーマンス向上策全て見せます
PDF
スタートアップ向け!1人日でできるサービスの高速化方法と成果
KEY
PHP-Ninjaの裏側
PDF
WordCamp Yokohama 2010 Komori
PDF
通信と放送の融合を考えるBoF 5
PDF
Node.js で SPDYのベンチマーク体験サイトを作りました
Tuiningathonにいってみた
AWSとmod_pagespeedで 楽々サクサク高速化!!
WTM52 あなたの作ったWEBサイト、生きてますか?
2013/2/15 gooya社内ディスカッション「早いサイト」石川チーム資料
今だから!Amazon CloudFront 徹底活用
高速化はじめの一歩
WordBench Saitama vol.6
Aws summits2014 amazon_cloudfrontを利用したサイト高速化とセキュア配信
2012/6/10 Webのパフォーマンスを考える @ 【第三回】初心者向けホームページ勉強会
サーバーの初歩的な話セミナー@大阪20120901
20191204_WordPressの教科書出版記念イベント_パフォーマンスチューニングとセキュリティ_小川
Yahoo!検索のパフォーマンス向上策全て見せます
スタートアップ向け!1人日でできるサービスの高速化方法と成果
PHP-Ninjaの裏側
WordCamp Yokohama 2010 Komori
通信と放送の融合を考えるBoF 5
Node.js で SPDYのベンチマーク体験サイトを作りました

More from tzm_freedom (11)

PDF
Apex on Local - Better Alternative to Salesforce DX
PDF
PDF
C初心者がbyebugにPR出した話
PDF
APIテストあれこれ
PDF
第一回Web技術勉強会 efkスタック編
PDF
第三回IoT関連技術勉強会 データ通信編
PDF
第二回IoT関連技術勉強会 ログ収集編
PDF
第一回IoT関連技術勉強会 分散処理編
PDF
ElectronでExactTargetのGUIツールを作ってみた話
PDF
ApexからAWS IoT叩いてみた話
PDF
Dreamforce '15のお話
Apex on Local - Better Alternative to Salesforce DX
C初心者がbyebugにPR出した話
APIテストあれこれ
第一回Web技術勉強会 efkスタック編
第三回IoT関連技術勉強会 データ通信編
第二回IoT関連技術勉強会 ログ収集編
第一回IoT関連技術勉強会 分散処理編
ElectronでExactTargetのGUIツールを作ってみた話
ApexからAWS IoT叩いてみた話
Dreamforce '15のお話

第2回Web技術勉強会 webパフォーマンス改善編