継続的プロファイルによる大規模アプリケーションの性能改善 / Improving massive application clusters with continuous profiling
![Goのメモリ管理 / Memory management in Go](https://cdn-ak-scissors.b.st-hatena.com/image/square/ecea60126ad250fca794b4367989b0d2342aa127/height=288;version=1;width=512/https%3A%2F%2Ffiles.speakerdeck.com%2Fpresentations%2Fbcfff90e14274c3faf4f2262eedc4cf6%2Fslide_0.jpg%3F25855352)
Go Conference 2023 ( 2023/06/02 Fri. ) https://gocon.jp/2023/ 登壇資料 株式会社アンドパッド プロダクトテックリード 小島 夏海 みなさん、Googleが公開したGo Style Guideは読みましたか? ソフトウェア開発は継続的な活動であり、一般的に複数人で行うことが多いです。 継続的に複数人で開発を行う場合、自分が書いたコードを他人が読んだり修正したりすることが非常に多いです。 そのため可読性の高いコードを書くことは開発効率やメンテナンス性の向上に役立ちます。 Goはシンプルな言語ですが、どのように書くべきか悩むことが全くないわけではなく、そのような時従来はEffective Go/Uber Go Style Guide/OSSコード等を参考にどのように書くか決めていたと思います。 これらに加え、昨年末にGoogleからG
Photo by Abo Ngalonkulu on UnsplashPeople tribe / Backend squad の @izumin5210 です。もう12月ですね。自分は Advent Calendar に登録しすぎて後悔するのが得意です。 この記事は Go3 Advent Calendar 2019 の4日目です。 TL;DRSQL のメトリクス・トレースを収集したいは driver.Driver をラップするのが常套手段コネクション取得までの待ち時間まで見たい場合は、DBStats を見るのがよさそうことの発端Wantedly では Application Performance Monitoring に New Relic を利用しています。New Relic APM には様々な機能が存在しますが、例えばエンドポイントごとに「どの処理でどれくらいの時間がかかっているか
タイトルの通り、Goで標準出力をフィルタしてよしなに色を付けるツール書きました。 irir モチベーションは「 go test に色を付けるツールを作った #golang 」と同じです。 ある標準出力に対して、なんらかの文字列を含んでいたらその文字列に色を付けたり、行全体に色を付けたいという要求はよくあることだと思います。今回は、そうした小さな色付けルールをYAMLで記述してフィルタを適用する感じのツールにしました。 READMEにある通りですが、以下の様なログファイルがあったとして、 $ cat example.log 2023/05/19 23:56:54 [info] GET /some/resource 200 0.001 2023/05/19 23:56:55 [warn] GET /some/resource 200 0.001 2023/05/19 23:56:56 [err
エラー返値が無用な条件 関数ないしメソッドの実装がオンメモリ操作のみで完結 将来も(メモリ以外の)I/O操作は追加されることがない 逆にいうと上記の条件のいずれかが達成できない可能性がある関数やメソッドはエラー返値を付与すべき。 返値エラー型はerrorで統一する 返すエラーがerrorインターフェース型でなければそのエラーは正常にハンドリングできません。またerrorインターフェースを満たす別の返値型で返してerrorインターフェース型で受け取るのも後述のトラブルの元です。 Goの実装方針に「インターフェースで利用するものもコンストラクター相当では構造体ポインタで返す」というものがありますがコンストラクタを呼ぶ側は元型にアクセスすることが多いのでこういう方針になっています。が、エラー値に関しては元型を意識せずに利用可能にするという役割があって、この実装方針は当てはまりません。 エラーチェ
こんにちはこんにちは! Go言語狂の皆さん!!うっほ…いや、こんにちは!!! きっと皆さんのことです。Goを書きすぎてGo言語脳になってしまった果てに、Windowsのアドインの作成とかでDLLを生成したくなったのでしょう! そんな皆さんを救うべく、今日はDLLの錬成術について、簡単に書こうと思います。 それではうっほほほい! もくじ こんにちはこんにちは! もくじ 基本 構造体ポインタの引数 コールバック関数を呼ぶ FreeLibraryの魔の手から逃れる まとめ 基本 DLL形式にコンパイルするためにはWindowsであればMinGWが必要です。 Go言語狂の皆さんですから、Go以外のコンパイラを入れることにためらいを覚えることは理解できます!でも入れてください! 入れましたか?それでは雛形を次に示します。 package main import "C" /* DLLエクスポートする関
概要 タイムアウトと一口に言ってもサーバ・クライアント、そして各フェーズによって細かく設定があります。 今回はGoのnet/httpのtimeoutについて1つ1つ説明していきます。 環境 golang/go 1.13 Server 全体図 サーバ系timeoutと各フェーズは以下の関係になっています。 各項目 項目 役割 http.Server.ReadHeaderTimeout request headersを読む際のtimeout http.Server.ReadTimeout request headersやrequest bodyを読む際のtimeout。 SetReadDeadline()を呼び出してセットする。 http.Server.WriteTimeout request bodyの読み込み〜responseの書き込みまで。 SetWriteDeadline()を呼び出し
極力Goならではな特徴をいくつか挙げていく。 依存解決が必要最低限で互換性を考慮しつつ決定的 モジュール単位で依存をダウンロード。コンパイル対象はサブパッケージ単位。 依存の明示方法はコードに埋め込まれ、かつ未参照のインポートはコンパイルエラー。 つまり動作するコードのすべては正確な依存ツリーが明示されていて余計な依存は引き込まれない。 そして持ち前のコンパイルの速さを含め、相当深い依存ツリーでも依存解決にかかる時間は既知の処理系の中でも最速レベル。(唯一勝てるのはプリビルドバイナリが配布されている場合くらい) また、コンパイルやリンクに必要な処理量そのものが比較的少ないため、開発環境負荷も小さい。 かなり巨大なプロジェクトであってもメモリ8GBで困るようなことが無い。つまり、CI環境の維持にもローコストで済む。 ライブラリの提供側では後方互換性が破壊されるような変更はV1->V2というよ
はじめに GoでHTTPのリバースプロキシを作るときには標準パッケージである net/http/httputil の ReverseProxy が使えるので、提供している機能やざっくりした使い方などについて紹介しようと思います。 これは Makuake Development Team Advent Calendar 2019 の22日目の投稿です。 tl;dr hop-by-hop ヘッダーを自動で捨ててくれるのがうれしい X-Forwarded-For を自動で追加してくれてうれしい 通過するリクエスト、レスポンスの加工ができるのでやりたいことはだいたいできそう httputil を利用したリバースプロキシの最小構成 パッケージドキュメントの example からの引用です package main import ( "fmt" "io/ioutil" "log" "net/http"
httputilのReverseProxyを使うgo言語でリバースプロキシを立てるには、httputilパッケージにあるReverseProxyを使うと簡単。 ReverseProxyはhttp.Handlerインタフェースを実装していて、http.ServerのHandlerに渡せる。 以下はlocalhost:9000のリクエストをlocalhost:9001に移譲する処理。 package main import ( "log" "net/http" "net/http/httputil" ) func main() { director := func(request *http.Request) { request.URL.Scheme = "http" request.URL.Host = ":9001" } rp := &httputil.ReverseProxy{Direc
レイトリミットを実装するために golang.org/x/time/rate を採用したものの、しばらく経ってから見返すとその仕様を完全に忘れていてショックだったので、こちらに記事として備忘録的に要点をまとめていきたいと思います。 トークンバケット golang.org/x/time/rate は「トークンバケット」というアルゴリズムを Go で実装したパッケージになります。 このパッケージは一見すると使い方が分かりづらいのですが、「トークンバケット」を理解すると合点がいくデザインとなっているので、まずはこちらを理解しましょう。 一応 Wikipedia にもページがあるのですが(トークンバケット - Wikipedia)、golang.org/x/time/rate パッケージのドキュメントを読むのが端的で分かりやすいと個人的には思いました。Limiter 構造体に対する説明として記載さ
Qiita で golang.org/x/time/rate でレイトリミット - Qiita という記事を見かける。 golang.org/x/time/rate は,いわゆる「トークンバケット(token bucket)」アルゴリズムを実装するためのパッケージのようだ。 トークンバケット・アルゴリズムとは A token is added to the bucket every $1/r$ seconds. The bucket can hold at the most $b$ tokens. If a token arrives when the bucket is full, it is discarded. When a packet (network layer PDU) of $n$ bytes arrives, if at least $n$ tokens are in t
背景 外部APIを叩く時に利用するhttp clientですが、サーバ側がHTTP/2対応しているのであればコネクションの有効活用ができるようHTTP/2を使いたいものです。 その際にhttp client側で設定する点、気をつける点を説明していきます。 環境 Go 1.15.6 curl 7.64.1 HTTP/2対応しているか確認する方法 まずは対象とするサーバやhttp clientがHTTP/2対応になっているかを確認する方法を紹介します。 サーバ側の確認 サーバ側が対応しているかどうかはcurlの-vオプションで手軽に確認できます。 $ curl -v https://google.com * Trying 2404:6800:4004:809::200e... * TCP_NODELAY set * Connected to google.com (2404:6800:4004
技術記事です。今日は Go の golang.org/x/sync/errgroup についてです。 TL; DR Go が並行処理を得意とするのは事実だけど、とはいえ正しく使うのは難しい(特に channel)。 errgroup なら「並行でダウンロードする」のような頻出パターンをとても簡単かつ安全に使えるので、まずはこれで美味しいところだけ頂いてしまおう。 重い処理を並行にすればあなたのプログラムはカジュアルに数倍速くなる。 多分 errgroup だけで現実の要件の85%くらいはカバーできるはず。 channel も含めてちゃんと使いこなしたいと思ったら、Go 言語による並行処理 がおすすめです。 errgroup とは ドキュメントはここを参照してください。説明を読むよりコード例で見たほうが早いと思うのでこちらをどうぞ。 package main import ( "fmt" "
この記事は Kyash Advent Calendar 2020 7日目の記事です。 最近、競技プログラミング(以下、競プロと略します。)にGo言語で参加していまして、私自身はGoでやる事に特には問題を感じておりませんが、競プロでの経験が少ない方だと言語差など気にする方もいると思いますので、そのへんを説明してみるという記事になります。 結論としては、少なくともAtCoderでGoを使うのはそれほど不利ではないので、Goでやってみたいという方は細かい事を気にせずにチャレンジしてみてください。(どの言語でも良いっていうなら、やはりC++のほうが不便が少ないとは思います。) 私は競プロをするようになって、Goに関してはslice周辺への理解が一層深まりました。 競プロの話をする上での前提 まず前提です。ここでいう競プロは特に日本人の参加者も多く、敷居が低いと思われるAtCoderのコンテストを対
皆さん、新しいプログラミング言語を学ぶ時、どのように学習しているでしょうか? 私は4月に新卒でエンジニアになり、業務でGoを使うことになりました。その際、とりあえず公式チュートリアルであるTour of Goをやりましたが、その後にどうやって学習を進めれば良いか迷ってしまいました。 考えてみると、新しい言語を学ぶ際、毎回学習方法に困っている気がします。ネットでサンプルを探す、動画を見る、書籍を読む、などさまざまな学習方法があると思いますが、私は手を動かしながらいろいろなパターンを学んでいくのが好きです。 そこで今回Goを学ぶ際も、手を動かしてさまざまなコーディングのパターンを学習するために、ネットや書籍でサンプルを探して実践しました。 この学習方法は私にとっては楽しみながら続けることができて、他の言語を学ぶ際も今回実装したサンプルを使って学習しようと考えています! そこで自分と同じ様な悩み
結論O(log (n))となり 1000項目めを求めるには0.000199s 10000項目めは0.000405sで求められました。 完成品https://github.com/kooooohe/fibonacci/blob/master/main.go 通常の再帰を使った簡単な解き方 fib_blog_1.goGitHub Gist: instantly share code, notes, and snippets.Gist262588213843476func fib(num int) int { if num <= 1 { return num } return fib(num-2) + fib(num-1) } これだとO(2^n)となるためかなり遅い。 ※メモ化については今回は割愛 メモ化すれば O(n)となる 一般項を求める公式証明は漸化式を使うのだが、今回の主題ではないので
Golang: 文字列のバイトサイズと長さを求めるGolang: 1文字ずつアクセスするGolang: 文字列を逆順に並べ替えるGolang: Unicode エスケープシーケンスを使うGolang: 部分文字列を取り出すGolang: 文字列を連結するGolang: 文字列を繰り返すGolang: 不正なバイト列を置き換えるGolang: Unicode 正規化 文字列型はイミュータブルなので、rune 型のスライスをつくり、並べ替える。 stackoverflow の回答をそのままコピペすると次のとおり。 package main func Reverse(s string) string { runes := []rune(s) for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 { runes[i], runes[j] = run
この記事は、Mackerel アドベントカレンダー(全部CRE)の17日目の記事です。今回も、『プラグイン読み解きシリーズ』でいきたいと思います。題材は、mackerel-plugin-gostats! github.com 当記事が前提とするバージョン この記事を書いている今の最新版である、mackerel-agent-plugins の v0.53.0 を前提としています。 Releases · mackerelio/mackerel-agent-plugins · GitHub また、このプラグインが利用しているパッケージ、fukata/golang-stats-api-handlerのバージョンはv1.0.0を前提としています。 github.com どんなプラグイン? このプラグインは、Goで書かれたアプリケーションが消費しているCPUやメモリリソースの状況、GC回数、gorou
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く