INNOBASE技術ブログ

技術的なことエンジニア的なこと制作的なこと全般

GitLabの merge requestで502が出て対処した話

重いなと思っていたらある日 merge request を投げたところ502エラーが出ました。

f:id:mr51:20140915193008p:plain

普段から重かったこともあり前の記事 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を忘れた頃にかけても大丈夫!