SlideShare a Scribd company logo
5xx解消への道のり
2021/08/25
5xxとは
● 5xxとは
○ HTTP Statusの500 ~ 599のレスポンス
○ 4xxなどはクライアント側のエラーに対して、5xxはサーバ側のエラー
○ エラーなので利用者は正常なレスポンスを受け取れない
● 例えば
○ 500: Internal Server Error
○ 501: Not Implemented
○ 502: Bad Gateway
○ 503: Service Unavailable
○ 504: Gateway Timeout
何の5xxが発生しているか見極める
● CloudWatchから
○ Target_5xx
○ ELB_5xx
● HTTP StatusCodeから
○ 500
○ 503
○ 504
何の5xxが発生しているか見極める
Target_5xx ELB_5xx
この順番で対応していくのがおすすめ
Target_5xxへの対応
1. 500エラー
a. 最初に調べるエラー
b. アプリケーションのコード上のエラー
c. panicのエラー
d. エラーログなどを吐いて原因を検出しやすくする
2. 503エラー
a. APIサーバが過負荷になっていると発生しがち
b. だいたいCPUバウンドなので、スケールアウト、スケールアップさせる
ELB_5xxへの対応
ELB_5xxの対応はやっかい
● 503
○ Service Unavailable
○ 昔は暖気申請をする必要があった
○ 基本的には504が大量に発生した結果なりやすい
● 504
○ Gateway Timeout
○ とにかくAPIのレスポンスを早くするしかない
● 502
○ Bad Gateway
○ ALBのtimeoutが短いパターン(default 60sなので管理画面とかでなければあまりない)
○ API側のエラー(Target_5xx)が大量に発生した結果のパターン
レスポンスタイムを早くする
● CPUが使えているか?
● CPUが使えていない場合、ほぼI/O Waitが原因
I/O Waitとは
● 物理的なIn,Outで待ちが発生すること
○ HTTPリクエストのレスポンス待ち
○ RedisやDynamoDBなどのレスポンス待ち
○ ファイルの読み書き
● とにかくネットワークのIOがめちゃくちゃ遅い
1. メインメモリアクセス
2. ローカルファイルアクセス
3. ネットワーク越しアクセス
I/Oの遅い部分の特定
推測するな計測せよ
関係ないところを改修するほど無駄なことはなし
● お手軽APM
○ とにかく全部計測
○ リアルタイムじゃないとサンプリングされちゃう
● 基本のロギング
○ 初心に戻ってログデバッグ!
I/Oの遅い部分を早くする
I/Oのtimeoutを設定する
● Goの場合
○ コネクション作成時のconfig
○ contextによるtimeout cancel
TimeOutの設定
Redisの場合
● ReadTimeout: クエリコマンドのtimeout
● PoolTimeout: コネクションプールからコネクションを確保するまで
● DialTimeout: コネクション確立まで
Ring
Pool
Redis
redis.GET
TimeOutの設定
Redisの場合
● ReadTimeout: クエリコマンドのtimeout
● PoolTimeout: コネクションプールからコネクションを確保するまで
● DialTimeout: コネクション確立まで
Ring
Pool
Redis
redis.GET
TimeOutの設定
Redisの場合
● ReadTimeout: クエリコマンドのtimeout
● PoolTimeout: コネクションプールからコネクションを確保するまで
● DialTimeout: コネクション確立まで
Ring
Pool
Redis
redis.GET
Context Cancel
GoではContextでcancelの仕組みを実現できる
timeoutすると、channelに通知してくれる
go-redis v8
GoのRedisクライアント
デフォルトでctxの引数が必須に
aws-dax-go
AWSのDynamoDB AccelalatorのクライアントSDK
● timeoutをちゃんとしてくれない問題が!
○ context timeoutしても時間通りcancelしてくれない
○ もちろんconfigでtimeoutも設定済み
gunosy/keeper作りました
gunosy/keeper
やってることはすごい薄いです
引数の関数fを非同期実行して、
- context timeoutしたら return (nil, ctx.Err)
- timeoutしなければ return (obj{}, nil)
CPUを使い切る
- Target_5xxを解消
- CPUを使い切れるようにチューニング
4月 8月
まとめ
- 5xxを解消するためにまず分解
- 推測ではなく計測
もし5xx解消における相談などあればぜひ

More Related Content

More from Yuto Suzuki

エンジニアのためのマーケティング
エンジニアのためのマーケティングエンジニアのためのマーケティング
エンジニアのためのマーケティング
Yuto Suzuki
 
How to Build a Team
How to Build a TeamHow to Build a Team
How to Build a Team
Yuto Suzuki
 
プロダクトにおけるScala
プロダクトにおけるScalaプロダクトにおけるScala
プロダクトにおけるScala
Yuto Suzuki
 
Do you like scala
Do you like scalaDo you like scala
Do you like scala
Yuto Suzuki
 
Re invent
Re inventRe invent
Re invent
Yuto Suzuki
 
Slackから始めるChatOps
Slackから始めるChatOpsSlackから始めるChatOps
Slackから始めるChatOps
Yuto Suzuki
 
大学の時の研究の話
大学の時の研究の話大学の時の研究の話
大学の時の研究の話
Yuto Suzuki
 
F.O.Xを支える技術
F.O.Xを支える技術F.O.Xを支える技術
F.O.Xを支える技術
Yuto Suzuki
 
Scala戦士を増やせ
Scala戦士を増やせScala戦士を増やせ
Scala戦士を増やせ
Yuto Suzuki
 
Recommend scala
Recommend scalaRecommend scala
Recommend scala
Yuto Suzuki
 
スクラムに学ぶ開発の回し方
スクラムに学ぶ開発の回し方スクラムに学ぶ開発の回し方
スクラムに学ぶ開発の回し方
Yuto Suzuki
 
Breezeで始めるデータ分析
Breezeで始めるデータ分析Breezeで始めるデータ分析
Breezeで始めるデータ分析
Yuto Suzuki
 
進撃のSbt
進撃のSbt進撃のSbt
進撃のSbt
Yuto Suzuki
 
【LT】 怖くない恐怖のScala.js
【LT】 怖くない恐怖のScala.js【LT】 怖くない恐怖のScala.js
【LT】 怖くない恐怖のScala.js
Yuto Suzuki
 
Deeplearningとは?
Deeplearningとは?Deeplearningとは?
Deeplearningとは?
Yuto Suzuki
 
Scalaで行うマイグレーション ~Flyway~
Scalaで行うマイグレーション ~Flyway~Scalaで行うマイグレーション ~Flyway~
Scalaで行うマイグレーション ~Flyway~
Yuto Suzuki
 
Git LFSを触ってみた
Git LFSを触ってみたGit LFSを触ってみた
Git LFSを触ってみた
Yuto Suzuki
 
実戦Scala
実戦Scala実戦Scala
実戦Scala
Yuto Suzuki
 
Api設計
Api設計Api設計
Api設計
Yuto Suzuki
 
Emacs
EmacsEmacs

More from Yuto Suzuki (20)

エンジニアのためのマーケティング
エンジニアのためのマーケティングエンジニアのためのマーケティング
エンジニアのためのマーケティング
 
How to Build a Team
How to Build a TeamHow to Build a Team
How to Build a Team
 
プロダクトにおけるScala
プロダクトにおけるScalaプロダクトにおけるScala
プロダクトにおけるScala
 
Do you like scala
Do you like scalaDo you like scala
Do you like scala
 
Re invent
Re inventRe invent
Re invent
 
Slackから始めるChatOps
Slackから始めるChatOpsSlackから始めるChatOps
Slackから始めるChatOps
 
大学の時の研究の話
大学の時の研究の話大学の時の研究の話
大学の時の研究の話
 
F.O.Xを支える技術
F.O.Xを支える技術F.O.Xを支える技術
F.O.Xを支える技術
 
Scala戦士を増やせ
Scala戦士を増やせScala戦士を増やせ
Scala戦士を増やせ
 
Recommend scala
Recommend scalaRecommend scala
Recommend scala
 
スクラムに学ぶ開発の回し方
スクラムに学ぶ開発の回し方スクラムに学ぶ開発の回し方
スクラムに学ぶ開発の回し方
 
Breezeで始めるデータ分析
Breezeで始めるデータ分析Breezeで始めるデータ分析
Breezeで始めるデータ分析
 
進撃のSbt
進撃のSbt進撃のSbt
進撃のSbt
 
【LT】 怖くない恐怖のScala.js
【LT】 怖くない恐怖のScala.js【LT】 怖くない恐怖のScala.js
【LT】 怖くない恐怖のScala.js
 
Deeplearningとは?
Deeplearningとは?Deeplearningとは?
Deeplearningとは?
 
Scalaで行うマイグレーション ~Flyway~
Scalaで行うマイグレーション ~Flyway~Scalaで行うマイグレーション ~Flyway~
Scalaで行うマイグレーション ~Flyway~
 
Git LFSを触ってみた
Git LFSを触ってみたGit LFSを触ってみた
Git LFSを触ってみた
 
実戦Scala
実戦Scala実戦Scala
実戦Scala
 
Api設計
Api設計Api設計
Api設計
 
Emacs
EmacsEmacs
Emacs
 

5xx解消への道のり