Slide 1

Slide 1 text

サーバーが次々死んでいく... 株式会社ラクーンHD yamashita.kiyoshi

Slide 2

Slide 2 text

まずは自己紹介 名前:山下 清史
 所属:株式会社ラクーンホールディングス 技術戦略部 開発チーム
 主な仕事:BtoB卸売りサイト スーパーデリバリーの開発


Slide 3

Slide 3 text

APサーバーをDocker化した - 今までのサーバーのセットアップは手作業でやっていた
 - Dockerfileにサーバーの設定をかける
 - 開発環境構築が楽になった
 - ログフォーマットをjsonにした
 - ログを標準出力に出すようにした
 - サーバにsshしてログファイルを確認しなくてよくなった
 - fluentd -> Elasticsesarch -> kibanaでログを確認できる


Slide 4

Slide 4 text

進め方
 - Dockerfileなどを作成する
 - ログをモダンにする
 - 不要なログを削除し、標準出力に出す
 - セキュリティ対策
 - 機密情報をDockerfileに書かないようにした
 - ひたすらテスト
 俺、このプロジェクトが終わったら長期休暇を取って海外旅行へ行くんだ...
 APサーバーをDocker化した

Slide 5

Slide 5 text

開発は上手くいった
 そして本番稼働して、初めの1、2日は上手く動いていた
 APサーバーをDocker化した

Slide 6

Slide 6 text

サーバーが死んでいく 
 いきなりサーバーが死んでサービスサイトに繋がらなくなった
 アクセスログは全て500
 会員が商品を購入できなくなった
 
 


Slide 7

Slide 7 text

サーバーが死んでいく 大量の同時アクセスが来ていたようだ…
 
 


Slide 8

Slide 8 text

一時的な高負荷によりメモリが足りなくなった?
 →メモリ割り当てを増やした
 負荷テストが足りなかったなぁ~
 考えられる原因

Slide 9

Slide 9 text

メモリを2倍割り当てたはずなのにサーバーがまた死んだ...
 対策した結果

Slide 10

Slide 10 text

パフォーマンス劣化のたびに対処療法(メモリ割り当てを増やす)を行った
 しかし、ついにアクセスが少ないときにサーバーが死んだ…
 一時的な高負荷が問題じゃなかった…
 それでもまた…


Slide 11

Slide 11 text

計測 現在のアプリケーションサーバーにおいてヒープ領域の使用状況を確認すると
 異常にメモリを使っているクラスが見つかった...
 
 そのクラスを確認したら


Slide 12

Slide 12 text

進め方
 - Dockerfileなどを作成する
 - ログをモダンにする
 - 不要なログを削除し、標準出力に出す
 - セキュリティ対策
 - 機密情報をDockerfileに書かないようにした
 - ひたすらテスト
 このプロジェクトが終わったら長期休暇を取って海外旅行へ行くんだ・・・
 APサーバーをDocker化した

Slide 13

Slide 13 text

原因 不要なログ削除時の対応がミスっていたことが発覚した
 
 対応ミスしたログの動作
 - ログ出力前に、スレッド変数内にデータをためる
 - ログ出力後にデータをクリアする
 
 データをためるところを消さずにデータをクリアするコードのみを消していた
 
 →メモリリーク発生


Slide 14

Slide 14 text

原因 gitでコミットした人を見ると...私でした
 
 
 
 


Slide 15

Slide 15 text

まとめ - 推測するな、計測せよ!!
 - メモリリークは気付きづらくて怖い
 - 解決までに時間がかかってしまった