本当にあったRailsの怖い話

523 views

Published on

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

Published in: Technology
  • Be the first to comment

  • Be the first to like this

本当にあった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のキャッシュ化 他の怖い話、 お待ちしております!

×
Save this presentationTap To Close