GitLabの merge requestで502が出て対処した話
重いなと思っていたらある日 merge request を投げたところ502エラーが出ました。
普段から重かったこともあり前の記事 GitLabのお引っ越し(サーバー移行) - INNOBASE技術ブログ で 取り上げたとおり、サーバーに詰め込みすぎでメモリ不足だと信じて疑わなかったのでサーバー移行したのですが、直りません(T_T)
まじめにログを読んでみた
ちなみにrpmでゆとりinstallしている環境です。
まずはnginx
/var/log/gitlab/nginx/gitlab_error.log
2014/09/15 17:47:03 [error] 15554#0: *18 upstream prematurely closed connection while reading response header from upstream, client: 221.242.***.***, server: 153.121.***.***, request (以下略)
どうやらよりアプリに近いところで通信を切られているようです。
次にunicorn
/var/log/gitlab/unicorn/unicorn_stderr.log
E, [2014-09-15T17:47:02.977184 #15538] ERROR -- : worker=1 PID:15585 timeout (31s > 30s), killing E, [2014-09-15T17:47:03.025386 #15538] ERROR -- : reaped #<Process::Status: pid 15585 SIGKILL (signal 9)> worker=1
あーこれだこれ、unicornがタイムアウトしていますね。
unicornの設定を調整する
原因がわかれば後は簡単、unicornのタイムアウト時間を適切に調整すればよいだけです。
以下アンチパターンと成功例
ダメな例 /var/opt/gitlab/gitlab-rails/etc/unicorn.rb を直編集
# What the timeout for killing busy workers is, in seconds timeout 600
ちなみにこれでも一瞬うまく言ったように見えますが、 gitlab-ctl reconfigure やった瞬間に巻き戻ります。
お察し下さい orz
良い例 vim /etc/gitlab/gitlab.rb を編集 => gitlab-ctl reconfigure
公式ドキュメント:GitLab.org / omnibus-gitlab | GitLab
unicorn['worker_timeout'] = 600
$ gitlab-ctl reconfigure
restart をすれば対応完了
これでタイムアウトも滅多なことでは起きないし、reconfigureを忘れた頃にかけても大丈夫!