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

Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
CSI Driverを開発し自社プライベートクラウドにより適した安全なKubernetes Secrets管理を実現した話
CSI Driverを開発し自社プライベートクラウドにより適した安全なKubernetes Secrets管理を実現した話CSI Driverを開発し自社プライベートクラウドにより適した安全なKubernetes Secrets管理を実現した話
CSI Driverを開発し自社プライベートクラウドにより適した安全なKubernetes Secrets管理を実現した話Katsuya Yamaguchi
 
大規模Redisサーバ縮小化の戦い
大規模Redisサーバ縮小化の戦い大規模Redisサーバ縮小化の戦い
大規模Redisサーバ縮小化の戦いYuto Komai
 
Akkaで分散システム入門
Akkaで分散システム入門Akkaで分散システム入門
Akkaで分散システム入門Shingo Omura
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかAtsushi Nakada
 
Istioサービスメッシュ入門
Istioサービスメッシュ入門Istioサービスメッシュ入門
Istioサービスメッシュ入門Yoichi Kawasaki
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法についてYuji Otani
 
インフラCICDの勘所
インフラCICDの勘所インフラCICDの勘所
インフラCICDの勘所Toru Makabe
 
KYC and identity on blockchain
KYC and identity on blockchainKYC and identity on blockchain
KYC and identity on blockchainmosa siru
 
Fargate起動歴1日の男が語る運用の勘どころ
Fargate起動歴1日の男が語る運用の勘どころFargate起動歴1日の男が語る運用の勘どころ
Fargate起動歴1日の男が語る運用の勘どころYuto Komai
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門Kohei Tokunaga
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ増田 亨
 
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/24Shin Ohno
 
人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with KarateTakanori Suzuki
 
DDD sample code explained in Java
DDD sample code explained in JavaDDD sample code explained in Java
DDD sample code explained in Java増田 亨
 
「これ危ない設定じゃないでしょうか」とヒアリングするための仕組み @AWS Summit Tokyo 2018
「これ危ない設定じゃないでしょうか」とヒアリングするための仕組み @AWS Summit Tokyo 2018「これ危ない設定じゃないでしょうか」とヒアリングするための仕組み @AWS Summit Tokyo 2018
「これ危ない設定じゃないでしょうか」とヒアリングするための仕組み @AWS Summit Tokyo 2018cyberagent
 
[AKIBA.AWS] VPCをネットワーク図で理解してみる
[AKIBA.AWS] VPCをネットワーク図で理解してみる[AKIBA.AWS] VPCをネットワーク図で理解してみる
[AKIBA.AWS] VPCをネットワーク図で理解してみるShuji Kikuchi
 

What's hot (20)

Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
CSI Driverを開発し自社プライベートクラウドにより適した安全なKubernetes Secrets管理を実現した話
CSI Driverを開発し自社プライベートクラウドにより適した安全なKubernetes Secrets管理を実現した話CSI Driverを開発し自社プライベートクラウドにより適した安全なKubernetes Secrets管理を実現した話
CSI Driverを開発し自社プライベートクラウドにより適した安全なKubernetes Secrets管理を実現した話
 
Oracle Database統合のベスト・プラクティス
Oracle Database統合のベスト・プラクティスOracle Database統合のベスト・プラクティス
Oracle Database統合のベスト・プラクティス
 
大規模Redisサーバ縮小化の戦い
大規模Redisサーバ縮小化の戦い大規模Redisサーバ縮小化の戦い
大規模Redisサーバ縮小化の戦い
 
Akkaで分散システム入門
Akkaで分散システム入門Akkaで分散システム入門
Akkaで分散システム入門
 
Infrastructure as Code (IaC) 談義 2022
Infrastructure as Code (IaC) 談義 2022Infrastructure as Code (IaC) 談義 2022
Infrastructure as Code (IaC) 談義 2022
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
 
Istioサービスメッシュ入門
Istioサービスメッシュ入門Istioサービスメッシュ入門
Istioサービスメッシュ入門
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
インフラCICDの勘所
インフラCICDの勘所インフラCICDの勘所
インフラCICDの勘所
 
KYC and identity on blockchain
KYC and identity on blockchainKYC and identity on blockchain
KYC and identity on blockchain
 
Fargate起動歴1日の男が語る運用の勘どころ
Fargate起動歴1日の男が語る運用の勘どころFargate起動歴1日の男が語る運用の勘どころ
Fargate起動歴1日の男が語る運用の勘どころ
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajpAt least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
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
 
人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate
 
DDD sample code explained in Java
DDD sample code explained in JavaDDD sample code explained in Java
DDD sample code explained in Java
 
「これ危ない設定じゃないでしょうか」とヒアリングするための仕組み @AWS Summit Tokyo 2018
「これ危ない設定じゃないでしょうか」とヒアリングするための仕組み @AWS Summit Tokyo 2018「これ危ない設定じゃないでしょうか」とヒアリングするための仕組み @AWS Summit Tokyo 2018
「これ危ない設定じゃないでしょうか」とヒアリングするための仕組み @AWS Summit Tokyo 2018
 
[AKIBA.AWS] VPCをネットワーク図で理解してみる
[AKIBA.AWS] VPCをネットワーク図で理解してみる[AKIBA.AWS] VPCをネットワーク図で理解してみる
[AKIBA.AWS] VPCをネットワーク図で理解してみる
 

Recently uploaded

クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑Akihiro Kadohata
 
Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )iwashiira2ctf
 
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521Satoshi Makita
 
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計atsushi061452
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdfAyachika Kitazaki
 
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)keikoitakurag
 
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptxssuserbefd24
 
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayersToru Tamaki
 
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose EstimationToru Tamaki
 
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員Sadaomi Nishi
 
情報を表現するときのポイント
情報を表現するときのポイント情報を表現するときのポイント
情報を表現するときのポイントonozaty
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一瑛一 西口
 

Recently uploaded (12)

クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
 
Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )
 
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
 
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf
 
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
 
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
 
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
 
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
 
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
 
情報を表現するときのポイント
情報を表現するときのポイント情報を表現するときのポイント
情報を表現するときのポイント
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
 

本当にあったRailsの怖い話