
TWSNMP開発日誌:GO言語1.19対応検討、ログの保存が遅くなる問題の調査
今日から10月です。何となくやる気がでてきたので4時に起きて開発開始です。
まずは、GO言語のバージョンアップについて調べました。最近Dokcer環境でビルドできるようにしたので、GO言語のバージョンを変えてビルドしてみました。
のbuildの説明の
$docker run -it golang:1.17 /bin/bash
を
$docker run -it golang /bin/bash
にすればGO言語の最新版でビルドできます。
やってみるとビルド環境を作るスクリプトに問題があったので修正しました。修正内容は
です。
修正後には以外と簡単にビルドは完了しました。
いけそうと思って起動してみるとパニック発生しました。
root@8c066fb4fc4f:/go/twsnmpfc# dist/twsnmpfc
panic: Something in this program imports go4.org/unsafe/assume-no-moving-gc to declare that it assumes a non-moving garbage collector, but your version of go4.org/unsafe/assume-no-moving-gc hasn't been updated to assert that it's safe against the go1.19 runtime. If you want to risk it, run with environment variable ASSUME_NO_MOVING_GC_UNSAFE_RISK_IT_WITH=go1.19 set. Notably, if go1.19 adds a moving garbage collector, this program is unsafe to use.
goroutine 1 [running]:
go4.org/unsafe/assume-no-moving-gc.init.0()
/go/pkg/mod/go4.org/unsafe/assume-no-moving-gc@v0.0.0-20201222180813-1025295fd063/untested.go:24 +0x1f4
そんなに甘くないと思って諦めようかと思いましたが、いつものようにエラーメッセージを Googleさんに聞いてみるとパッケージをアップデートすればOKのようなのでやってみました。
# go get -u go4.org/unsafe/assume-no-moving-gc
で問題解決しました。助手の猫が天から
「思ったより甘いこともある」
と言っています。
ビルドしたものをテスト環境で動かしてみました。基本的な動作は問題ないです。Web画面の表示が速くなったと思ったのですが、元のバージョンでも同じぐらいだったので気のせいでした。
少しログを観察しているとログの保存に時間がかかる現象が発生していました。よい機会なので調べることにしました。
調べる方法を一つ思いつきました。実際にデータベースに保存する処理に時間がかかるのか?保存するためのデータベースのトランザクションの開始に時間がかかるのか?を切り分けるためのログの出力方法です。
早速やってみました。

効果的な結果が得られました。ちょっと嬉しい。案の定実際の保存ではなく、トランザクションの開始に時間がかかっていました。
データベースに使っているbbolt の排他制御の問題のようです。
初心に帰ってbboltのドキュメントを読んでみました。
どうやら、DB.Update()でデータを更新するとディスク書き込み待ちで時間がかかるようです。
ソースコードを調べて見ると、レポートを削除する処理などで改善できそうです。これを解決できればかなりの性能アップです。
試してみようと思いましたが、なぜか保存処理が遅い現象が再現しなくなってしまいました。今朝は歯医者に行くので午後から試してみようと思います。
明日に続く
いいなと思ったら応援しよう!
