えいのうにっき

誤字脱字・記述の誤りなどはこちら https://github.com/a-know/blog.a-know.me へお願いします

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

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

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

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

  • モニタリングツール(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 Platform Auth ガイド  |  ドキュメント  |  Google Cloud に書いてあるとおり、

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

ちなみに appengine の場合

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



follow us in feedly

9連休

9連休所感

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



follow us in feedly