我曾经有过从正在运行的应用程序中确定以下性能参数的任务:
代码必须在Windows和Linux上运行.尽管这似乎是一项标准任务,但在手册(WIN32 API,GNU文档)以及Internet上查找必要的信息花了我好几天,因为关于这个主题的信息太多不完整/不正确/过时了发现了那里.
为了避免其他人遇到同样的麻烦,我认为收集所有分散的信息以及我在一个地方通过反复试验找到的信息是个好主意.
我需要在我的程序运行时获取mem使用VIRT和RES并显示它们.
到目前为止我尝试了什么:
getrusage(http://linux.die.net/man/2/getrusage)
int who = RUSAGE_SELF;
struct rusage usage;
int ret;
ret=getrusage(who,&usage);
cout<<usage.ru_maxrss;
Run Code Online (Sandbox Code Playgroud)
但我总是0.
是否有任何现成的解决方案来记录系统启动时的内存消耗?我想将数据记录到简单的文本文件或某个数据库中,以便稍后进行分析.
我正在研究基于Linux 2.4的嵌入式系统.我需要调试与内存消耗相关的问题.我的应用程序会自动启动每个系统启动.我需要从定期间隔(尽可能经常)获取带时间戳的数据的方法,这样我就可以追踪问题.
我的问题的症状:当系统启动时,它启动了我的主应用程序和GUI,以可视化系统的主要参数.GUI基于GTK +(X服务器).如果我禁用GUI和X服务器,那么我的应用程序工作正常.如果我启用GUI和X服务器,当我在主板上安装256 MiB或512 MiB的物理内存时,它不起作用.如果我安装了1 GiB内存,那么一切正常.
"Kubernetes"(v1.10.2)说我的pod(包含一个容器)使用大约5GB的内存.在容器内部,RSS更像是681MiB.可以解释如何使用以下数据从681MiB到5GB(或者描述如何从容器或在kubernetes中运行此容器的docker主机中省略的另一个命令来弥补差异)?
kubectl top pods说5GB:
% kubectl top pods -l app=myapp
NAME CPU(cores) MEMORY(bytes)
myapp-56b947bf6d-2lcr7 39m 5039Mi
Run Code Online (Sandbox Code Playgroud)
Cadvisor报告了一个相似的数字(可能来自略有不同的时间,所以请忽略小的差异):
container_memory_usage_bytes{pod_name=~".*myapp.*"} 5309456384
5309456384 / 1024.0 / 1024 ~= 5063 ~= 5039
Run Code Online (Sandbox Code Playgroud)
在容器内部,此文件似乎是cadvisor获取其数据的位置:
% kubectl exec -it myapp-56b947bf6d-2lcr7 bash
meme@myapp-56b947bf6d-2lcr7:/app# cat /sys/fs/cgroup/memory/memory.usage_in_bytes
5309456384
Run Code Online (Sandbox Code Playgroud)
容器内的驻留集大小(RSS)不匹配(小于1GB):
meme@myapp-56b947bf6d-2lcr7:/app# kb=$(ps aux | grep -v grep | grep -v 'ps aux' | grep -v bash | grep -v awk | grep -v RSS | awk '{print $6}' | awk '{s+=$1} END {printf "%.0f", s}'); mb=$(expr $kb / 1024); printf …Run Code Online (Sandbox Code Playgroud) 我注意到,与进程本身认为使用(使用)的内容相比,PHP进程的内存使用情况top或ps报告之间存在很大差异memory_get_usage.
该进程实际使用了多少内存?
与我的某个应用程序一起运行以下代码时:
echo "Memory usage: " . pretty_bytes(memory_get_usage()) . PHP_EOL;
echo "Peak memory usage: " . pretty_bytes(memory_get_peak_usage()) . PHP_EOL;
echo "'Actual' memory usage: " . pretty_bytes(memory_get_usage(true)) . PHP_EOL;
echo "'Actual' peak memory usage: " . pretty_bytes(memory_get_peak_usage(true)) . PHP_EOL;
$ps_output = exec("ps --pid " . getmypid() . " --no-headers -o rss");
echo "'Memory usage according to ps: " . pretty_bytes(intval($ps_output) * 1000);
Run Code Online (Sandbox Code Playgroud)
随机点的输出是:
Memory usage: 4.77 MB
Peak memory usage: 4.99 MB
'Actual' memory …Run Code Online (Sandbox Code Playgroud) 我的问题是标题,我通过搜索获得了一些知识:
linux有共享内存 如何衡量应用程序或进程的实际内存使用情况?
JVM将保留在Xms中设置的内存量 -Xms JVM在引用堆内存时的含义是什么?
但还是不知道为什么,有些可以提供一些帮助吗?
这是我在Ubuntu12.04(64位)上的测试运行 JDK 1.7.0_04.和顶部显示如下:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4067 brian 20 0 5316m **262m** 7496 S 0 3.3 0:00.30 java -**Xms4096m** -Xmx4096m Test
4066 brian 20 0 3182m **256m** 7496 S 0 3.3 0:00.30 java -**Xms2048m** -Xmx2048m Test
4065 brian 20 0 2114m **252m** 7492 S 0 3.2 0:00.30 java -**Xms1024m** -Xmx1024m Test
4064 brian 20 0 1314m **76m** 7584 S 0 1.0 0:00.20 java -**Xms256m** …Run Code Online (Sandbox Code Playgroud) 我只是想知道如何在特定时间(比如5秒)找到特定进程的内存消耗
我是linux的新手.因此,这样做的详细步骤将不胜感激
给定PID,如何获取进程当前使用的内存?具体我正在寻找:
但我对映射文件和共享内存不感兴趣.简而言之,我想确定通过终止PID释放多少内存(RAM和交换).
为什么我在Linux中使用'top'来显示我对一个进程的记忆,我得知进程的存储只会增加而不会减少,除非我关闭所有进程.我不知道为什么,尽管我使用'免费'只落后'malloc'.如何获得正确的实时实时存储?谢谢大家.
我正在使用Linux,go和os/exec来运行一些命令.我想知道一个进程'实时内存使用情况.这意味着我可以在启动进程后随时询问内存使用情况,而不仅仅是在运行之后.
(这就是为什么在回答使用golang测量可执行的运行的内存使用情况是不一种选择对我来说)
例如:
cmd := exec.Command(...)
cmd.Start()
//...
if cmd.Memory()>50 {
fmt.Println("Oh my god, this process is hungry for memory!")
}
Run Code Online (Sandbox Code Playgroud)
我不需要非常精确的值,但如果它的误差范围低于10兆字节则会很好.
有没有办法做到这一点,或者我需要某种命令行技巧?