SlideShare ist ein Scribd-Unternehmen logo
1 von 51
Downloaden Sie, um offline zu lesen
本当にあった
Railsの怖い話
【⽒氏名】駒井  祐⼈人
【経歴】
  ・2012〜~2015    NTTデータ
  ・2015〜~2017    アカツキ
【発表】
  ・⼤大規模Redisサーバ縮⼩小化の戦い
  ・成功するハッカソンの法則    など
【イベント運営】
  ・Akatsuki  AWA  VR  Sound  Jam
  ・例例のカノジョハッカソン
  ・JPAJAM2017
  ・Meguro.es
  ・Meguro.rb  ←  New!!
⾃自⼰己紹介
【カレー歴】
・2015  アカツキ内でカレーを振舞う
・2016  アカツキ内でカレーを振舞う
・2017  交流流会でDeNA,ドリコム,  XFLAG,  
Craft  Eggさんなどにカレーを振舞う
・2017  Meguro.rbでカレーを振舞う←New!!
今⽇日の怖い話
怖い話その1.        クエリ神隠し  
怖い話その2.        クエリ⾦金金縛り
怖い話その3.        クエリ⻩黄泉還り
怖い話その1
クエリ神隠し
Railsで構築されたAPIサーバに負荷テスト
をしてました。
あるプロジェクトのお話
API  Server RDSgatling
負荷をかけると…
DBのCPU使⽤用率率率が100%に張り付く事案が
発⽣生
負荷をかけると…
調査をすすめる
・slowクエリを⾒見見てみよう
調査をすすめる
・slowクエリを⾒見見てみよう
→めっちゃ出てる
調査をすすめる
SELECT	
  	
  1	
  AS	
  one	
  FROM	
  `oauth2_mac_rails_users`	
  
WHERE	
  `oauth2_mac_rails_users`.`client_secret`	
  =	
  BINARY	
  ’XXX'	
  LIMIT	
  1;	
  
・slowクエリを⾒見見てみよう
→めっちゃ出てる
・このクエリを分析  (explain)すると?
調査をすすめる
SELECT	
  	
  1	
  AS	
  one	
  FROM	
  `oauth2_mac_rails_users`	
  
WHERE	
  `oauth2_mac_rails_users`.`client_secret`	
  =	
  BINARY	
  ’XXX'	
  LIMIT	
  1;	
  
・slowクエリを⾒見見てみよう
→めっちゃ出てる
・このクエリを分析  (explain)すると?
→フルスキャンやんけ!
調査をすすめる
SELECT	
  	
  1	
  AS	
  one	
  FROM	
  `oauth2_mac_rails_users`	
  
WHERE	
  `oauth2_mac_rails_users`.`client_secret`	
  =	
  BINARY	
  ’XXX'	
  LIMIT	
  1;	
  
・このクエリがどこで実⾏行行されてるか検索索
調査をすすめる
・このクエリがどこで実⾏行行されてるか検索索
→全く⾒見見つからない……
調査をすすめる
・このクエリがどこで実⾏行行されてるか検索索
→全く⾒見見つからない……
調査をすすめる
心霊現象
本当にあった
Railsの怖い話
クエリ神隠し
本気で調査
・発⾒見見!!
→uniqueness:  true  !!
本気で調査
・発⾒見見!!
→uniqueness:  true  !!
→Railsレイヤでuniqueness:  trueを設定す
るとuniquenessを担保するためにクエリが
実⾏行行される。これによりフルスキャン発⽣生
→不不要なvalidationだったので削除
本気で調査
・DBのCPU使⽤用率率率が100%から12%程度度に
神隠しを倒した結果
怖い話その2
クエリ⾦金金縛り
Railsで構築されたAPIサーバに負荷テスト
をしてました。
あるプロジェクトのお話
API  Server RDSJmeter
・あるテーブルのdeleteが異異常に重い事態が発⽣生
負荷をかけると…
・あるテーブルのdeleteが異異常に重い事態が発⽣生
・クエリの実態は単純なdelete⽂文が実⾏行行されてい
るだけ。
・他のテーブルへのdeleteは全く重くない
負荷をかけると…
DELETE	
  FROM	
  `gifts`	
  WHERE	
  `gifts`.`id`	
  =	
  XXX	
  
・あるテーブルのdeleteが異異常に重い事態が発⽣生
・クエリの実態は単純なdelete⽂文が実⾏行行されてい
るだけ。
・他のテーブルへのdeleteは全く重くない
負荷をかけると…
DELETE	
  FROM	
  `gifts`	
  WHERE	
  `gifts`.`id`	
  =	
  XXX	
  
心霊現象
本当にあった
Railsの怖い話
クエリ⾦金金縛り
本気で調査
・このテーブルは、created_̲atを1週間単位で
RANGE  COLUMNS  パーティショニングしている。
本気で調査
・このテーブルは、created_̲atを1週間単位で
RANGE  COLUMNS  パーティショニングしている。
・この量量、なんと10年年分!!
本気で調査
・⼀一⽅方、コード上はインスタンスを数回  
destroyしているだけ
・これが悪さをしている
本気で調査
・単純なid指定のdeleteだが、スキャン対
象パーティションが多すぎて重くなってい
た
本気で調査
DELETE	
  FROM	
  `gifts`	
  WHERE	
  `gifts`.`id`	
  =	
  XXX	
  
・明⽰示的にcreated_̲atを指定しパーティー
ションプルーニングを⾏行行うことで対処
※  パーティーションプルーニング
…  必要のないパーティションを省省くこと
本気で調査
・deleteの速度度が100倍に!!
⾦金金縛りを倒した結果
怖い話その3
クエリ⻩黄泉還り
Railsで構築されたAPIサーバに負荷テスト
をしてました。
あるプロジェクトのお話
API  Server RDSJmeter
このプロジェクト(村)の
しきたり
・メソッド結果をmemcachedにキャッ
シュする仕組みが導⼊入されていました
このプロジェクト(村)の
しきたり
・メソッド結果をmemcachedにキャッ
シュする仕組みが導⼊入されていました
・何でもかんでもキャッシュしている
このプロジェクト(村)の
しきたり
負荷をかけると…
・キャッシュしてる割にやったらクエリ量量
多いやんけ…
負荷をかけると…
コードを⾒見見ると
・いろんなクエリをキャッシュしている…
コードを⾒見見ると
・いろんなクエリをキャッシュしている…
・キャッシュしているがクエリは実⾏行行される
コードを⾒見見ると
・いろんなクエリをキャッシュしている…
・キャッシュしているがクエリは実⾏行行される
コードを⾒見見ると
心霊現象
本当にあった
Railsの怖い話
クエリ⻩黄泉還り
本気で調査
・ActiveRecord::Relation  objectをキャッシュしている
箇所を多数発⾒見見。
本気で調査
・ActiveRecord::Relation  objectをキャッシュしている
箇所を多数発⾒見見。
・ActiveRecord::Relation  は評価されるとDBにクエリが
⾶飛んでしまうため、Relationをキャッシュしても意味がな
い。(無駄なキャッシュ参照が増えているだけ)
本気で調査
・ActiveRecord::Relation  objectをキャッシュしている
箇所を多数発⾒見見。
・ActiveRecord::Relation  は評価されるとDBにクエリが
⾶飛んでしまうため、Relationをキャッシュしても意味がな
い。(無駄なキャッシュ参照が増えているだけ)
・to_̲a  などを呼んで実体化してからキャッシュする戦略略
もあるが、今回は全般的にロジックを書き換えて対処した。
本気で調査
今⽇日の怖い話  まとめ
  1.  クエリ神隠し
    uniquness:  trueによる余分クエリ
  2.  クエリ⾦金金縛り
    パーティショニング多過ぎ問題
  3.  クエリ⻩黄泉還り
    AR::Relationのキャッシュ化
今⽇日の怖い話  まとめ
  1.  クエリ神隠し
    uniquness:  trueによる余分クエリ
  2.  クエリ⾦金金縛り
    パーティショニング多過ぎ問題
  3.  クエリ⻩黄泉還り
    AR::Relationのキャッシュ化
他の怖い話、
お待ちしております!

Weitere ähnliche Inhalte

Was ist angesagt?

GraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることGraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることShingo Fukui
 
CloudFrontのリアルタイムログをKibanaで可視化しよう
CloudFrontのリアルタイムログをKibanaで可視化しようCloudFrontのリアルタイムログをKibanaで可視化しよう
CloudFrontのリアルタイムログをKibanaで可視化しようEiji KOMINAMI
 
Redis勉強会資料(2015/06 update)
Redis勉強会資料(2015/06 update)Redis勉強会資料(2015/06 update)
Redis勉強会資料(2015/06 update)Yuji Otani
 
ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)
ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)
ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)Amazon Web Services Japan
 
ログ解析基盤におけるストリーム処理パイプラインについて
ログ解析基盤におけるストリーム処理パイプラインについてログ解析基盤におけるストリーム処理パイプラインについて
ログ解析基盤におけるストリーム処理パイプラインについてcyberagent
 
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦いマイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦いota42y
 
コスト最適化概論
コスト最適化概論コスト最適化概論
コスト最適化概論RikiMakita
 
Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話KEISUKE KONISHI
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能Kohei Tokunaga
 
Rustで DDD を実践しながら API サーバーを実装・構築した(つもり)
Rustで DDD を実践しながら API サーバーを実装・構築した(つもり)Rustで DDD を実践しながら API サーバーを実装・構築した(つもり)
Rustで DDD を実践しながら API サーバーを実装・構築した(つもり)ShogoOkazaki
 
株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...
株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...
株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...Google Cloud Platform - Japan
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)Yoshitaka Kawashima
 
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介がっつりMongoDB事例紹介
がっつりMongoDB事例紹介Tetsutaro Watanabe
 
グリー株式会社『私たちが GCP を使い始めた本当の理由』第 9 回 Google Cloud INSIDE Game & Apps
グリー株式会社『私たちが GCP を使い始めた本当の理由』第 9 回 Google Cloud INSIDE Game & Appsグリー株式会社『私たちが GCP を使い始めた本当の理由』第 9 回 Google Cloud INSIDE Game & Apps
グリー株式会社『私たちが GCP を使い始めた本当の理由』第 9 回 Google Cloud INSIDE Game & AppsGoogle Cloud Platform - Japan
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践Yoshifumi Kawai
 
ログ管理のベストプラクティス
ログ管理のベストプラクティスログ管理のベストプラクティス
ログ管理のベストプラクティスAkihiro Kuwano
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話Kumazaki Hiroki
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAkihiro Kuwano
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールdcubeio
 

Was ist angesagt? (20)

GraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることGraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ること
 
CloudFrontのリアルタイムログをKibanaで可視化しよう
CloudFrontのリアルタイムログをKibanaで可視化しようCloudFrontのリアルタイムログをKibanaで可視化しよう
CloudFrontのリアルタイムログをKibanaで可視化しよう
 
Redis勉強会資料(2015/06 update)
Redis勉強会資料(2015/06 update)Redis勉強会資料(2015/06 update)
Redis勉強会資料(2015/06 update)
 
ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)
ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)
ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)
 
ログ解析基盤におけるストリーム処理パイプラインについて
ログ解析基盤におけるストリーム処理パイプラインについてログ解析基盤におけるストリーム処理パイプラインについて
ログ解析基盤におけるストリーム処理パイプラインについて
 
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦いマイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦い
 
コスト最適化概論
コスト最適化概論コスト最適化概論
コスト最適化概論
 
Quarkus入門
Quarkus入門Quarkus入門
Quarkus入門
 
Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能
 
Rustで DDD を実践しながら API サーバーを実装・構築した(つもり)
Rustで DDD を実践しながら API サーバーを実装・構築した(つもり)Rustで DDD を実践しながら API サーバーを実装・構築した(つもり)
Rustで DDD を実践しながら API サーバーを実装・構築した(つもり)
 
株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...
株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...
株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介がっつりMongoDB事例紹介
がっつりMongoDB事例紹介
 
グリー株式会社『私たちが GCP を使い始めた本当の理由』第 9 回 Google Cloud INSIDE Game & Apps
グリー株式会社『私たちが GCP を使い始めた本当の理由』第 9 回 Google Cloud INSIDE Game & Appsグリー株式会社『私たちが GCP を使い始めた本当の理由』第 9 回 Google Cloud INSIDE Game & Apps
グリー株式会社『私たちが GCP を使い始めた本当の理由』第 9 回 Google Cloud INSIDE Game & Apps
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
 
ログ管理のベストプラクティス
ログ管理のベストプラクティスログ管理のベストプラクティス
ログ管理のベストプラクティス
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
 

Kürzlich hochgeladen

PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 

Kürzlich hochgeladen (7)

PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 

本当にあったRailsの怖い話