月曜日までに考えておきますスマートフォン用の表示で見る月曜日までに考えておきますITネタとゲームネタ中心に興味のあること色々書きます。ruby応答に500ms以上掛かる外部APIに依存するサービスを作ってて、Unicornのworker数だと簡単に詰まって死ぬという現象が起きていたのでしばらく前にPumaに置き換えました。運用しているサーバのUnicorn部分をPumaに置き換えるのは割と簡単で、これを参考にしたらほぼうまくいきました。issueを踏んだので注意それ以降、順当に運用できていたのですが、負荷がかかったときに500エラーが出るという現象はUnicornよりマシになったものの出続けていました。最初はThread数の不足かと思い、増やしたりしたのですがそれでも出続けており、エラー内容は以下のものでした。あたりでググって見たところ、Herokuのこの記事がヒットして回答が書いてありました。adequate.Threadごとにコネクションを貼り、コネクションプールが作られるActiveRecordのコネクションプール数はデフォルトだと5ということなので、いくらスレッド数を増やしても、Pumaのスレッド数が5以上必要になるケースが発生するとコネクションが貼れなくてエラーになるわけですね。いうわけでこういうふうにdatabase.ymlを書き換えて解決しました。16UnicornからPumaに置き換えた理由ちなみに、UnicornからPumaに置き換えた理由ですが、外部依存でリクエストが詰まる環境下だと、Unicornは1Workerで1requestしか処理できないので、Worker数を増やすしか解決策がありません。Worker数を増やすにはリソース(特にメモリ)が必要になるので、1サーバでそこまでworker数を増やすことができず、遅いリクエストを捌いている間に処理するリクエストより入ってくるリクエストのほうが多くなって、死ぬわけですね。CPUとかぜんぜん余裕があるにもかかわらず。Pumaは、外部APIやDB待ちのようなIO待ちで何もしていない(CPUに余裕がある)状態であれば別スレッドで他のリクエストを処理することが可能であり、スレッドを増やすのはUnicornのWorker数を増やすよりもリソースを使わないため、待ちの多い多数のリクエストを捌くというのに向いているわけです。(1)はてなブログをはじめよう!ryonextさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。