0

現在、golangでオンライン判定システムを書いています。ユーザープログラムのメモリ使用量を検出するために、分析cmd.ProcessState.SysUsage()して確認することにしましRusage.Maxrssた。Rusage.MaxrssMacでこれを実行しようとすると、呼び出しの結果が奇妙になるため、今は混乱しています

これは、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 それともより良いアプローチがありますか?

4

1 に答える 1