薄いブログ

技術の雑多なことを書く場所

javy にビルドを高速化する --no-source-compression オプションを追加した

前回の記事で javy でのビルドが遅い原因について書きました。 orisano.hatenablog.com あのあとやっぱり気になったので Issue を立てて PR を作成してみました。 github.com レビュワーからのフィードバックもあり当初考えていた圧縮レベルを指定できるオプ…

bytecodealliance/javy を軽く調べた

javy の処理の流れ github.com この記事は 0df708ec7b455a4896481a4926eccb23fe6c6014 時点でのソースコードをもとに書いています。詳細は自分で確認してください。 背景 sqlc-gen-typescript が tsc + esbuild + javy を使って作られていてそこで javy の存…

sqlc internals

github.com sqlc は何をやっているのか、問題に遭遇したときに調査するべき箇所はどこか? というのを sqlc 1.20 時点の情報をもとに書いていきます。 背景 最近 sqlc に PR を送るようになり sqlc についての理解が深まってきたのでまとめておこうというの…

sqlc plugin を書こう

背景 https://github.com/orisano/sqlc-gen-ts-d1 というプラグインを作成していて生成コードの好みが人によって大きく異なると感じることがありました。 一つのプラグインで生成コードをカスタマイズできるアプローチには保守性的な意味でも限界があるだろ…

次なる pkg/errors を探してを読んで

https://tech.kanmu.co.jp/entry/2023/06/19/150000 を読んで思ったこと、調べたことを書きます。 pkg/errors の移行先を探すという話で cockroachdb/errors goark/errs の2つが候補から最終的には cockroachdb/errors を選んでいました。 検討の中で求める…

Go 1.15 から io.CopyBuffer はコピー先が *os.File だと指定したバッファーを使わない

TL;DR Go 1.15 から io.CopyBuffer はコピー先が *os.File だと指定したバッファーを使わない 6/3 21:57 追記 調べてみたら Go 1.15 の Release Note https://t.co/VUcSeYYrZB の os の項目に説明がありました。issue もあるみたいですね https://t.co/q1mhw…

Apple Silicon だと go tool pprof の Disassemble が動かない問題とその対応

まとめ macOS ARM64 では -no_pie オプションが使えなくなっていて、現状だと go tool pprof で Source / Disassemble が使えない。 プロファイリング対象のバイナリ自身でプロファイルを書き換えるライブラリを作成し Source / Disassemble ができるように…

Pythonのbytesはsubscriptでコピーが発生する

TL;DR Pythonのbytesはsubscriptでmemmoveする。 背景 Pythonで簡単なバイナリのパーサーを書いていたとき、そんなに入力が大きくない(1.6MB程度)のに処理に時間がかかることに気づいた。 調査 まず当該プログラムをcProfileを使ってプロファイリングしてみ…

JavaにおけるHeapのClassHistogramを取得する複数の方法とその違い

TL;DR 方法 Full GCの有無 タイミング 条件 JFR の jdk.ObjectCount あり 定期的 JFRが使える -XX:+PrintClassHistogram あり シグナル受信時 JDK 1.4.2~ jmap -histo:live あり 実行時 JDK 1.4.2~ jcmd GC.class_histogram あり 実行時 JDK 7~ jmap -histo …

「CPythonのソースコードを読んでみた」を読んで

背景 inside.estie.co.jp を読んでExステージについて検証したくなったので alloc_bytes と alloc_list の速度差について python 3.11 intel mac def alloc_bytes(size): return b"ABCDEFGH" * size while True: alloc_bytes(1024**2 * 128) def alloc_list(…

How to stop running out of ephemeral ports and start to love long-lived connections の副読本

https://blog.cloudflare.com/how-to-stop-running-out-of-ephemeral-ports-and-start-to-love-long-lived-connections/ を読んでいて理解できなかったところをまとめた記事です。 元記事の簡単な概要 エフェメラルポートが枯渇しないようにローカルポートの…

docker pull を速くするために:layer-parallel から chunk-parallel へ

この記事は Recruit Advent Calendar 2021 の15日目の記事です。 TL;DR 従来のレイヤー並列の pull より Range リクエストを用いたチャンク並列の pull によって速度が 2~5倍速くなる可能性がある。 ECR は Public だと region ごとに速度が大きく異るので安…

MySQLのエラー番号はどこに定義されているのか

背景 Go のアプリケーションで MySQL のエラー番号によって処理を分岐させたいことがあり、調査していたらドキュメントには記載されていた。 (例: ER_DUP_ENTRY(1062) をハンドリングしたい) Go から参照しやすいように定数で提供されているものはないかと調…

json.Marshalがエラーを返すとき

go 1.14.3 で確認した内容で個人的なメモです. 使っているバージョンによって異なる可能性があるので一次情報を参照してください. golang.org github.com ソースコード上では encodeState の error が呼び出されているところを確認すれば良いと思われます. …

なぜ cache-from を指定しなければいけないか

orisanoさんの https://t.co/tgT7fSDNPE これ読んだしコードも読んだけど、pull しておくだけではダメで cache fromで指定してあげないとキャッシュ効かない理由がわからない…。多分レイヤーをちゃんと理解してないな— totem (@takhirata) 2019年12月2日 気…

kaniko が何をしているか, 何ができるか

TL;DR kaniko を理解してない限りコンテナから出してはいけない. kaniko を使っていればmulti stage buildだろうとCIのcacheについて余計なことを考えなくてよい (Dockerfileの書き方はcacheを意識して) kaniko とは github.com kanikoはGoogleが作っている…

CIにおけるMulti-stage Buildsのcache

CIの時間を短くする活動を行っており, 特にその一部のアプリケーションコンテナの継続的 docker buildの改善について書きたいと思います. CIにおけるMulti-stage Builds Multi-stage Buildsについては以下の記事を参照すると良いと思います. docs.docker.com…

GoでASTと戯れる

GoでAST(Abstract Syntax Tree)を使ってソースコードを解析, 生成を行うに際してライブラリを作ったりしたので紹介したいと思います. AST Goは標準で go/ast でASTを扱うことができます. 便利なものもありますし詳しく記述されているのでgo/astのgodocを見る…

コンテナイメージを小さくするために

CIの時間を短くする活動を行っており, 特にその一部のアプリケーションコンテナビルドの改善について書きたいと思います. TL;DR コンテナイメージを小さくするのは pull / push のコストを減らすため ベースイメージを小さいものにする (ex. alpine linux, d…

ちゃんと理解するdocker build cache

CIの時間を短くする活動を行っており, 特にその一部のアプリケーションコンテナの継続的 docker buildの改善について書きたいと思います. TL;DR dockerd の内部でイメージの子についての情報を持っている イメージ自体は親の情報しか持ってない cache対象の…

monorepoのdocker buildにおけるdockerignore

表題の通りなのですが, monorepoにおけるdocker buildの話です. build contextの話 まずこの問題を認識する上で必要なのがbuild contextの理解です. docs.docker.com Best practiceでも触れられている通り, build contextの概念は非常に重要です. When you i…

orisano/targd の話

github.com 上のツールを作ったので紹介します. 背景 Docker buildを高速に, そして小さいイメージを作るためにMulti-stage buildsを日々活用しています. コンテナベースのCIを使っていたり, アプリケーションをコンテナ前提で作っているとCIでDocker build…

orisano/minid の話

github.com 上のツールを作ったので紹介の記事です. 背景 僕はアプリケーションエンジニアとしてDockerfileをそこそこ書くことがあるのですが, 巷にあふれるDockerfileがRUN一つにまとめられているのがずっと不思議に思っていました. 見栄えも悪いし, これっ…

kubeletの負荷が問題になった話 (google/cadvisor)

orisano.hatenablog.com の続編です. 上の記事では以下の図の左側について書きましたが今回は右側についてです. google/cadvisorの高速化 上の図は非常に見づらいですが, 右側にgoogle/cadvisorというのが見えると思います. github.com google/cadvisorとい…

kubeletの負荷が問題になった話 (prometheus/common)

ある日, 同僚からkubeletのCPU負荷が高くて困っていると相談されたときの話です. 実際に監視しているそのkubeletのCPU使用率は高いことを確認し, 問題が起きているインスタンスの調査をはじめました. kubernetes/server.go at master · kubernetes/kubernete…

Socket.IOとGoの話

speakerdeck.com goでsocket.ioのclientを実装した話です. 背景 socket.io を使ったアプリケーションに負荷試験をしたいというのがありました. go で書きたいという気持ちとよく考えたら socket.io のことあまり知らないなという気持ちから実装してみようと…

go-swaggerを速くした話

orisano.hatenablog.com orisano.hatenablog.com github.com go-swaggerのgenerate serverを速くした話をします. 上の2つの記事であげたPRでgo-swaggerのコード生成を速くしました. 上の2つの記事ではどこが遅いか明らかになった状態からのことを書きまし…

go-openapi/swagを速くした話

github.com GitHub - go-openapi/swag: goodie bag in use in the go-openapi projects を速くしたときの話をしたいと思います. go-openapi/swag はgo-openapi と go-swagger のヘルパー関数が入っているライブラリです. 調査の結果, regexp.MustCompileが重…

go-openapi/loadsを速くした話

github.com GitHub - go-openapi/loads: openapi specification object model の速度を改善したときの話をしたいと思います. go-openapi/loadsはgoでopenapiのschemaを読み込むためのライブラリです. 調査の結果json.Unmarshalが重く,このライブラリのAnalyz…

PythonでUnicodeDecodeError/UnicodeEncodeErrorが出たときの原因調査法

Python2を使っているマルチバイト圏の人間なら一度は遭遇したことがあるであろうUnicodeDecodeError. スタックトレースに出る情報は UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128) こういう出力で正…