TL; DR
t.Run
でネストしたテストを実行する時、Runに渡す関数はトップレベルのテストが実行されているのと別のgoroutineで実行されているのでParameterized Testなんかをやってる場合、変数のスコープに注意しましょう。
runtime.MemStats を使うと現時点でのメモリの使用状況などを確認できます。
とりあえず、以下のようなコードを埋めるとAlloc (割り当てられたヒープオブジェクトのバイト数) とNumGC (GCの回数) を確認できます。ついでに期間中の最大のAllocも確認しています。
その他必要なデータはMemStatsのドキュメントを読みながら適宜追加すること。
package main import ( "log" "runtime" "time" ) func main() { tick := time.NewTicker(2 * time.Second) defer tick.Stop() go func() { var maxAlloc uint64 for range tick.C { var s runtime.MemStats runtime.ReadMemStats(&s) toMB := func(v uint64) uint64 { return v / (1024 * 1024) } alloc := s.Alloc if maxAlloc < alloc { maxAlloc = alloc } log.Println("===============================") log.Printf("Alloc: %d\n", toMB(alloc)) log.Printf("MaxAlloc: %d\n", toMB(maxAlloc)) log.Printf("NumGC: %d\n", s.NumGC) log.Println("===============================") } }() someMemoryBoundFunction() }
昨年末に家 (建売新築) を買ったのでその記録です。今回は購入する所まで。
https://www.xplenty.com/jp/blog/etl-vs-elt-ja/
を読んでのETLとELTの違いのざっくりしたまとめ
https://www.kernel.org/doc/Documentation/cgroup-v1/devices.txt
cgroupはmknod (特殊ファイルの作成) を制限できる。
echo 'c 1:3 mr' > /sys/fs/cgroup/1/devices.allow
これは 「cgroup 1 に/dev/nullのread and mknod の権限を追加する」という意味になる
1:3
はMajor, minorデバイス番号。詳細は ここ 参照参考: https://linuxcommand.net/mknod
Dockerで設定する場合 --device-cgroup-rule
を使う
docker run --rm --device-cgroup-rule 'c 1:3 mr' myapp
Terraform 0.14からDependency Lock File が導入されました。
そのためTerraformのproviderを更新する際にこちらのlock file (.terraform.lock.hcl
) も更新する必要があります。
SEQSENSEでは Renovate を使ってライブラリアップデートを行っていますが*1、Terraformのproviderのバージョンアップは対応しているものの、lock fileの更新は2021/6/6時点でまだ未対応です。
そのため、RenovateのPRが作成された後にlock fileを更新してpushするGitHub Actionを作成しました。
以下の設定をすると、RenovateのPRが作成された際に、.terraform.lock.hcl
を検知して更新したものをpushしてくれます。
name: terraform-lock-fix on: push: branches: - renovate/* jobs: terraform-lock-fix: runs-on: ubuntu-latest steps: - name: checkout uses: actions/checkout@v2 with: fetch-depth: 2 - name: fix uses: seqsense/terraform-lock-fix-action@v0 with: git_user: @@MAINTAINER_NAME@@ git_email: @@MAINTAINER_EMAIL_ADDRESS@@ github_token: ${{ secrets.GITHUB_TOKEN }} commit_style: squash push: force
Terraformのproviderのバージョン指定は範囲指定など柔軟にできるようになってますが (参考)、Renovateを使う場合、次のバージョンの検知はRenovateが勝手にやってくれるので、Renovate外での不要な更新を避けるために固定バージョンでやるのが良いと思います。
terraform { required_providers { aws = { source = "hashicorp/aws" version = "3.44.0" // version = "~> 3.0" } } }