在Linux中,如何知道进程使用了多少内存?

2024-11-07 08:55:00
admin
原创
28
摘要:问题描述:我认为我的 LAMP 应用程序可能存在内存泄漏(内存用尽、交换开始被使用等)。如果我能看到各个进程使用了​​多少内存,这可能会帮助我解决问题。有没有办法在 *nix 中查看此信息?解决方案 1:获得正确的内存使用比人们想象的要困难得多。我能找到的最好的方法是:echo 0 $(awk '/TYPE/...

问题描述:

我认为我的 LAMP 应用程序可能存在内存泄漏(内存用尽、交换开始被使用等)。如果我能看到各个进程使用了​​多少内存,这可能会帮助我解决问题。有没有办法在 *nix 中查看此信息?


解决方案 1:

获得正确的内存使用比人们想象的要困难得多。我能找到的最好的方法是:

echo 0 $(awk '/TYPE/ {print "+", $2}' /proc/`pidof PROCESS`/smaps) | bc

其中“PROCESS”是您要检查的进程的名称,“TYPE”是以下之一:

  • Rss:常驻内存使用量,即进程使用的所有内存,包括该进程与其他进程共享的所有内存。不包括交换空间;

  • Shared:本进程与其他进程共享的内存;

  • Private:该进程使用的私有内存,您可以在这里查找内存泄漏;

  • Swap:进程使用的交换内存;

  • Pss:比例集大小,一个很好的整体内存指标。它是针对共享进行调整的 Rss:如果一个进程有 1MiB 的私有内存,而其他 10 个进程之间共享了 20MiB,则 Pss 为 1 + 20/10 = 3MiB

其他有效值是Size(即虚拟大小,几乎没有意义)和Referenced(当前标记为引用或访问的内存量)。

您可以使用watch或其他一些 bash-script-fu 来关注您想要监控的进程的那些值。

更多信息请参见smaps: http: //www.kernel.org/doc/Documentation/filesystems/proc.txt。

解决方案 2:

我不知道为什么答案看起来如此复杂...这样做似乎很简单ps

mem()
{                                                                                                      
    ps -eo rss,pid,euser,args:100 --sort %mem | grep -v grep | grep -i $@ | awk '{printf $1/1024 "MB"; $1=""; print }'
}

使用示例:

$ mem mysql
0.511719MB 781 root /bin/sh /usr/bin/mysqld_safe
0.511719MB 1124 root logger -t mysqld -p daemon.error
2.53516MB 1123 mysql /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306

解决方案 3:

使用ps查找应用程序的进程 ID,然后使用top -p1010(将 1010 替换为真实进程 ID)。RES 列是已使用的物理内存,VIRT 列是已使用的虚拟内存 - 包括库和交换内存。

可以使用“man top”找到更多信息

解决方案 4:

首先获取pid:

ps ax | grep [process name]

进而:

top -p PID

您可以同时观看多个过程:

top -p PID1 -p PID2 

解决方案 5:

您可以使用pmap来报告内存使用情况。

概要:

pmap [ -x | -d ] [ -q ] pids... 

解决方案 6:

如果您没有当前或长期运行的进程需要跟踪,则可以使用/usr/bin/time

这与 Bash 不同time(正如您将看到的)。

例如

# /usr/bin/time -f "%M" echo

2028

top这是“进程生命周期内的最大驻留集大小,以千字节为单位”(引自手册页)。也就是说,与et al.中的 RES 相同。

您还可以从 获得更多/usr/bin/time

# /usr/bin/time -v echo

Command being timed: "echo"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 1988
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 77
Voluntary context switches: 1
Involuntary context switches: 0
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0

解决方案 7:

更优雅的方法:

echo "Memory usage for PID <>:"; for mem in {Private,Rss,Shared,Swap,Pss};do grep $mem /proc/<pid>/smaps | awk -v mem_type="$mem" '{i=i+$2} END {print mem_type,"memory usage:"i}' ;done

解决方案 8:

使用tophtop并注意“RES”(驻留内存大小)列。

解决方案 9:

谢谢。我用它创建了这个简单的 bash 脚本,可用于监视进程及其内存使用情况:

$ watch watchmypid.sh

#!/bin/bash
#

PROCESSNAME=changethistoyourprocessname
MYPID=`pidof $PROCESSNAME`

echo "=======";
echo PID:$MYPID
echo "--------"
Rss=`echo 0 $(cat /proc/$MYPID/smaps  | grep Rss | awk '{print $2}' | sed 's#^#+#') | bc;`
Shared=`echo 0 $(cat /proc/$MYPID/smaps  | grep Shared | awk '{print $2}' | sed 's#^#+#') | bc;`
Private=`echo 0 $(cat /proc/$MYPID/smaps  | grep Private | awk '{print $2}' | sed 's#^#+#') | bc;`
Swap=`echo 0 $(cat /proc/$MYPID/smaps  | grep Swap | awk '{print $2}' | sed 's#^#+#') | bc;`
Pss=`echo 0 $(cat /proc/$MYPID/smaps  | grep Pss | awk '{print $2}' | sed 's#^#+#') | bc;`

Mem=`echo "$Rss + $Shared + $Private + $Swap + $Pss"|bc -l`

echo "Rss     " $Rss
echo "Shared  " $Shared
echo "Private " $Private
echo "Swap    " $Swap
echo "Pss     " $Pss
echo "=================";
echo "Mem     " $Mem
echo "=================";

解决方案 10:

您需要的工具是 ps。要获取有关 Java 程序正在执行的操作的信息:

ps -F -C java 

获取有关 http 的信息:

ps -F -C httpd

如果您的程序在您有机会运行这些之前结束,请打开另一个终端并运行:

while true; do ps -F -C myCoolCode ; sleep 0.5s ; done

解决方案 11:

您可以使用pmap+ awk

最有可能的是,我们感兴趣的RSS是下面示例输出最后一行第 3 列的内存pmap(82564)。

$ pmap -x <pid>

Address           Kbytes     RSS   Dirty Mode   Mapping

....

00007f9caf3e7000       4       4       4 r----  ld-2.17.so
00007f9caf3e8000       8       8       8 rw---  ld-2.17.so
00007fffe8931000     132      12      12 rw---    [ stack ]
00007fffe89fe000       8       8       0 r-x--    [ anon ]
ffffffffff600000       4       0       0 r-x--    [ anon ]
----------------  ------  ------  ------
total kB          688584   82564    9592

然后使用 Awk 提取该值。

$ pmap -x <pid> | awk '/total/ { print $4 "K" }'

这些pmap值的单位是千字节。如果我们想以兆字节为单位,我们可以这样做。

$ pmap -x <pid> | awk '/total/ { print $4 / 1024 "M" }'

解决方案 12:

为什么要用各种 shell 脚本来回答这些复杂的问题?使用 htop,它会自动更改大小,您可以选择要显示的信息,并且它在终端中运行,因此不需要桌面。示例:htop -d8

解决方案 13:

使用

  • ps u pidof $TASKS_LISTps u -C $TASK

  • ps xu --sort %mem

  • ps h-o pmem-C $TASK

例子:

ps-of()
{
 ps u `pidof "$@"`
}

$ ps-of firefox
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
const    18464  5.9  9.4 1190224 372496 ?      Sl   11:28   0:33 /usr/lib/firefox/firefox

$ alias ps-mem="ps xu --sort %mem | sed -e :a -e '1p;$q;N;6,$D;ba'"
$ ps-mem 
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
const     3656  0.0  0.4 565728 18648 ?        Sl   Nov21   0:56 /usr/bin/python /usr/lib/ubuntuone-client/ubuntuone-syncdaemon
const    11361  0.3  0.5 1054156 20372 ?       Sl   Nov25  43:50 /usr/bin/python /usr/bin/ubuntuone-control-panel-qt
const     3402  0.0  0.5 1415848 23328 ?       Sl   Nov21   1:16 nautilus -n
const     3577  2.3  2.0 1534020 79844 ?       Sl   Nov21 410:02 konsole
const    18464  6.6 12.7 1317832 501580 ?      Sl   11:28   1:34 /usr/lib/firefox/firefox

$ ps h -o pmem -C firefox
12.7
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用