diff --git a/examples/psutil/mem/vmem/.gitignore b/examples/psutil/mem/vmem/.gitignore new file mode 100644 index 00000000..7a0b7f00 --- /dev/null +++ b/examples/psutil/mem/vmem/.gitignore @@ -0,0 +1 @@ +app \ No newline at end of file diff --git a/examples/psutil/mem/vmem/README.md b/examples/psutil/mem/vmem/README.md new file mode 100644 index 00000000..90116fcd --- /dev/null +++ b/examples/psutil/mem/vmem/README.md @@ -0,0 +1,14 @@ +# これは何? + +[gopsutil](https://github.com/shirou/gopsutil)を用いてメモリ消費量を取得するサンプルです。 + +```sh +$ task +task: [build] go build -o app main.go +task: [run] ./app +07:25:17 Total=7938MB Used=1569MB Free= 417MB +07:25:18 Total=7938MB Used=1722MB Free= 264MB +07:25:19 Total=7938MB Used=1850MB Free= 187MB +07:25:20 Total=7938MB Used=1886MB Free= 151MB +07:25:21 Total=7938MB Used=1886MB Free= 151MB +``` diff --git a/examples/psutil/mem/vmem/Taskfile.yml b/examples/psutil/mem/vmem/Taskfile.yml new file mode 100644 index 00000000..928cd9cb --- /dev/null +++ b/examples/psutil/mem/vmem/Taskfile.yml @@ -0,0 +1,15 @@ +# https://taskfile.dev + +version: '3' + +tasks: + default: + cmds: + - task: build + - task: run + build: + cmds: + - go build -o app main.go + run: + cmds: + - ./app \ No newline at end of file diff --git a/examples/psutil/mem/vmem/main.go b/examples/psutil/mem/vmem/main.go new file mode 100644 index 00000000..f8b84043 --- /dev/null +++ b/examples/psutil/mem/vmem/main.go @@ -0,0 +1,66 @@ +package main + +import ( + "log" + "time" + + "github.com/shirou/gopsutil/v4/mem" +) + +func main() { + log.SetFlags(log.Ltime) + + if err := run(); err != nil { + log.Fatal(err) + } +} + +func run() error { + const ( + COUNT = 5 + ) + var ( + interval = 1 * time.Second + mb = func(v uint64) uint64 { + // 概算値で良いので整数除算 + return v >> 20 + } + done = make(chan struct{}) + useMem = func(done <-chan struct{}, ready chan<- struct{}, bufSize uint64) { + buf := make([]byte, bufSize) + for i := range len(buf) { + buf[i] = 0 + } + + close(ready) + <-done + } + ) + for range COUNT { + // 現在のメモリ量を取得 + var ( + vms *mem.VirtualMemoryStat + err error + ) + vms, err = mem.VirtualMemory() + if err != nil { + return err + } + + log.Printf("Total=%4dMB\tUsed=%4dMB\tFree=%4dMB", mb(vms.Total), mb(vms.Used), mb(vms.Free)) + + // 意図的にメモリを占有していく + var ( + ready = make(chan struct{}) + ) + go useMem(done, ready, 150<<20) + <-ready + + time.Sleep(interval) + } + + close(done) + time.Sleep(500 * time.Millisecond) + + return nil +}