SlideShare une entreprise Scribd logo
1  sur  51
Télécharger pour lire hors ligne
本当にあった
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のキャッシュ化
他の怖い話、
お待ちしております!

Contenu connexe

Tendances

Tendances (20)

"Kong Summit, Japan 2022" パートナーセッション:Kong on AWS で実現するスケーラブルな API 基盤の構築
"Kong Summit, Japan 2022" パートナーセッション:Kong on AWS で実現するスケーラブルな API 基盤の構築"Kong Summit, Japan 2022" パートナーセッション:Kong on AWS で実現するスケーラブルな API 基盤の構築
"Kong Summit, Japan 2022" パートナーセッション:Kong on AWS で実現するスケーラブルな API 基盤の構築
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
インフラCICDの勘所
インフラCICDの勘所インフラCICDの勘所
インフラCICDの勘所
 
Kubernetes 疲れに Azure Container Apps はいかがでしょうか?(江東区合同ライトニングトーク 発表資料)
Kubernetes 疲れに Azure Container Apps はいかがでしょうか?(江東区合同ライトニングトーク 発表資料)Kubernetes 疲れに Azure Container Apps はいかがでしょうか?(江東区合同ライトニングトーク 発表資料)
Kubernetes 疲れに Azure Container Apps はいかがでしょうか?(江東区合同ライトニングトーク 発表資料)
 
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDayマイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
 
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCマイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPC
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
 
DeNA の AWS アカウント管理とセキュリティ監査自動化
DeNA の AWS アカウント管理とセキュリティ監査自動化DeNA の AWS アカウント管理とセキュリティ監査自動化
DeNA の AWS アカウント管理とセキュリティ監査自動化
 
[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)入門
 
Datadog による Container の監視について
Datadog による Container の監視についてDatadog による Container の監視について
Datadog による Container の監視について
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
GoとDDDでモバイルオーダープラットフォームを 型安全に作り直した話
GoとDDDでモバイルオーダープラットフォームを 型安全に作り直した話GoとDDDでモバイルオーダープラットフォームを 型安全に作り直した話
GoとDDDでモバイルオーダープラットフォームを 型安全に作り直した話
 
20190821 AWS Black Belt Online Seminar AWS AppSync
20190821 AWS Black Belt Online Seminar AWS AppSync20190821 AWS Black Belt Online Seminar AWS AppSync
20190821 AWS Black Belt Online Seminar AWS AppSync
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
株式会社コロプラ『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...
 
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design PatternAWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
 
Amazon EKS への道 ~ EKS 再入門 ~
Amazon EKS への道 ~ EKS 再入門 ~Amazon EKS への道 ~ EKS 再入門 ~
Amazon EKS への道 ~ EKS 再入門 ~
 

Dernier

Dernier (7)

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 

本当にあったRailsの怖い話