检查每个进程和子进程的内存消耗

14 浏览
0 Comments

检查每个进程和子进程的内存消耗

我试图创建一个脚本来展示mysqld的每个进程和子进程使用了多少内存。你可以在我的代码中看到我已经做了什么。\n

#!/bin/bash
#包含输出的文件:pstree mysql -a -p |awk '{print $1;}' | sed 's/|-        {mysqld},//' >> psadd
文件名='psadd'
#总计= '0'
echo 开始
while read p; do
    memU= cat /proc/$p/smaps |grep -e Private -e Shared |awk '{print $2}' |awk '{total = total + $1}END{print total}'
    echo "进程ID:"$p  "内存使用:"$memU
总计="$((total+memu))"
echo "这是当前的总计:" $total
done < $filename
echo "总计=" $total

\n如果你有任何想法,将不胜感激。

0
0 Comments

检查进程和子进程的内存是一个复杂的过程。通常使用进程的RSS(常驻集大小)来计算进程使用的内存量,这是进程在内存中占用的内存量,不与其他进程共享。

以下代码找到MySQL守护进程的进程ID,并使用ps命令输出不带标题的RSS值。最后,将此值乘以4以获得以KiB为单位的RSS大小(默认页面大小为4 KiB)。

ps -o rss= -p `pidof mysqld` | awk '{print $1*4, "KiB"}'

感谢您提供的信息。如果您不介意,我在将其添加到我的脚本中遇到了一些问题。

#!/bin/bash
filename='psadd'
echo Start
while read p; do
    memU=`ps -o rss= -p $p | awk '{print $1*4, "KiB"}'`
    echo "Process ID:"$p  "Memory Usage:"$memU
done < $filename

我将进程ID存储在名为psadd的文件中,脚本会逐行读取该文件并计算每个进程的内存使用情况。

在pastebin上可以查看代码的格式化版本:pastebin.com/yUbHjU5j。在代码中,ps会报错,但是我认为我正确地传递了变量。再次感谢您的帮助。

另外,请问如何将一组进程ID传递给您提供的命令?我尝试使用变量$p,但没有成功。我还尝试将包含每行一个新进程ID的列表/tmp/psadd传递给命令,但也没有成功。

pstree不会列出mysqld和子进程,它列出的是子线程。"进程的子线程在父进程下,并用花括号中的进程名显示"。这很令人困惑。

ps命令是否已经以KiB而不是页面的形式给出rss了?在手册中,我发现"resident set size,任务使用的未交换物理内存(以千字节为单位)(别名rssize,rsz)"。此外,关键字"resident"将给出"resident pages",而不是关键字"rss"给出的"resident set size"。我猜这意味着上面的命令将给出内存占用的4倍。

但是,如果直接从/proc/stat获取数据,则rss将以页面数量表示,您需要乘以页面大小才能以相同单位(与页面大小相同)获得内存使用量。

0