linux - macOS 和 Linux 上 get rusage.maxrss 的奇怪值
问题描述
目前我正在用golang编写在线判断系统。为了检测用户程序内存使用情况,我决定分析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)
}
以下是我得到的结果
- 苹果系统:
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
语言)以千字节为单位,所以在 macOS 上我的代码使用了 ~2GB 的内存,而在 Linux 上它只使用了 ~20MB?
这是一个很好的决定来衡量用户程序使用的内存rusage.Maxrss
还是有更好的方法?
解决方案
在我的 Mac 上,getrusage()
手册页说:“ ru_maxrss使用的最大驻留集大小(以字节为单位)”(添加了重点)。这似乎对你的结果有意义。
您所指的Apple遗留文档档案中的iOS手册页确实说单位是千字节。目前尚不清楚这是由于 iOS 和 macOS 之间的不同行为还是手册页中的错误已得到纠正。遗憾的是,Apple 没有在线维护维护手册页。
推荐阅读
- c# - 如何删除字符串 C# 中的所有空格
- c - 为什么我不能在 C 中的浮点数之后添加 \n 来创建另一行?
- reactjs - NPM 错误 SSL 例程:ssl3_get_record:decryption failed or bad record mac npm
- hadoop - 添加 BucketOwnerFullControl 配置后 GlueContext write_dynamic_frame 失败
- spring - 我试图在我的springboot项目中使用JPA,但是当我尝试运行spring boot应用程序时添加依赖项后,它显示错误
- reactjs - 如何从子级到父级获取状态变量?
- python - python - 如何从“tkcalender”库中获取出生日期
- javascript - onchange 事件之间的冲突
- android - Android 调用组件 w/listener 或让 viewmodel 调用组件与片段通信
- mongodb - 调用从 clojure 接受变量 args 的 java 方法