定时取指定进程内存脚本

简介: mem.zip 用于分析指定进程是否存在内存泄漏, 使用ps等命令统计开销相对较大,直接读取/proc文件系统则高效许多。 格式(利用了awk给外部变量赋值,请参考博文http://blog.
img_e25d4fb2f8de1caf41a735ec53088516.pngmem.zip
用于分析指定进程是否存在内存泄漏,
使用ps等命令统计开销相对较大,直接读取/proc文件系统则高效许多。

格式(利用了awk给外部变量赋值,请参考博文http://blog.chinaunix.net/uid-20682147-id-3024853.html):
eval $(cat /proc/[pid]/statm | awk '{ printf("virt=%d,res=%d", $1,$2); }')
示例(进程ID为3739):
eval $(cat /proc/3739/statm | awk '{ printf("virt=%d\nres=%d", $1,$2); }');echo $virt;echo $res;

通过以上得到的virt和res,分别为虚拟内存和物理内存的页数,再乘以页大小4096即为字节数。

一分钟统计一次脚本(统计间隔为60秒,带一个参数,即被统计进程的进程ID):

  1. #!/bin/sh
  2. # writed by yijian on 2016/7/11
  3. # filename mem.sh
  4. if test $# -lt 1; then
  5.     echo "uage: mem.sh pid interval(seconds)"
  6.     exit 1
  7. fi
  8. if test $# -eq 2; then
  9.     interval=$2
  10. else
  11.     interval=60
  12. fi
  13. if test $interval -lt 2; then
  14.     interval=2
  15. fi
  16. pid=$1
  17. file=$pid.mem
  18. rm -f $file
  19. while true
  20. do
  21.     filesize=$(ls -l /tmp/$pid.mem 2>/dev/null|cut -d' ' -f5)
  22.     if test ! -z $filesize; then
  23.         if test $filesize -gt 1048576; then
  24.             mv /tmp/$file /tmp/$file.old
  25.         fi
  26.     fi
  27.     virt=0
  28.     res=0
  29.     eval $(cat /proc/$pid/statm 2>/dev/null| awk '{ printf("virt=%d\nres=%d", $1*4096/1024/1024,$2*4096/1024/1024); }')
  30.     if test $virt -eq 0 -a $res -eq 0; then
  31.         break
  32.     fi
  33.     echo "[`date '+%Y-%m-%d %H:%M:%S'`] ${virt}m ${res}m" | tee -a /tmp/$file
  34.     sleep $interval
  35. done

cat /proc/[pid]/statm
示例(进程ID为3739):
# cat /proc/3739/statm
6521 5646 687 668 0 5035 0

各字段说明(单位均为页数,一页大小为4K):
6521 相当于top命令中的VIRT或ps命令中的VSZ,也就是虚拟内存页数
5646 相当于top命令中的RES或ps命令中的RSS,也就是物理内存页数
687 相当于top命令中的SHR,也就是共享内存页数
668 可执行虚拟内存页数
0 映射到进程空间库的页数,从Linux 2.6开始不再使用
5035 数据段和用户态的栈的大小
0 脏页数量,从Linux 2.6开始不再使用

相关的(读取statm简单些):
# cat /proc/3739/status
Name:   wx_msg_sender
State:  S (sleeping)
SleepAVG:       98%
Tgid:   3739
Pid:    3739
PPid:   1
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 32
Groups: 0 
VmPeak:    27064 kB
VmSize:    26916 kB
VmLck:         0 kB
VmHWM:     23496 kB
VmRSS:     23428 kB
VmData:    20888 kB
VmStk:        84 kB
VmExe:      2672 kB
VmLib:      2872 kB
VmPTE:        64 kB
Threads:        1
SigQ:   1/16376
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 000000007ffb34ff
SigCgt: 0000000180000000
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff
Cpus_allowed:   00000000,00000000,00000000,0000000f
Mems_allowed:   1


相关文章
|
11月前
|
消息中间件 存储 网络协议
从零开始掌握进程间通信:管道、信号、消息队列、共享内存大揭秘
本文详细介绍了进程间通信(IPC)的六种主要方式:管道、信号、消息队列、共享内存、信号量和套接字。每种方式都有其特点和适用场景,如管道适用于父子进程间的通信,消息队列能传递结构化数据,共享内存提供高速数据交换,信号量用于同步控制,套接字支持跨网络通信。通过对比和分析,帮助读者理解并选择合适的IPC机制,以提高系统性能和可靠性。
1413 14
麒麟系统mate-indicators进程占用内存过高问题解决
【10月更文挑战第7天】麒麟系统mate-indicators进程占用内存过高问题解决
1393 2
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
1844 58
|
11月前
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
815 20
|
12月前
|
运维 监控 Ubuntu
【运维】如何在Ubuntu中设置一个内存守护进程来确保内存不会溢出
通过设置内存守护进程,可以有效监控和管理系统内存使用情况,防止内存溢出带来的系统崩溃和服务中断。本文介绍了如何在Ubuntu中编写和配置内存守护脚本,并将其设置为systemd服务。通过这种方式,可以在内存使用超过设定阈值时自动采取措施,确保系统稳定运行。
433 4
|
C语言 开发者 内存技术
探索操作系统核心:从进程管理到内存分配
本文将深入探讨操作系统的两大核心功能——进程管理和内存分配。通过直观的代码示例,我们将了解如何在操作系统中实现这些基本功能,以及它们如何影响系统性能和稳定性。文章旨在为读者提供一个清晰的操作系统内部工作机制视角,同时强调理解和掌握这些概念对于任何软件开发人员的重要性。
|
Linux 调度 C语言
深入理解操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅,从进程管理的基本概念出发,逐步探索到内存管理的高级技巧。我们将通过实际代码示例,揭示操作系统如何高效地调度和优化资源,确保系统稳定运行。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇了解操作系统深层工作原理的大门。
160 4
|
算法 调度 开发者
深入理解操作系统:从进程管理到内存分配
本文旨在为读者提供一个深入浅出的操作系统知识之旅,从进程管理的基础概念出发,探索内存分配的策略与技巧。我们将通过实际代码示例,揭示操作系统背后的逻辑与奥秘,帮助读者构建起对操作系统工作原理的直观理解。文章不仅涵盖理论知识,还提供实践操作的指导,使读者能够将抽象的概念转化为具体的技能。无论你是初学者还是有一定基础的开发者,都能在这篇文章中找到有价值的信息和启发。
|
算法 调度 C++
深入理解操作系统:从进程管理到内存分配
【10月更文挑战第42天】本文将带你进入操作系统的神秘世界,探索其核心概念和关键技术。我们将从进程管理开始,了解操作系统如何协调和管理多个程序的运行;然后,我们将深入研究内存分配,看看操作系统如何有效地分配和管理计算机的内存资源。通过这篇文章,你将获得对操作系统工作原理的深入理解,并学会如何编写高效的代码来利用这些原理。
|
缓存 算法 调度
深入浅出操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅。我们将从进程管理的基本概念出发,逐步深入到内存管理的复杂世界,最终探索如何通过实践技巧来优化系统性能。文章将结合理论与实践,通过代码示例,帮助读者更好地理解操作系统的核心机制及其在日常技术工作中的重要性。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往操作系统深层次理解的大门。