странные значения 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 не определен.