23
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

gumi Inc.Advent Calendar 2016

Day 1

boto3からaws-sdk-goにしただけでCPU使用率が75%->10%になった

Last updated at Posted at 2016-12-01

概要

  • 社内の ZABBIX server の CPU 使用率が高くなってきたので、最小工数で解決したい
  • CloudWatch からメトリクスを取得するスクリプトが python(boto3) で書かれてる
  • とりあえずこのスクリプトを go(aws-sdk-go) に書き換える

CPU 使用率が 75% から 10% に下がった。
chart3.png

結論

簡単なスクリプトがボトルネックになってそうなら、go で書き換えれば良いと思いました。

以下詳細 

弊社のメトリクスの取得方法

  1. プロジェクト毎に ZABBIX proxy を立て、proxy 経由で ZABBIX server が各メトリクスを取得・保存
    zabbix構成図改.png

  2. 1 で取得できないものは、ZABBIX server が全プロジェクト分 CloudWatch api で取得

CloudWatch でのメトリクス取得について

  • 1回の api で取得しているのは、1インスタンスの 1メトリック
  • api は基本的に 300秒に 1回、CPU 使用率のような細くほしいものは 60秒に 1回
  • RDS であれば、1インスタンスあたり10個ほどのメトリクスを取得している
  • Python boto3 で書かれていた

go で書き換えるに当たって

  • 最小工数でいくために ZABBIX の設定を変えなくても済むよう、引数と出力を python スクリプトと同じにする
  • 最低限の開発環境は整える(外部パッケージのバージョン管理とか)

以下 go に関すること

version
go 1.6.2
aws-sdk-go 1.4.15
  • ディレクトリ構成は以下のような構成で
├── Gomfile
├── Makefile
├── README.md
├── aws.go
├── bin
│   └── cloudwatch_metrics
├── main.go
└── vendor
    ├── bin
    ├── github.com
    └── pkg
  • パッケージ管理はシンプルなもので良かったので、https://github.com/mattn/gom を使用
  • 1 回のコマンド実行で 1 度しか api が実行されないので、service の使い回しとかも考えない
  • 関数は全部で 4 つ
    • init
    • main
    • createCloudWatchService
    • getMetrics
  • config ファイルを指定する必要があったが、1.4.15 では環境変数 "AWS_CONFIG_FILE" にファイルパスを設定しなくてはならず、サーバー側の変更を最小限にしたかったので、コマンド内で環境変数を設定することにした
// サーバー側の変更を最小限にしたかったので、コマンド内で環境変数を設定
if err := os.Setenv("AWS_CONFIG_FILE", credentialFilePath); err != nil {
	return nil, fmt.Errorf("AWS_CONFIG_FILE could not be set, %s", err)
}

// credential ファイルパスはここで設定できる
creds := credentials.NewSharedCredentials(credentialFilePath, *profile)
conf := aws.NewConfig().WithCredentials(creds)

s, err := session.NewSessionWithOptions(
	session.Options{
		Config:            *conf,
		Profile:           *profile,
		SharedConfigState: session.SharedConfigEnable,
	},
)
  • 後は公式ドキュメント・サンプル通り、CloudWatch service インスタンス作って、Input インスタンス作って、GetMetricStatistics するだけ

以上

23
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?