Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

本当にあったRailsの怖い話

15,469 views

Published on

meguro.rb#9で発表した資料です
「心霊現象」という文字が映らない心霊現象が発生しております。

Published in: Technology
  • Hello! Get Your Professional Job-Winning Resume Here - Check our website! https://vk.cc/818RFv
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

本当にあったRailsの怖い話

  1. 1. 本当にあった Railsの怖い話
  2. 2. 【⽒氏名】駒井  祐⼈人 【経歴】   ・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!!
  3. 3. 今⽇日の怖い話 怖い話その1.        クエリ神隠し   怖い話その2.        クエリ⾦金金縛り 怖い話その3.        クエリ⻩黄泉還り
  4. 4. 怖い話その1 クエリ神隠し
  5. 5. Railsで構築されたAPIサーバに負荷テスト をしてました。 あるプロジェクトのお話 API  Server RDSgatling
  6. 6. 負荷をかけると…
  7. 7. DBのCPU使⽤用率率率が100%に張り付く事案が 発⽣生 負荷をかけると…
  8. 8. 調査をすすめる
  9. 9. ・slowクエリを⾒見見てみよう 調査をすすめる
  10. 10. ・slowクエリを⾒見見てみよう →めっちゃ出てる 調査をすすめる SELECT    1  AS  one  FROM  `oauth2_mac_rails_users`   WHERE  `oauth2_mac_rails_users`.`client_secret`  =  BINARY  ’XXX'  LIMIT  1;  
  11. 11. ・slowクエリを⾒見見てみよう →めっちゃ出てる ・このクエリを分析  (explain)すると? 調査をすすめる SELECT    1  AS  one  FROM  `oauth2_mac_rails_users`   WHERE  `oauth2_mac_rails_users`.`client_secret`  =  BINARY  ’XXX'  LIMIT  1;  
  12. 12. ・slowクエリを⾒見見てみよう →めっちゃ出てる ・このクエリを分析  (explain)すると? →フルスキャンやんけ! 調査をすすめる SELECT    1  AS  one  FROM  `oauth2_mac_rails_users`   WHERE  `oauth2_mac_rails_users`.`client_secret`  =  BINARY  ’XXX'  LIMIT  1;  
  13. 13. ・このクエリがどこで実⾏行行されてるか検索索 調査をすすめる
  14. 14. ・このクエリがどこで実⾏行行されてるか検索索 →全く⾒見見つからない…… 調査をすすめる
  15. 15. ・このクエリがどこで実⾏行行されてるか検索索 →全く⾒見見つからない…… 調査をすすめる 心霊現象
  16. 16. 本当にあった Railsの怖い話 クエリ神隠し
  17. 17. 本気で調査
  18. 18. ・発⾒見見!! →uniqueness:  true  !! 本気で調査
  19. 19. ・発⾒見見!! →uniqueness:  true  !! →Railsレイヤでuniqueness:  trueを設定す るとuniquenessを担保するためにクエリが 実⾏行行される。これによりフルスキャン発⽣生 →不不要なvalidationだったので削除 本気で調査
  20. 20. ・DBのCPU使⽤用率率率が100%から12%程度度に 神隠しを倒した結果
  21. 21. 怖い話その2 クエリ⾦金金縛り
  22. 22. Railsで構築されたAPIサーバに負荷テスト をしてました。 あるプロジェクトのお話 API  Server RDSJmeter
  23. 23. ・あるテーブルのdeleteが異異常に重い事態が発⽣生 負荷をかけると…
  24. 24. ・あるテーブルのdeleteが異異常に重い事態が発⽣生 ・クエリの実態は単純なdelete⽂文が実⾏行行されてい るだけ。 ・他のテーブルへのdeleteは全く重くない 負荷をかけると… DELETE  FROM  `gifts`  WHERE  `gifts`.`id`  =  XXX  
  25. 25. ・あるテーブルのdeleteが異異常に重い事態が発⽣生 ・クエリの実態は単純なdelete⽂文が実⾏行行されてい るだけ。 ・他のテーブルへのdeleteは全く重くない 負荷をかけると… DELETE  FROM  `gifts`  WHERE  `gifts`.`id`  =  XXX   心霊現象
  26. 26. 本当にあった Railsの怖い話 クエリ⾦金金縛り
  27. 27. 本気で調査
  28. 28. ・このテーブルは、created_̲atを1週間単位で RANGE  COLUMNS  パーティショニングしている。 本気で調査
  29. 29. ・このテーブルは、created_̲atを1週間単位で RANGE  COLUMNS  パーティショニングしている。 ・この量量、なんと10年年分!! 本気で調査
  30. 30. ・⼀一⽅方、コード上はインスタンスを数回   destroyしているだけ ・これが悪さをしている 本気で調査
  31. 31. ・単純なid指定のdeleteだが、スキャン対 象パーティションが多すぎて重くなってい た 本気で調査 DELETE  FROM  `gifts`  WHERE  `gifts`.`id`  =  XXX  
  32. 32. ・明⽰示的にcreated_̲atを指定しパーティー ションプルーニングを⾏行行うことで対処 ※  パーティーションプルーニング …  必要のないパーティションを省省くこと 本気で調査
  33. 33. ・deleteの速度度が100倍に!! ⾦金金縛りを倒した結果
  34. 34. 怖い話その3 クエリ⻩黄泉還り
  35. 35. Railsで構築されたAPIサーバに負荷テスト をしてました。 あるプロジェクトのお話 API  Server RDSJmeter
  36. 36. このプロジェクト(村)の しきたり
  37. 37. ・メソッド結果をmemcachedにキャッ シュする仕組みが導⼊入されていました このプロジェクト(村)の しきたり
  38. 38. ・メソッド結果をmemcachedにキャッ シュする仕組みが導⼊入されていました ・何でもかんでもキャッシュしている このプロジェクト(村)の しきたり
  39. 39. 負荷をかけると…
  40. 40. ・キャッシュしてる割にやったらクエリ量量 多いやんけ… 負荷をかけると…
  41. 41. コードを⾒見見ると
  42. 42. ・いろんなクエリをキャッシュしている… コードを⾒見見ると
  43. 43. ・いろんなクエリをキャッシュしている… ・キャッシュしているがクエリは実⾏行行される コードを⾒見見ると
  44. 44. ・いろんなクエリをキャッシュしている… ・キャッシュしているがクエリは実⾏行行される コードを⾒見見ると 心霊現象
  45. 45. 本当にあった Railsの怖い話 クエリ⻩黄泉還り
  46. 46. 本気で調査
  47. 47. ・ActiveRecord::Relation  objectをキャッシュしている 箇所を多数発⾒見見。 本気で調査
  48. 48. ・ActiveRecord::Relation  objectをキャッシュしている 箇所を多数発⾒見見。 ・ActiveRecord::Relation  は評価されるとDBにクエリが ⾶飛んでしまうため、Relationをキャッシュしても意味がな い。(無駄なキャッシュ参照が増えているだけ) 本気で調査
  49. 49. ・ActiveRecord::Relation  objectをキャッシュしている 箇所を多数発⾒見見。 ・ActiveRecord::Relation  は評価されるとDBにクエリが ⾶飛んでしまうため、Relationをキャッシュしても意味がな い。(無駄なキャッシュ参照が増えているだけ) ・to_̲a  などを呼んで実体化してからキャッシュする戦略略 もあるが、今回は全般的にロジックを書き換えて対処した。 本気で調査
  50. 50. 今⽇日の怖い話  まとめ   1.  クエリ神隠し     uniquness:  trueによる余分クエリ   2.  クエリ⾦金金縛り     パーティショニング多過ぎ問題   3.  クエリ⻩黄泉還り     AR::Relationのキャッシュ化
  51. 51. 今⽇日の怖い話  まとめ   1.  クエリ神隠し     uniquness:  trueによる余分クエリ   2.  クエリ⾦金金縛り     パーティショニング多過ぎ問題   3.  クエリ⻩黄泉還り     AR::Relationのキャッシュ化 他の怖い話、 お待ちしております!

×