現在、golangでオンライン判定システムを書いています。ユーザープログラムのメモリ使用量を検出するために、分析cmd.ProcessState.SysUsage()
して確認することにしましRusage.Maxrss
た。Rusage.Maxrss
Macでこれを実行しようとすると、呼び出しの結果が奇妙になるため、今は混乱しています
これは、macOS と Linux で実行したコードです (現在のプロセスのこのコード呼び出しGetrusage()
は簡略化されています)。得られた結果があります。
package main
import (
"fmt"
"syscall"
)
func main() {
rusage := syscall.Rusage{}
pageSize := syscall.Getpagesize()
if err := syscall.Getrusage(syscall.RUSAGE_SELF, &rusage); err != nil {
fmt.Println(err)
panic(err)
}
fmt.Printf("page size: %d\nrusage.Maxrss: %d\n", pageSize, rusage.Maxrss)
}
そして、私が得た次の結果
- マックOS:
go run test.go page size: 4096 rusage.Maxrss: 2007040
- Linux/Ubuntu-18.04:
go run test.go page size: 4096 rusage.Maxrss: 17580
なぜそんなに大きな値を返すのか説明できますか? macOS のマニュアルと Linux のマニュアル ページを見てきました: rusage.Maxrss (または言語rusage.ru_maxrss
からC
) はキロバイト単位でカウントされるため、Linux では ~20MB しか使用しないのに、macOS では ~2GB のメモリを使用しましたか?
そして、これはユーザープログラムによって使用されるメモリを測定するための良い決定ですか、rusage.Maxrss
それともより良いアプローチがありますか?