goのベンチマーク周りのメモです
2つのベンチマークの比較
pprof のツール
goのパフォーマンス周りの資料(observability)
GoのSSA最適化
おまけ
厳密なgofmt
go!
appengine go1.11以降でgoでもプロファイラが使えるようなので初期設定だけやってみます。
内容的にはほぼ こちら の内容です。
Goの場合には、CPU、ヒープ、競合、スレッドに関するプロファイリングが可能です。
その他、競合プロファイリングやスレッドプロファイリング等があるようです。ここはこの記事では説明しません。
ドキュメントには アプリケーションにパッケージをインポートしてから、コードのできるだけ早い段階でProfilerを初期化する
とあるので、mainロジックの早い段階で以下のように初期化すると良いと思います。
以下の例は ginを利用しています。
import ( "cloud.google.com/go/profiler" "github.com/gin-gonic/gin" "google.golang.org/appengine" "net/http" ) func main() { if err := profiler.Start(profiler.Config{ DebugLogging: true, }); err != nil { // TODO: Handle error. } route := gin.Default() http.Handle("/", route) route.GET("/", func(context *gin.Context){ context.String(http.StatusOK, "hello!") }) appengine.Main() }
プロファイラを利用するためにはAPIの有効化が必要です。
WebUIから Profiler API
を検索し、有効化しても良いですし、
コマンドで gcloud services enable cloudprofiler.googleapis.com
と実行しても良いです。
いずれかの方法でAPIを有効化します。
デプロイ方法は特にこの記事では説明しません。
デプロイ完了の後に、アプリケーションに何度かアクセスし、 hello!
とレスポンスが帰ってくることを確認します。
いよいよメインのプロファイラの確認です。
プロファイラの画面 にアクセスし、確認します。
まずは使えるようになるという意味ではここまで。
また時間があればプロファイラの使い方の記事でも書こうかと思います。
Javaで育った私としては、前方一致/後方一致は StartsWith/EndWith というイメージが勝手にありますが、
goを書いているとたまにど忘れするので備忘録。
goでももちろん前方一致/後方一致のための関数は用意されています。
stringsパッケージの HasPrefix/HasSuffix がそれです。
もうほぼこれで答えなんですが、サンプルは以下のようになります。
import "strings" ~~snip~~ strings.HasPrefix("hello world", "hello") // -> true strings.HasSuffix("hello world", "world") // -> true
簡単ですね。
ではでは。
https://golang.org/pkg/strings/#HasPrefix https://golang.org/pkg/strings/#HasSuffix
皆さんTQつかってますか。
ちゃんと使うとめちゃくちゃ便利なTQ(Cloud Tasks)ですが、コマンドでサクッと作ったり消したりしたい(特に消したい)というのがあったので記事にしました。
以下のようなコマンドでTQを作成します。
gcloud --project ${PROJECT_ID} beta tasks queues create hoge-test
--project ${PROJECT_ID}
は gcloud コマンドに対して事前に gcloud config set project ${PROJECT_ID}
などを実施している方は抜いても実行可能です。
TQを操作するAPIが有効化されていないプロジェクトでは初回以下のような表示が出ますので y
と押してエンター押し有効化しましょう。
API [cloudtasks.googleapis.com] not enabled on project [000000000000]. Would you like to enable and retry (this will take a few minutes)? (y/N)?
(有効化していない場合には有効化完了のログが出力された後に)
Queue作成が Created queue [QUEUE_NAME].
のようなログとともに完了します。
Cloud Tasks のWebUIから作成したTQが確認できます。
以下のようなコマンドを実行します
gcloud --project ${PROJECT_ID} beta tasks queues list
結果は以下のように表示されます
QUEUE_NAME STATE MAX_NUM_OF_TASKS MAX_RATE (/sec) MAX_ATTEMPTS hoge-test RUNNING 1000 500.0 100
TQの削除もコマンドから実行できます。
GAEの queue.yaml で管理していると削除したTQが残りがちなのでそういう場合にはコマンドで消してしまいましょう。
以下のようなコマンドを実行します。
gcloud --project ${PROJECT_ID} beta tasks queues delete hoge-test
削除の際には y/n を入力する必要があります
--quiet
オプションを gcloud コマンドのオプションとしてつけることで y/n 入力を省くことができます。
createの他に create-app-engine-queue
というオプションもあります。
作成したものは見かけ上(WebUI/commandともに)違いがなさそうですが、appengine用のTQを作成する際にはこちらのコマンドを使ったほうが良いのかな [要出典]
TQを作成する際のオプションはいろいろ細かくあるんですが、
今回はひとまずシンプルなものを作成して、削除することがコマンドでできるよ、という記事でした。
ではでは。
たびたび人と話していて、この資料のことを思い出すんだけど、
そのたびに検索するのがしんどいのでメモとして残す。
プレゼンの資料はこれ
https://www.jfokus.se/jfokus16/preso/Building-Fault-Tolerant-Microservices.pdf
こちらの解説しているQiitaと合わせて読むと理解しやすい。
"Building Fault Tolerant Microservices" というプレゼンがとても良かった話 - Qiita
YouTubeに動画も上がっていたので、英語のヒアリング辛くない人はこちらもおすすめ。
Building Fault Tolerant Microservices - YouTube
Release It! 本番用ソフトウェア製品の設計とデプロイのために という本の内容に関して書いている
Release It! はこのような本。
2008年のJolt Award一般書部門で、"Manage It!"とともにProductivity Winner を受賞した原書を翻訳するもの。動くだけではない製品としてのソフトウェアでは、開発だけでなく運用の面でも設計の時点から知っているべき事柄やノウハウが多々ある。本書ではそれらをパターン/アンチパターンとして解説していく。
他にも良い読み物があればぜひコメントで教えて下さい。
ちょっとした負荷試験をしたい場合に、abが入っていればいいのですが、そうも行かない場合も多いので、go製で簡単にインストールできる hey を試します。
HTTPの負荷ツールには2タイプあります。
簡単にするため、
は 全力タイプ
は 定量タイプ
とこの記事では呼んでみますw
全力タイプ
には、この記事で紹介する hey や、 ab(ApacheBendh)などがあります。
定量タイプ
には、Gatling や、以前私が記事を書いた Vegeta などがあります。
アプリケーションがどこまで耐えられるか死ぬまで殴るというテストの際には 1. の全力タイプ、 メモリリークや長期の動作の確認などのためのテストの際には 2. の定量タイプなどを利用する場合が多いと思います。
heyはgo製ツールなので、goがインストールされた環境で以下のコマンドで簡単にインストールすることができます。
go get -u github.com/rakyll/hey
単純なGETリクエストをしてみます。
hey https://chidakiyo.example.com // URLはサンプルです
結果はこんな感じ
Summary: Total: 0.2199 secs Slowest: 0.1970 secs Fastest: 0.0055 secs Average: 0.0539 secs Requests/sec: 909.5376 Response time histogram: 0.005 [1] | 0.025 [149] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 0.044 [0] | 0.063 [0] | 0.082 [0] | 0.101 [0] | 0.120 [0] | 0.140 [0] | 0.159 [0] | 0.178 [0] | 0.197 [50] |■■■■■■■■■■■■■ Latency distribution: 10% in 0.0068 secs 25% in 0.0073 secs 50% in 0.0080 secs 75% in 0.1895 secs 90% in 0.1921 secs 95% in 0.1939 secs 99% in 0.1969 secs Details (average, fastest, slowest): DNS+dialup: 0.0241 secs, 0.0055 secs, 0.1970 secs DNS-lookup: 0.0169 secs, 0.0000 secs, 0.0693 secs req write: 0.0001 secs, 0.0000 secs, 0.0017 secs resp wait: 0.0291 secs, 0.0050 secs, 0.1010 secs resp read: 0.0004 secs, 0.0001 secs, 0.0021 secs Status code distribution: [200] 200 responses
先程 hey https://chidakiyo.example.com
という形で実行していますが、default値によるアクセス数(並列数)でリクエストが実行されています。
オプションはほぼabと同じ(ような気がしている)で、
-n
オプションが送信するリクエスト数(デフォルトは200)
-c
オプションが並列に実行する数(デフォルトは50)
となるので、オプションを省いても以下のコマンドと等価になります。
hey -n 200 -c 50 https://chidakiyo.example.com
その他オプションはこのような感じになります。
-q
レートリミット。 最初に全力タイプとしていましたが、定量タイプとしても使えるようです。(デフォルトは設定されていません)
-z
期間指定。 -z 10s, -z 3m などのように実行する期間を指定できます。
-o
出力タイプ。 -o csv とすることでCSVでの出力もできます。
-m
HTTP method。 GETのサンプルを実行していますが、POST, PUT, DELETE, HEAD, OPTIONSも実行できます。
-H
HTTP Header。 HTTPヘッダーを付与することができます。
-t
リクエストごとのタイムアウト。(デフォルトは20秒、0で無限とできる)
-A
HTTP Accept header。
-d
HTTP Request body。
-D
HTTP Request body をファイルから入力する。
-T
Content-type。
-a
Basic認証 username:password の形式で渡す
-x
HTTP Proxy
-h2
HTTP/2 を有効化する
そんなかんじ。
こちらは、ほぼ この 記事の通りの内容です。
以前の Flutter開発環境の構築 の続きになります。
flutter create my_app
cd my_app flutter run
とおもったら以下のようなメッセージが表示されうまく起動してくれません。
No connected devices. Run 'flutter emulators' to list and start any available device emulators. If you expected your device to be detected, please run "flutter doctor" to diagnose potential issues, or visit https://flutter.dev/setup/ for troubleshooting tips.
デバイスにつながってないよーという感じなので、 事前にシミュレータを起動しておく必要がありそうです。
open -a Simulator
flutter run
以下のようなメッセージが表示され、 エミュレータでサンプルアプリケーションが実行されます
🔥 To hot reload changes while running, press "r". To hot restart (and rebuild state), press "R". An Observatory debugger and profiler on iPhone Xʀ is available at: http://127.0.0.1:65356/p50We9onbd8=/ For a more detailed help message, press "h". To detach, press "d"; to quit, press "q".
サンプルのアプリケーションは、 +
ボタンを押すたびに画面上の数字が増えていきます。
brew tap dart-lang/dart brew install dart