本資料は、6/7(水) に開催された 【MIXI × Money Forward × NewsPicks共同開催】AWSコスト最適化夏祭り における、Romiの加藤による発表資料です。 YouTube のアーカイブもありますので、是非、こちらもご覧ください。 https://youtube.com/live/5XY7KgzMU0E?feature=share
#AWSコスト夏祭り
©MIXIRomi チーム OpenSearch コスト最適化事例 株式会社MIXI Vantageスタジオ Romi事業部 開発グループ加藤 修悟
View Slide
©MIXI自己紹介! 加藤 修悟 a.k.a. ろぐみ 21新卒 3年生 Romiという会話AIロボットを作ってます 主な領域: - サーバーサイド - Webフロントエンド - インフラ(AWSまわり) 最近 ハイラルに住んでます
©MIXIRomiと ? ● ディープラーニングを応用した会話AIロボット (従来) ルールベース中心 - 人手で書くシナリオ - すぐに脱線する - 人手に 限界がある - パターンを試しきったらおもちゃ感 (Romi) ディープラーニング中心 - 大量 データから学習 - より柔軟、文脈を考慮して会話可能 - 時間、季節、記憶、好みも加味 - (我々も)何を話すかわからない よろしく !
©MIXI文脈を考慮? ● 過去 会話履歴が必要 ○ OpenSearchで読み書き! ○ 直近 会話履歴を会話AIサーバーへ送信 RomiサーバーOpenSearch
©MIXIあれ?OpenSearch高くない??? ● GPUインスタンスが1番高い ○ それ そう ● 2番目がOpenSearch…? ○ Romiで 2クラスター使用 ■ サーバー ログ ■ 会話 ログ にしても高い GPUインスタンスOpenSearch
©MIXIWhy? ● OpenSearch インスタンスサイズがリッチすぎ 以上!!
©MIXIWhy インスタンスサイズがリッチ? ● クエリ そこまで重くない ● 平均的な速度も問題ない ● たまに謎タイムアウトする ○ いったんリッチなインスタンスにして 力で解決した
©MIXIどこがネック? ● シャード数が700個オーバー → 多すぎ ○ シャードが多いとヒープを食い潰して遅くなる ○ シャード数 インデックス 数に原則比例 ● 1シャードあたりが使う容量が小さすぎ ○ 目安 10〜50GB/shard ○ Romiチームで 当時数10〜数100MB/shard ⇒ インデックス 切り方を変えよう! indexshard sharddoc doc doc doc doc doc
©MIXIインデックス 切り方 ● 元々: log-YYYY-mm-dd ○ 日単位で切る ○ これで数10〜数100MB/shard ということ ・・・ ● 作戦: log-YYYY-mm ○ 月単位で切る ○ 30GB/shard 程度に余裕で収まりそう! ○ 日付単位で切ったインデックスをマージすれ 良さそう ■ _reindex API
©MIXI● ダブルライトしよう! ○ 2つクラスターを用意 ○ スナップショットを取れ クローンが作れる ○ 同一ID ログをダブルライト ■ UUIDあたりを使え OK サービスを止めたくない クラスターA(元々あるやつ)log-YYYY-mm-dd クラスターB(A クローン) log-YYYY-mm にマージ
©MIXIダブルライト ● 最初 Aから読み込み ● クローン作成、マージ 間にA書き込まれたデータをBに追記 ○ ダブルライト開始まで 空白埋め ○ elasticdumpが便利 ○ 同一ID も 無視して追記できる(重複ログを防止) ● すべて完了したら読み込みをBにスイッチ クラスターA(元々あるやつ)log-YYYY-mm-dd クラスターB(A クローン) log-YYYY-mm にマージ
©MIXIインスタンスサイズを下げる ● OpenSearch Blue/Greenデプロイが可能 ● 少しずつ下げて様子見
©MIXIどれだけ安くなった? ※ リザーブドインスタンス 購入も含む Before After OpenSearch OpenSearch
©MIXIまとめ ● 1シャードあたりが使っている容量を確認しよう ○ 10〜50GB程度がパフォーマンス○ ● ↑が適切な値になるようにインデックスを切ろう ● サービスを止めたくない場合 頑張ってダブルライトしよう