Posted at

sidekiqでのみSystemStackErrorが出る場合に考慮したいこと

More than 5 years have passed since last update.

sidekiqと通常の実行の違いはFiberを使っていることです。ですから、sidekiqで使っているコードを以下のコードに置き換えた時にもSystemStackErrorが出るなら、それはsidekiqの問題と言うよりFiberの制約です。

fiber = Fiber.new do

# do something
end
fiber.resume

Fiberはおそらく、4KBしかstackがないのでメモリを大きく使う作業をした場合にSystemStackErrorが出ると推測します。

sidekiqのあるissueによるとTheredを立てるようにとのことでした。

class HardWorker

include Sidekiq::Worker
def perform(name, count)
thread = Thread.new do
# do something
end
end
end

ただ、このままRails系でActiveRecodeを使うとConnection Poolに関して問題が出ます。

class HardWorker

include Sidekiq::Worker
def perform(name, count)
thread = Thread.new do
ActiveRecord::Base.connection_pool.with_connection do |connection|
# do something
end
end
end
end

これで、sidekiqでメモリを喰うタスクを実行しても大丈夫かと思います。ただし、普通にメモリを使い切ると不安定になりますので、それに関しては別の対策が必要です。