检查每个进程和子进程的内存消耗
检查每个进程和子进程的内存消耗
我试图创建一个脚本来展示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如果你有任何想法,将不胜感激。
检查进程和子进程的内存是一个复杂的过程。通常使用进程的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将以页面数量表示,您需要乘以页面大小才能以相同单位(与页面大小相同)获得内存使用量。