らいむぎばたけ

つかまえなくてだいじょうぶ

🐟ISUCON12 の予選に参加した🌼

ISUCON12 にうなすけとやままの 3 人で「たんぽぽの上の刺身」で参加した。おととしの 🐟ISUCON10 の予選に参加した🌼 - らいむぎばたけ が初参加で、ISUCON11 にも出たので 3 回目の参加になった。去年は終了数分前になにかをマージした結果、ベンチが落ちて 0 点になり無力感がすごくて何も書けなかった。

気を取り直して ISUCON12 の結果は、スコア 3765 でリーダーボードの結果によると328 位だった。

やままの記事はこちら ISUCON12 の予選に参加した - きりきりやま

やったこと

  • select * になっているところを必要なものだけをとってきたり
    • 点数上がった気がするけど誤差
  • 不要な SQL 叩いているところを消したり
    • そもそもそんなに叩かれている箇所では無かったので点数伸びず
  • N+1 修正で bulk insert にしたり
    • 思いの外伸びなかった
  • 大会終了後に訪問した人をそもそも SQL でとってこないようにしたり
    • これが一番伸びた

どれもこれも 500 点くらいしか上がらないようなことしかできなかった。無力。

今年もお疲れ様でした。来年もがんばります。

ひとつの Rails アプリから 複数の Sidekiq プロセスを扱う

ひとつの Rails アプリで Sidekiq worker によって使う Redis を分けたい。

Sidekiq のプロセスはひとつの Redis と接続することを前提としているので、複数の Redis と接続する場合には Redis の数に合わせて Sidekiq のプロセスが必要になる。

ここではふたつの Sidekiq プロセスを扱い、接続先の Redis の URL は全て環境変数に入れるものとして書く。

config/initializers/sidekiq.rb

Sidekiq.configure_server do |config|
  config.redis = { url: ENV['REDIS_URL'] }
end

Sidekiq.configure_client do |config|
  config.redis = { url: ENV['REDIS_1_URL'] }
end

ざっくりと、 server は dequeue するほう (Sidekiq プロセス)、client は enqueue するほう (Rails アプリ) 。

client 側の設定は、とりあえずメインで接続するほうの Redis を設定しておけば良い。

Rails アプリの環境変数

  • REDIS_1_URL=redis://redis_1:6379
  • REDIS_2_URL=redis://redis_2:6379

Rails アプリ側では Redis の数だけ環境変数を用意する。

worker ひとつめ

ひとつめの worker はメインで接続するほうの Redis を使っているので普通に何も気にせず書いたら良い。

class Worker1
  include Sidekiq::Worker

  def perform(*args)
  end
end

Worker1.perform_async()

Sidekiq プロセスの環境変数

  • REDIS_URL=redis://redis_1:6379

worker ふたつめ

ふたつめの worker は、呼び出し側で接続先が違うことを書かないといけない。 詳しくはここにかいてある。 Sharding · mperham/sidekiq Wiki

class Worker2
  include Sidekiq::Worker

  def perform(*args)
  end
end

redis_2 = ConnectionPool.new { Redis.new(url: ENV['REDIS_2_URL']) }
Sidekiq::Client.via(redis_2) { Worker2.perform_async() }

Sidekiq プロセスの環境変数

  • REDIS_URL=redis://redis_2:6379

さいごに

ここまで書いたあとに worker にオプションとして渡す方法を知った。Conection Pool を都度生成するのはやめたいし、呼び出し側じゃなくて worker 側に書いてあるほうがわかりやすいのでこっちのほうが良さそうと思った。

class Worker2
  include Sidekiq::Worker
  sidekiq_options pool: ConnectionPool.new { Redis.new(url: ENV['REDIS_2_URL']) }
end

とはいえ、Sharding 自体はおすすめはされていなさそう。

Part of the reason I don't document sharding well is because it is supposed to be painful/last resort. It's better to start breaking your monolith into smaller services if you've reached the point of saturating a Redis instance. Questions about Sharding usage · Issue #3605 · mperham/sidekiq

夏野菜の撤収・秋植え野菜・ネギの植え替え

スイカの収穫とうどんこ病の蔓延 の後、8 月末頃まで夏野菜の収穫が続いた。

これは余ったマルチ留め具で作った目

夏野菜の撤収

これは朽ち果てたズッキーニ

みんな時期をずらして徐々に元気がなくなっていったので、撤収しつつ秋植え野菜の準備を始めた。ピーマン、ししとうあたりは割と最後まで頑張ってくれて確か 9 月中旬頃まで収穫できた。

元気なものは残しつつ徐々に耕す様子

夏野菜の終わり頃は「来年はとうきびを大量に育てたいな〜」なんて言ってたんだけど、今となってみるとそうもいかなくなった。これについては別途書く。 次回以降の夏野菜開始時の自分に伝えたいのは以下 4 点。

  • 畑全体をもっと活用する
    • いっきにそんなに育てられないと思って日和って植えたが、空きスペースに雑草がわんさか生えて地獄だった
    • 雑草が生えないようにもっと色々植えると良さそう
  • 朝早く起きる
    • 日が出る前に水をあげたり、受粉させたり、朝にやりたいことがたくさんあったので出勤前の畑時間をもう少し長めにとりたい
  • こまめに収穫する (疲れさせない)
    • 特にきゅうり
    • もう少し大きくなるまで待とう〜としてると木 (苗?) が疲れていって長く収穫できない
    • 多少小さくてもこまめに収穫して、長い間夏野菜を楽しめるようにしたい
  • とうきびはいっぱいあるとよい
    • 育てるのが楽
      • ほっといても横に広がっていかないので、畑の端に植えておくと雑草避けにもなって良さそう
    • 収穫本数が少ないのでいっぱい育てないといっぱい食べられない
    • ヤングコーンがおいしい

秋植え野菜

夏野菜が終わって秋に植えたのは以下の野菜たち。全て種から育てた。

  • 白菜
  • かぶ
  • 大根
  • 水菜
  • 春菊
  • 菜の花
  • 人参
  • 玉ねぎ
  • 長ネギ
  • ごぼう
  • ビーツ
  • 野沢菜

秋植え野菜たち

白菜、かぶ、大根、水菜は大成功。全部おいしかった。大根は時折おもしろい形のものが収穫できたけど、それはそれで楽しかった。あと、白菜と大根でやままがキムチを作ってくれた。これもおいしかった。

キムチ

菜の花は間引きと土寄せがうまくできていなくて、へにょっと折れて育った為かそんなに大きくならなかった。ただこれもおいしかった。春菊は種を蒔きすぎてみんな窮屈そうにしていて、長くは収穫できなかった。間引きはしたんだけど間引きのタイミングが遅かったのかもしれない。人参は小ぶりながらいっぱい収穫できた。ただ、小ぶりだと皮を剥くのが面倒で面倒で...

小ぶり

ごぼう、ビーツ、野沢菜は失敗した。敗因はよくわかっていないんだけど、元々うまくできたらラッキーくらいの気持ちだったので、まあいっかと思って深追いしていない。

ネギの植え替え

白ネギは生長に合わせて土寄せすることで、葉鞘部が白く長くなります。土寄せをきっちり行って軟白部分を伸ばしていくことが、品質の高い長ネギを育てるポイント。 ネギ(白ネギ・長ネギ・根深ネギ)の栽培方法・育て方のコツ | やまむファーム

というわけで長ネギの植え替えを行ったんだけど、タイミングが多分遅くて結構大きい状態での植え替えになってしまった。

でかい

寝かせて土をかぶせる

うまく育ってくれると良いのだけど...