странные значения get rusage.maxrss в macOS и Linux

В настоящее время я пишу онлайн-систему суждения о голанге. Чтобы обнаружить использование памяти пользовательской программой, я решил проанализироватьcmd.ProcessState.SysUsage() и проверьте Rusage.Maxrss. Теперь я запутался, потому что, когда я пытаюсь запустить это на моем Mac, результатRusage.Maxrss звонок странный

Вот код, который я запускал на 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)
}

И следующие результаты я получил

  • MacOS:
    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 language) измеряется в килобайтах, поэтому в macOS мой код использовал ~2 ГБ памяти, тогда как в Linux он использовал только ~20 МБ?

И это хорошее решение для измерения памяти, используемой пользовательской программой с помощью rusage.Maxrssили есть подход получше?

2 ответа

Решение

На моих Mac getrusage()На странице руководства сказано: "ru_maxrss - максимальный размер используемого резидентного набора (в байтах)" (курсив добавлен). Кажется, это объясняет ваши результаты.

На странице руководства iOS в архиве устаревшей документации Apple, на которую вы ссылались, действительно указано, что единицы измерения - килобайты. Неясно, связано ли это с разным поведением iOS и macOS или с ошибкой на странице руководства, которая с тех пор была исправлена. Жаль, что Apple не поддерживает в Интернете справочные страницы.

Насколько я могу судить (из тестирования и справочных страниц)

  • Во FreeBSD, OpenBSD и NetBSD maxrss указывается в килобайтах, а ixrss — в байтах.

  • На Macos, начиная с версии 10.11 (El Capitan), maxrss указывается в байтах, а ixrss — в килобайтах.

  • В MacOS X 10.6... ?? maxrss и ixrss в килобайтах

  • В Linux (начиная с версии 2.6.32) maxrss указывается в килобайтах, а ixrss не определен.

Другие вопросы по тегам