Skip to content
yowasou edited this page Aug 13, 2023 · 2 revisions

Hamamatsu.rb 125

今日の議事録

始める前に雑談

  • Langurさん久しぶり

Slackから話題

RubyのGCについて

  • 月次バッチ処理を作っていた

  • データ量が多いやつを実行したらコンテナが落ちた😅だんだん増えてって落ちる

  • EC2のFargateを使っています。メモリがオーバーするとFargateの判断でコンテナ落としてしまう

  • コンテナでメモリが0.5Gbくらい 100MBくらいRubyで使ってるのでは

  • DBはRDSなので別の場所にある

  • メモリ上げてもいいんだけど何とかしたい(富豪プログラミング!)

  • できれば貧乏プログラミングでなんとかしたい

  • ObjectSpace.memsize_of_all

  • https://blog.inouetakuya.info/entry/2015/07/26/204320

  • GC.startを入れると安定してくる...

  • find_in_batchとかのデフォルト取得数(1000個)が多かったりしたことがあった

  • module GC (Ruby 3.0.0 リファレンスマニュアル)

  • https://docs.ruby-lang.org/ja/latest/class/GC.html

  • GCのチューニングについて

  • チューニングのための環境変数

  • Jemma Issroff, Ruby Garbage Collection Deep Dive

  • https://jemma.dev/blog/ruby-garbage-collection-deep-dive/

  • DetailLog.within_shipped_at(from, to).distinct.pluck(:hoge_code)

  • select distinct hoge_code from detail_logs where shipped_ at < from between to > shipped_at

  • 6~8万件くらい取得

  • 最終的には文字列型だけが配列に

  • 84バイト×80,000=7MBくらい?

  • GC/メモリを使い果たさない限りは問題がないはず

  • ActiveRecordが使っているのか?ActiveRecord以外の犯人は無いかも

  • リークかどうかの判断は難しい

  • 富豪的プログラミング by 増井俊之 (富豪化理論研究家)

  • http://www.pitecan.com/fugo.html

  • 増井俊之 - Wikipedia

  • https://ja.wikipedia.org/wiki/%E5%A2%97%E4%BA%95%E4%BF%8A%E4%B9%8B

  • 業務コードなんで写せません

  • 外側に同じ名前の変数があって参照が生き続けてないか?

  • ⇒GC.Startを入れると安定するなら違うか…

@hogehoge_codes.each do |code|
  target_detail_logs = ::DetailLog.where(hogehoge_code: code).order(hogehoge_code: :asc)
  # いろいろ更新処理
  # target_detail_logs = nil
  # GC.start
end
    
hogehoge_codes.sort.in_groups_of(GROUP_SIZE, false).each do |codes|
    
target_detail_logs = ::DetailLog.where(hogehoge_code: code).order(hogehoge_code: :asc)
end
  • ActiveRecordのキャッシュクリア

  • ActiveRecord::Base.connection.query_cache.clear

  • https://www.fixes.pub/program/264206.html

  • コンテナはスワップできるのか?⇒スワップ指定もできます

  • メモリの圧縮はまだ3.0でも未実装

  • GC.auto_compact=(true)のオプションを入れると有効になるが、主要なコレクションのパフォーマンスが低下するらしい

  • 落ちたら続きからやるような処理はできない?⇒トランザクション使いたいので無理

  • 最適化 (情報工学)  格言 出典: フリー百科事典『ウィキペディア(Wikipedia)』

  • https://ja.wikipedia.org/wiki/%E6%9C%80%E9%81%A9%E5%8C%96_(%E6%83%85%E5%A0%B1%E5%B7%A5%E5%AD%A6)#%E6%A0%BC%E8%A8%80

  • 「細かい効率のことは忘れて、時間の97%について考えよう。時期尚早な最適化は諸悪の根源だ。それでも残り3%についても機会を逃すべきではない」[3] - ドナルド・クヌース

  • 「ボトルネックは思いもよらない場所に存在するので、ボトルネックの箇所を特定するまで性能最適化(ハック)してはいけない」 - ロブ・パイク

メモリ制限の書き方

プロダクションの Rails サーバーの利用メモリがひたすら増加していくような挙動を観測したとき、どう対応するのがよいですか?

参考になりそうな本

メモリ使用量の想定ってどうやって計算する?

  • あんまり計算しないかも

  • ざっくり計算して実測

  • 思い込みより実測が大事

  • OSによってヒープどれだけ違うかとかを意識しないといけない

  • 組み込みの世界はGCに頼らない書き方をしないといけない

  • ActiveRecord::Base.connection.query_cache.clear とかどうでしょう

Stimulusどうなんすかね

  • https://zenn.dev/cobachie/articles/tried-stimulus-2

  • フロントエンド作るためのフレームワーク

  • ERBみたいな感じでjsコードに置き換える

  • clickイベントを作ると自動でサーバーサイド側のコードまでバインディングされるみたいな

  • Turbo Streamsとかいうのもある

  • https://logmi.jp/tech/articles/324253

  • HotwireとかはJS側で受け取ったjsonを処理して画面のレンダリングに反映するのではなく、HTMLそのものを受けってそのままレンダリングする。

  • Hotwireとは何なのか?

  • https://zenn.dev/en30/articles/2e8e0c55c128e0

  • 車用語っぽい?

  • 書き方が分かりやすいかはちょっと疑問…❓

  • しばらく静観を決めつつもちょいちょい調べる

Basecamp

アプリケーションキラキラネームRuby始まり説

TypeScript

  • 型がついたJavascript

  • 時代は再び型?

  • O'Reilly Japan - JavaScript: The Good Parts

  • https://www.oreilly.co.jp/books/9784873113913

  • だんだん関数型に写っていく流れもある

  • クラスを作ってインスタンスを作って・・・という流れではなくなってきている

告知

次回のネタは

Hamamatsu.rb #125

KEEP

  • 久しぶりの参加! ★1
  • リアルタイム議事録 ★4
  • フリーテーマも良かった ★2
  • 直面してる問題について色々アドバイスもらえてたすかりました! ★1
  • 実運用の課題が聞けたのは助かる
  • 勉強になります ★2
  • カメラ買いました

PROBLEM

  • Ruby書いてないや ★1
  • GCむずかしい・・ ★1
  • 部屋が暑かった ★2
  • Stimulus と Hotwireもう少し調べてみます ★2

TRY

  • GCのお勉強 ★1
  • Ruby 3.0トライ(続) ★1
  • ネタを考える ★1
  • なんかLT
  • HotwireとStimulusちょっと調べてみる ★1
Clone this wiki locally