えいのうにっき

a-knowの日記です

サーバーが高負荷状態になったときのプロセス一覧を自動で出力させておく

趣味でお世話をしているサーバーインスタンスのうちのひとつが、最近以下のような事象を時折起こしておりまして。

  • 深夜に一時的に高負荷状態に陥る
  • 朝起きてみたらそれに気づく(終息している)

さすがに趣味の範疇なので、深夜に飛び起きて対応できるようなアラート通知設定はしておらず、とはいえ起きてからその理由を探ろうとするのだけど、終息したあとに見られるものといったらせいぜい以下のようなことくらい?

  • モニタリングツール(Mackerel)のその当時のグラフの様子
  • アプリケーションログを見る
  • /var/log とかに出力されてるログを見る

今回の場合だとCPU使用率とLA(ロードアベレージ)が高騰していたことくらいしかわからずで、そのときにどういうプロセスがリソースを食ってたんだろう、みたいなことは把握することができなかった。

f:id:a-know:20180520211911p:plain

こんなかんじ。diskはちょっとハネてるかな...。。

対象のサーバーには Mackerel(mackerel-agent)を導入している。そこで、この原因を突き止めるための施策として、チェックプラグインとそのアクション機能を使って「そのサーバーが高負荷状態に陥ったときのプロセスリスト」を自動で出力させるように仕込んでみた。

続きを読む

Golangアプリケーションから Google Cloud Storage にアップロードする

cloud.google.com/go/storage を使う。

func uploadGcs(r *http.Request) error {
    bucketname := "bucketname" // GCSバケット名
    objname := "objname" // "foo/var/baz.png" みたいなかんじ
    ctx := r.Context()

    client, err := storage.NewClient(ctx)
    if err != nil {
        log.Printf("failed to create gcs client : %v", err)
        return err
    }

    // GCS writer
    writer := client.Bucket(bucketname).Object(objname).NewWriter(ctx)
    writer.ContentType = "image/png" // 任意のContentTypeに置き換える

    // upload : write object body
    if _, err := writer.Write(([]byte)(uploadData)); err != nil {
        log.Printf("failed to write object body : %v", err)
        return err
    }

    if err := writer.Close(); err != nil {
        log.Printf("failed to close gcs writer : %v", err)
        return err
    }
    return nil
}

GCSにアクセスするための認証情報は、認証の概要  |  Google Cloud に書いてあるとおり、

上記のことをしておけば、自動的に認証情報がロードされ、GCSへのアクセスもできるようになる。簡単。

ちなみに appengine の場合

は、context ctxgoogle.golang.org/appengine を使って ctx := appengine.NewContext(*http.Request) として取得するだけで、その appengineアプリケーションと同じプロジェクト内のGCSにアクセスできるようになる。

9連休

  • 1日目
  • 2日目
    • grass-graphの Rails -> Golang 移植に着手
    • 母の日の花を注文したりした
  • 3日目
  • 4,5,6日目
  • 7日目
    • Rails -> Golang 移植のつづき
    • 上記 Rails に同居してた便利コードを heroku に移植、完了
  • 8日目
    • Rails -> Golang 移植のつづきをやって完了させた
    • iOSアプリ開発の勉強にも着手
    • 天気がよかったので自転車で1,2時間ほどブラブラとしたりもした
  • 9日目
    • ポートフォリオサイトをつくるために有料テンプレートを買ってちまちまマークアップしたり
    • 自転車で谷中へ。半日ほどブラブラした
      • f:id:a-know:20180506162453j:plain

9連休所感

iOSアプリ開発の勉強はもうちょっと進めておきたかったけど、総じて良い連休だったと思う!