- memory : ハードリミット。ここで指定した以上のメモリを使用しようとするとOOMKillerが走る
- memory-reservation : ソフトリミット。ホストのメモリに余裕がある時は、これ以上使用することもある
- 余裕が無いときは、memory_reservation 内にとどめる
- ECSでは設定上のこの値を見て、ホストにコンテナを追加できるか判断する
AWS 認定ソリューションアーキテクト – アソシエイト (新版) 対策メモ
自分が知らなかったAWS用語のおぼえがき
Amazon Redshift
Amazonが提供するデータウェアハウス
データウェアハウス(DWH)とは、意思決定のために、基幹系などの複数システムから、必要なデータを収集し、目的別に再構成して時系列に蓄積した統合データベースで、データ分析や意思決定に役立てます。
Redshift 拡張VPCルーティング
VPCエンドポイントやゲートウェイと接続したい場合に設定する必要がある
Amazon Glacier
アーカイブに最適な低コストのオブジェクトストレージ
- 耐久性 99.999999999%
アーカイブの取り出しオプション
- 迅速 : 250 MB 以下のアーカイブ 1〜5 分以内で取得可能
- 標準 : デフォルト。 3〜5 時間で取得可能
- 大容量 : 5〜12 時間で取得可能。安い
Vault Lock
ロックを掛けて、以降そのデータの編集を不可能にする仕組み。 コンプライアンス目標を達成しやすくなります
とのこと
Amazon S3
PUTできるファイルのサイズ制限は5G
アクセス制限
- バケットポリシー : IAM、バケット単位で制限
- アクセス・コントロール・リスト(ACL): AWSアカウント単位で、バケット/オブジェクトのread/writeを制限できる
- 削除権限の制御はない
- IAM ポリシー: S3へのAPIアクセスを制限
S3 MFA Delete
オプションでオブジェクトの削除にMFAデバイスによる二段階認証をできるようにする
オプションで有効な機能
- オブジェクトの暗号化
- アクセスログの取得
- オブジェクトのバージョニング
暗号化
KMSを使って、いろいろな方法で暗号化できる
高速化のベストプラクティス
ファイル名の先頭にランダムな文字列を入れると、格納先のパーテーションが分散して、速度が上がる
- S3はオブジェクトをキー名毎にアルファベット順に、複数のパーテーションに格納している
- タイムスタンプやアルファベット順のキーを大量に作成すると、特定のパーテーションにアクセスが集中して、速度が低下する
リクエスト率およびリクエストパフォーマンスに関する留意事項 - Amazon Simple Storage Service
古いノウハウになってしまったが、テストではそのままなので残す...
Amazon EBS
AWS KMSを使って、ディスクの暗号化ができる
ボリュームの種類
汎用SSD
価格と性能のバランスが良い
- 容量: 1G〜16T
- 最大IOPS: 10,000
プロビジョンドIOPS SSD
高スループット&高価
- 容量: 4G〜16T
- 最大IOPS: 32,000
スループット最適化HDD
低コスト&低性能 ブートボリュームにはできない
- 容量: 500G〜16T
- 最大IOPS 500
スループット最適化HDD
ブートボリュームにはできない
さらに低コスト&低性能
- 容量: 500G〜16T
- 最大IOPS 250
Amazon EBS ボリュームの種類 - Amazon Elastic Compute Cloud
Amazon EFS
EC2インスタンスに紐づけできるファイルストレージサービス
Amazon EFSを使ってみた(前編) - 株式会社ネディア
Amazon ECS
タスクのIAMロール
タスクにIAMロールを紐づけることができる
異なるユーザのタスクを1つのクラスタで実行しても、権限のないコンテナやサービスへの接続を制御することができる
AmazonCloudFront
Amazon CloudFront は、静的および動的なウェブコンテンツ (.html、.css、.js、イメージファイルなど) をユーザーに高速に配信するウェブサービスです。
キャッシュを破棄するのに10分ほどかかるので、リアルタイム性が求められるデータには向かない
AWS CodeBuild
CIサービス
AWS CodeDeploy
EC2などのAWSサービスへの自動デプロイサービス
AWS CloudFormation
クラウド環境内のすべてのリソースを記述してプロビジョニングするためのツール
- terraformとよく比較される
AWS STS
AWS Security Token Service
AWS リソースへのアクセスを制御できる一時的セキュリティ認証情報を持つ、信頼されたユーザーを作成および提供することができます。
一時的なIAMを作るようなサービス
Amazon SQS
メッセージキューサービス
Amazon SNS
プッシュサービス、SMSやメールやアプリへのpushができる
Amazon Kinesis
大規模なストリーミングデータを処理するサービス
EC2で直接受けたり、SQSで受けるよりも安く、スケールするらしい
Amazon EMR(Elastic MapReduce)
分散処理基盤
ETL(雑多な情報をデータウェアハウスにまとめる処理)向け
EC2でClusterを作ってくれる(インスタンスタイプと台数を指定できる
Map Reduce とかの分散コンピューティング用の実装が必要
AWS Batch
EMR と違って、分散コンピューティング用の処理は不要
Amazon Aurora
MySQL や PostgreSQL と互換性のあるリレーショナルデータベース
- 最大テーブルサイズは64TiB
- RDSのテーブルのファイルサイズは最大16TiB
[Amazon RDS]
ポイントインタイムリカバリ
自動バックアップからの復帰のこと
サポートエンジン
PostgreSQL、MySQL、MariaDB、Oracle、Microsoft SQL Server
- DB2は未サポート
AWS Direct Connect
Amazon Kinesis
データストリームの処理基板
- 最大ファイルサイズが1GiB
EC2関係
EBS BackedインスタンスとインスタンスストアBackedインスタンス
- EBS Backedインスタンス: EBSにデータが格納。停止時/削除時もデータは保持される
- インスタンスストアBackedインスタンス: データが揮発性。再起動以外ではデータが削除される。インスタンスの停止はできない
スポットインスタンス
AWSで余剰したインスタンスを格安で利用できるが、確実に取得できるとは限らないので 問題の用途によっては不適なインスタンスタイプ
料金設定が上限を超えたり、そもそもインスタンスがなくなった時等に強制終了される
- 2017年までは、1時間以内に強制終了された場合は無料だった。現在は秒課金
Cloud Watch 関係
Amazon EC2 メトリクス
標準メトリクスは以下のとおり
- CPU クレジット利用数(CPUCreditUsage)
- CPU クレジット累積数(COUCreditBalance)
- CPU 利用率(CPUUtilication)
- 1秒あたりの Disk 読み込み回数(DiskReadOps)
- 1秒あたりの Disk 書き込み回数(DiskWriteOps)
- インスタンスストレージの読み取りバイト数(DiskReadBytes)
- インスタンスストレージの書き込みバイト数(DiskWriteBytes)
- 受信したバイト数(NetworkIn)
- 送信したバイト数(networkOut)
- OS・インフラストラクチャステータスチェックの成功・失敗(StatusCheckFailed)
- OSステータスチェックの成功・失敗(StatusCheckFailedInstance)
- インフラステータスチェックの成功・失敗(StatusCheckFailedSystem)
基本モニタリング
無料
ステータスチェック系は1分間隔 他は5分間隔
詳細モニタリング
有料
全て1分間隔でモニタリングできる
Auto Scaling グループ
ロードバランシング関係
ELBはマルチリージョン不可
Weighted Round Robin (WRR
Route53の機能。マルチリージョンでロードバランシングするならこっち
設定した割合でラウンドロビンされる
ネットワークACL関係
ネットワークACLとセキュリティグループの違い
ネットワークACL
- サブネットレベルでのセキュリティポリシー
- 許可と拒否が設定可能
- レスポンス(送信元)トラフィックも許可されていないと受信できない
- サブネット内のすべてのインスタンスに自動的に適用される
セキュリティグループ
- インスタンスレベルでのセキュリティポリシー
- 許可のみ設定可能
- レスポンスのトラフィックは無条件で受信可能
AWSのネットワークACLとセキュリティグループの違い - プログラマでありたい
0.0.0.0/0
の意味
一時ポート(エフェメラルポート)
TCP/IPにて、通信の帰りに特定範囲のポートを使用する ネットワークACLでは、エフェメラルポートのイン/アウトバウンドを許可する必要がある
ネットワーク ACL - Amazon Virtual Private Cloud
VPC関係
VPCエンドポイント
プライベートサブネットから、インターネットを経由せずにS3やRedshiftにアクセスする仕組み
VPCルートテーブルで、S3やRedshiftへアクセスするときのIPアドレスを、VPCエンドポイントに設定する
インターネットを経由しない分、よりセキュアにS3やRedshiftにアクセスできる
プライベート、パブリックサブネット
サブネットのトラフィックがインターネットゲートウェイにルーティングされる場合、そのサブネットはパブリックサブネットと呼ばれます。
インターネットゲートウェイへのルートがないサブネットは、プライベートサブネットと呼ばれます
NATゲートウェイ
プライベートサブネット内のインスタンスから、インターネットに接続するためのゲートウェイ
逆にインターネットからは、プライベートサブネットに接続できない
インターネット側へのトラフィックはNATのIPアドレスになる
インターネットゲートウェイと、NATゲートウェイの違い
- インターネットゲートウェイ : インターネットからインスタンスに接続可能。インスタンスとのプライベートIPと、パブリックはIPは1対1。帯域幅制約なし
- NATゲートウェイ : インターネットからインスタンスに接続不可。インスタンスとのプライベートIPと、パブリックはIPは多対1。帯域幅最大45Gbps
NATゲートウェイは、プライベートサブネットとインターネットゲートウェイの仲介をするゲートウェイ
ルートテーブル
コンピュータネットワークにおけるルーティングテーブルとは、ルーターやネットワーク接続されたコンピュータが持つ、個々のネットワークの宛先への経路の一覧を保持しているテーブル状のデータ構造である。
MHA for MySQLのデフォルトのヘルスチェックでは、DBの書き込み障害ではフェイルオーバーしないよというお話
先に結論
MHA for MySQLのデフォルトのヘルスチェックでは、DBの書き込み障害ではフェイルオーバーしない
なんで?
- MHAはヘルスチェックをバラメータ
ping_type
で設定された方法で行う ping_type
のデフォルトはSELECT
ping_type
:SELECT
の場合、ヘルスチェックはSELECT 1 As Value
で行うので、書き込み障害には気づけない
どうすればよいの?
ping_type
:INSERT
の場合、ヘルスチェックはINSERT INTO infra.chk_masterha values (1,unix_timestamp()) ON DUPLICATE KEY UPDATE val=unix_timestamp()"
で行うので、書き込み障害にも気づけるはず
ping_type
: INSERT
の場合の注意事項
- MHA実行ユーザにDBやテーブルの作成権限 or 予めヘルスチェック用のDB&テーブルを作成する必要がある
- MHAは、
infra
というDB(ハードコーディング!) に、chk_masterha
というテーブルを作る SELECT
のときよりオーバーヘッドが発生する
感想
書き込み障害が発生したのに、フェイルオーバーが行われず、めちゃくちゃ焦った
ツールが想定通りの挙動をしなかった場合、公式ドキュメントとコードをじっくり読もう
SRE本読書メモ エラーバシェットの話しを読んで、明確な数値目標は意思決定コストを下げると思った
SRE サイトリライアビリティエンジニアリング ―Googleの信頼性を支えるエンジニアリングチーム
- 作者: 澤田武男,関根達夫,細川一茂,矢吹大輔,Betsy Beyer,Chris Jones,Jennifer Petoff,Niall Richard Murphy,Sky株式会社玉川竜司
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/08/12
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
なぜ数値目標を決めるのが大事か?
明確な数値目標は、意思決定コストを下げる
数値を決めることで意思決定コストが下がる例
- エラーバシェット
エラーバシェットとは?
チーム内で合意が取れた、一定期間内に許容できる予定外のシステムダウン時間の合計
なぜエラーバシェットがあるのか
機能追加と信頼性向上どちらに注力するか悩むことが無くなる
- エラーバシェットに余裕がある間は、機能追加にリソースを割く
- 逆に、いまのままだとエラーバシェットが無くなりそうならば、信頼性向上にリソースを割く
信頼性向上の施策の優先順位に悩むことが無くなる
たとえば、ある障害のリカバリに掛かる時間が、どれだけエラーバシェットにインパクトを与えるか? で判断できるようになる
- エラーバシェットが15分なのに、リカバリに30分掛かるならば、それは必ず自動化すべきと判断できる
過剰な信頼性向上をしなくなる
- SLA 100%は実現不可能
- 一定以上信頼性を上げるのには、指数関数的に開発コストが上昇する
感想
- スプリント計画時にエラーバシェットをチェックすると、次やるべきことが明確になりそう
SRE本読書メモ 15章: ポストモーテム文化。非難のない振り返りが改善を生む
SRE サイトリライアビリティエンジニアリング ―Googleの信頼性を支えるエンジニアリングチーム
- 作者: 澤田武男,関根達夫,細川一茂,矢吹大輔,Betsy Beyer,Chris Jones,Jennifer Petoff,Niall Richard Murphy,Sky株式会社玉川竜司
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/08/12
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
非難のない振り返り
googleでは、インシデントから学びを得るために ポストモーテム (検死) と呼ばれる振り返りを行う文化がある
なんで非難しない振り返りが重要なの?
- 非難は人が変わることを強要することだが、人は人を変えることはとても難しい
- 人を変えることは出来ないが、その人が正しい判断をすることを助ける仕組みを作ることはできる
- 非難を避けようと、インシデントや問題を隠蔽するようになる
ヘスルスケアや航空業界など、些細なミスが大事故に繋がる業界で生まれた文化
ポストモーテムの意義
- 再発の可能性を削減するための効果的な予防策が確実に導入されること
- 記録することで、他のチームもそれを参照して、問題を予防できるようになる
ポストモーテムのゴール
ポストモーテムのゴールは事前にチームメンバーに共有されていることがだいじ
- 後々の分析のために必要なデータは収集されていること
- サービスへの影響(インパクト)の分析が完全に行われていること
- 根本原因がしっかり分析されていること
- アクションプランの内容と優先度は適切であること
- 結果をステークホルダーに共有できていること
ゴールの条件を満たしているか、かならず上級エンジニアからのレビューを受けること
ポストモーテムのテンプレ
* 作成日: * 作者: * ステータス: (現在のステータスを書く * サマリ: (概要を書く * 根本原因: (発生要因に書かれた現象が発生した根本的な原因を書く * 発生要因: (例: トラフィック突然の増加で表面化した潜在的なバグ * 対応: * 検出: (なにを検出した事でインシデントに気づいたか? * アクションアイテム: (改善、再発防止の為に取る/取ったアクションの一覧 # 教訓 ## うまくいったこと ## うまくいかなかったこと ## 幸運だったこと # タイムライン (発生から改善までの時系列を書く # 参考情報
感想
- 「人を変えることは出来ないが、その人が正しい判断をすることを助ける仕組みを作ることはできる」だいじ
- 他チームへの共有を意識したポストモーテムだいじ
[SRE本読書メモ] 13章: 障害対応。ストレスの無い障害対応が少ないダウンタイムを生み出す
SRE サイトリライアビリティエンジニアリング ―Googleの信頼性を支えるエンジニアリングチーム
- 作者: 澤田武男,関根達夫,細川一茂,矢吹大輔,Betsy Beyer,Chris Jones,Jennifer Petoff,Niall Richard Murphy,Sky株式会社玉川竜司
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/08/12
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
言いたいこと
障害対応時のストレスを減らすことで、(人を含めたシステムの)信頼度を上げることができる
なので、ストレスを減らす施策を積極的に打ちましょう
なんでストレスの無い障害対応がだいじなの?
- ストレスホルモンが生じると、人間は、認知機能が下がり、直感・反射で動くようになる
- 障害対応は、実測→仮説→検証の繰り返しなので、感や経験で動いても良い結果を生み出さない
- そのため、理性的な障害対応を行えるようにするためには、担当者にいかにストレスを生じさせないかがキモになる
どうすれば、ストレスを感じずに障害対応ができるようになるの?
以下のようなことを予め準備/共有することで、担当者の負担感を下げ、心理的安全性が確保できる
- 明確なインシデント管理の手順
- インシデント発生時の役割分担
- 振り返りでは避難されないことを明示(後述
インシデント発生時の役割分担
役割分担を明確にすることで、メンバーの負担感を下げ、それぞれが正しい目的に注力できるようになる
- 責任者: 他メンバーへの責任の割当、作業効率の障害を取り除く、ライブインシデント対応ドキュメントの作成
- 実行担当: インシデントに直接対応するメンバー
- コミュニケーション: 公の顔。チームとステークホルダーに状況を共有し続ける役割
- 計画: 長期的な課題を扱う。引き継ぎの調整、夕食の発注、最終的に通常の状態に戻す準備など
ストレスを減らすために個人的にできること
- 「障害が発生したからといって世界が終わるわけではない」ということを意識する
- 自分の感情に注意を払う。パニックや圧倒されているという感覚が生じたら、メンバーに支援を求める
感想など
- 障害対応のストレスから人間の認知機能の話が出たのが興味深かった
- 振り返りときに対応者が「どこにストレスを感じたか?」を記録すると、仕組みの改善の余地が見えそう
- 自分も障害対応時には、視点が狭くなったり、ステークホルダーとの共有がおろそかになる。それを減らすためなに、役割の分担を次回の障害対応時にやってみたい
RubyでGCしても直ちにRSSが減るわけではないというお話
先に結論
計測してみた
適当な長さのStringを10000回作って、RSSと、ObjectSpace.memsize_of_all
を計測する
require 'objspace' puts ",ObjectSpace.memsize_of_all,RSS" 1.upto(10000) do |i| a = "10"*10000 a += '123' rss = `ps -o rss= -p #{Process.pid}`.to_i * 0.001 memsize_of_all = ObjectSpace.memsize_of_all * 0.001 * 0.001 puts "#{i},#{rss},#{memsize_of_all}" end
結果
以下のグラフの通り
memsize_of_all
は数ループに1回GCされているが、実際にプロセスがメモリを手放すタイミングはもっとゆっくりしている
単位はMB
なんでGCしても、RSSはすぐに減らないの?
stackoverflowだけれど納得感のある解説を見つけた
Cレベルの話をすると、free を呼んでもOSにメモリを返さず、次に malloc した際に再割当するような実装も多く存在します。 ということで、一般的にはメモリの解放によっても占有メモリが減らない前提でプログラミングすることになろうかと思います。
2018/05/18 追記
会社のひとから、上記のコメントは Conservative GC と混同しているのではないか? とご意見頂いた
参考リンク
- ObjectSpace.memsize_of_all
- すべての生存しているオブジェクトが消費しているメモリ使用量をバイト単位 で返します。
- Rubyプロセスの使用メモリ量の計測