数日前、このブログとか、D0-RSS、Wixoss-Linkageを動かしているサーバが応答しなくなっていました。


こんなふうにメモリ使用量が徐々に増えていき、メモリが足りなくなっていました(急に減っているタイミングはサーバの再起動をかけたとき)

調べてみると、D0-RSSやWixoss-Linkageで、各ブログのRSS feedを毎時間取得してくるプログラムが原因だったようなので対策していました。

***

原因 httpの応答が帰ってこない


推測される原因としては、RSS feedをhttpで読みに行ったときに、応答が帰ってこないサイトがたまにあって、プログラムがそこでずっと待ち続ける。1時間後にも、前のプロセスが待った状態のまま、新しいプロセスが実行され、それも同じように待ち続ける・・・。というのが積み重なってメモリが増加し続けていたんだろうなと思います。

サーバによっては、メンテナンス中で読めなかったり、その時々で挙動が変わってしまうのですが、そういうこともよく起こると考えて対処しておく必要がありそうです。
また、今まで問題なく動いていたのに、急にこのような挙動になってしまったのは理由が不明です。

対策 待ち時間が長い場合はタイムアウト


RSS feedを読みに行って待ち時間が長い場合は、そのサイトのRSSの更新を飛ばすようにしました。
具体的には、rubyのtimeoutのライブラリを使ってけっこう簡単にできました。
module Timeout (Ruby 2.5.0)

具体的にやったことはこんな感じ


begin
Timeout.timeout(3){ #3秒のtimeoutを設定
RssDatum.update site_datum #RSSのアップデートを試みる
}
rescue Timeout::Error => e #timeoutした場合
p "Rss update timeout" #timeoutしたことを残す
end

とりあえずこれで、今のところは問題なく動いているようです。
やったことはシンプルだけど、原因を突き止めるのにけっこう時間がかかりました。