SlideShare a Scribd company logo
1 of 51
Download to read offline
本当にあった
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のキャッシュ化
他の怖い話、
お待ちしております!

More Related Content

What's hot

What's hot (20)

自己紹介LT(公開版)
自己紹介LT(公開版)自己紹介LT(公開版)
自己紹介LT(公開版)
 
DevOpsにおけるAnsibleの立ち位置と使い所
DevOpsにおけるAnsibleの立ち位置と使い所DevOpsにおけるAnsibleの立ち位置と使い所
DevOpsにおけるAnsibleの立ち位置と使い所
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクル
 
[JAWS DAYS 2019] Amazon DocumentDB(with MongoDB Compatibility)入門
[JAWS DAYS 2019] Amazon DocumentDB(with MongoDB Compatibility)入門[JAWS DAYS 2019] Amazon DocumentDB(with MongoDB Compatibility)入門
[JAWS DAYS 2019] Amazon DocumentDB(with MongoDB Compatibility)入門
 
モニタリングプラットフォーム開発の裏側
モニタリングプラットフォーム開発の裏側モニタリングプラットフォーム開発の裏側
モニタリングプラットフォーム開発の裏側
 
Istioサービスメッシュ入門
Istioサービスメッシュ入門Istioサービスメッシュ入門
Istioサービスメッシュ入門
 
Java仮想マシンの実装技術
Java仮想マシンの実装技術Java仮想マシンの実装技術
Java仮想マシンの実装技術
 
NGSI によるデータ・モデリング - FIWARE WednesdayWebinars
NGSI によるデータ・モデリング - FIWARE WednesdayWebinarsNGSI によるデータ・モデリング - FIWARE WednesdayWebinars
NGSI によるデータ・モデリング - FIWARE WednesdayWebinars
 
とにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みるとにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みる
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみよう
 
Kongの概要と導入事例
Kongの概要と導入事例Kongの概要と導入事例
Kongの概要と導入事例
 
PostgreSQLでスケールアウト
PostgreSQLでスケールアウトPostgreSQLでスケールアウト
PostgreSQLでスケールアウト
 
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応までDocker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
 
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
ストリーム処理プラットフォームにおけるKafka導入事例 #kafkajp
ストリーム処理プラットフォームにおけるKafka導入事例 #kafkajpストリーム処理プラットフォームにおけるKafka導入事例 #kafkajp
ストリーム処理プラットフォームにおけるKafka導入事例 #kafkajp
 
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
 
【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践
【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践
【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践
 
HANAのハナシの基本のき
HANAのハナシの基本のきHANAのハナシの基本のき
HANAのハナシの基本のき
 

Recently uploaded

Recently uploaded (12)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 

本当にあったRailsの怖い話