监控CPU是很容易的事情,但要监控Rails进程的内存泄漏,却非常困难,原因在于production.log里面并没有记录进程的内存变化状况,甚 至你找不到任何ruby API可以用来直接查询到进程使用的物理内存。实际上,要获取一个进程的物理内存是一个平台相关的操作,每个操作系统都会自己特定的API,并不通用,即 使用C语言来编码,也不是一件容易的事情。
不过对于Linux操作系统来说,我们有一个捷径可以获取进程的内存状况。Linux的/proc文件系统是内核的映象,/proc/进程pid/status 文件记录了这个进程的状态信息,例如:
- Name: java
- State: S (sleeping)
- SleepAVG: 135%
- Tgid: 26645
- Pid: 26645
- PPid: 1
- TracerPid: 0
- Uid: 1002 1002 1002 1002
- Gid: 100 100 100 100
- FDSize: 64
- Groups: 14 16 17 33 100
- VmSize: 245680 kB
- VmLck: 0 kB
- VmRSS: 209104 kB
- VmData: 205116 kB
- VmStk: 824 kB
- VmExe: 764 kB
- VmLib: 4220 kB
- Threads: 1
- SigPnd: 0000000000000000
- ShdPnd: 0000000000000000
- SigBlk: 0000000000000000
- SigIgn: 0000000000001000
- SigCgt: 0000000002006e47
- CapInh: 0000000000000000
- CapPrm: 0000000000000000
- CapEff: 0000000000000000
Name: dispatch.fcgi
State: S (sleeping)
SleepAVG: 135%
Tgid: 26645
Pid: 26645
PPid: 1
TracerPid: 0
Uid: 1002 1002 1002 1002
Gid: 100 100 100 100
FDSize: 64
Groups: 14 16 17 33 100
VmSize: 245680 kB
VmLck: 0 kB
VmRSS: 209104 kB
VmData: 205116 kB
VmStk: 824 kB
VmExe: 764 kB
VmLib: 4220 kB
Threads: 1
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000001000
SigCgt: 0000000002006e47
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
注意第14行VmRSS,记录了该进程使用的常驻物理内存(Residence),这个就是该进程实际占用的物理内存了。因此只要我们读取该文件第14行,就可以得到内存信息。