2011-11-12 66 views
1

我用C++编写了一个小型geoip查找linux守护进程,我得到两个不同的结果,我想知道为什么。为什么同一台服务器的两个版本的行为不同?

这是源代码:https://github.com/homer6/geoipd 我检查了valgrind的内存泄漏,并没有任何。

我有两台Web服务器,它们都在Amazon EC2上运行相同的Ubuntu映像,并且都在负载均衡器后面,确保它们每个都获得大致相同的流量。我在两台服务器上都安装了守护进程,现在我已经让它们在生产环境中运行了几天。

一切都按预期工作,但“ps aux”的输出在两个实例中略有不同。

服务器1:

USER  PID %CPU %MEM VSZ RSS TTY  STAT START TIME 
1004  28889 0.0 6.7 640288 517692 ?  Ss Nov09 0:03 

服务器2:

USER  PID %CPU %MEM VSZ RSS TTY  STAT START TIME 
1004  16587 0.0 6.7 574752 517688 ?  Ss Nov09 0:02 

我的问题是两个分开:

  1. 为什么会出现虚拟内存使用这么大的差别?
  2. 为什么常驻记忆体使用有差异?

在此先感谢...

更新: 记得检查VM大小当我第一次启动的进程。他们都在574752(或略低于575 MB),他们都有相同的价值。

+0

你的'ulimit'或'/ etc/security/limits.conf'在两个系统之间是不同的吗? – chown

+0

在Ubuntu上,没有这样的目录。由于它们是相同图像的克隆,所以它们应该是相同的。我运行了“cat/proc/sys/fs/file-max”,它们都具有相同的值。这是一回事吗? – Homer6

+0

ulimit – Homer6

回答

2

从这2条额外线服务器1的地图:。

7f003ed31000-7f003ed32000 ---p 00000000 00:00 0 
7f003ed32000-7f003f532000 rw-p 00000000 00:00 0 

好像服务器1已分配(但尚未初始化)内存服务器2还没有的一些对象,这并不一定是坏的,每个内核都是最有可能的正确地处理内存,只是不同而已。

您可以运行size geoip_server.o以确保该BSS(未初始化的静态数据)是2个守护进程的每个系统上的相同:

[ 18:10 [email protected]/]# size geoip_server.o 
    text data bss   dec   hex  filename 
    77727 1088772 200003752 201170251 bfd9d4b geoip_server.o 

这些数字是由我没有cmake 2.8。2所以我无法编译代码

此外,您可以cat /proc/meminfo每个系统上看到每个内核是如何管理内存的细节:

[ 18:10 [email protected]/]# cat /proc/meminfo 
MemTotal:   443880 kB 
MemFree:   7792 kB 
Buffers:    788 kB 
Cached:   24468 kB 
SwapCached:  87512 kB 
Active:   189460 kB 
Inactive:   193316 kB 
Active(anon):  178604 kB 
Inactive(anon): 178956 kB 
Active(file):  10856 kB 
Inactive(file): 14360 kB 
Unevictable:   0 kB 
Mlocked:    0 kB 
HighTotal:    0 kB 
HighFree:    0 kB 
LowTotal:   443880 kB 
LowFree:   7792 kB 
SwapTotal:  4816892 kB 
SwapFree:  3856464 kB 
Dirty:    12 kB 
Writeback:    0 kB 
AnonPages:  305332 kB 
Mapped:    7812 kB 
Shmem:    60 kB 
Slab:    17628 kB 
SReclaimable:  8712 kB 
SUnreclaim:   8916 kB 
KernelStack:  1320 kB 
PageTables:   4592 kB 
NFS_Unstable:   0 kB 
Bounce:    0 kB 
WritebackTmp:   0 kB 
CommitLimit:  5038832 kB 
Committed_AS: 1910872 kB 
VmallocTotal:  570424 kB 
VmallocUsed:  32424 kB 
VmallocChunk:  524124 kB 
HardwareCorrupted:  0 kB 
HugePages_Total:  0 
HugePages_Free:  0 
HugePages_Rsvd:  0 
HugePages_Surp:  0 
Hugepagesize:  4096 kB 
DirectMap4k:  19392 kB 
DirectMap4M:  438272 kB 

This research paper from the University of Alberta on Understanding Memory是一个非常良好的阅读和可能帮助解释为什么在2个不同系统上运行的同一进程的VSZ差异可能是正常的。


一些参考和资源:

procfs wiki page
Runtime Memory Measurement
​​
https://unix.stackexchange.com/questions/6301/how-do-i-read-from-proc-pid-mem-under-linux

man proc

/proc/[pid]/maps
包含当前映射的内存区域 及其访问权限的文件。其格式为:

address   perms offset dev inode pathname 
08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm 
08056000-08058000 rw-p 0000d000 03:0c 64593 /usr/sbin/gpm 
08058000-0805b000 rwxp 00000000 00:00 0 
40000000-40013000 r-xp 00000000 03:0c 4165 /lib/ld-2.2.4.so 
40013000-40015000 rw-p 00012000 03:0c 4165 /lib/ld-2.2.4.so 
4001f000-40135000 r-xp 00000000 03:0c 45494 /lib/libc-2.2.4.so 
40135000-4013e000 rw-p 00115000 03:0c 45494 /lib/libc-2.2.4.so 
4013e000-40142000 rw-p 00000000 00:00 0 
bffff000-c0000000 rwxp 00000000 00:00 0 

其中“地址”是的,因为它占据了进程的地址空间, “烫发”是一组权限, “偏移”是偏移量成文件/不管,“dev”是 设备(主要:次要),“inode”是该设备上的 inode。 0表示没有inode与 内存区域关联,就像BSS(未初始化的数据)一样。

+0

+1为真棒信息和你的时间!非常非常感谢你! – Homer6

3

VSZ的大小没有意义,你可以忽略它。这可能是由许多奇怪的事情造成的。 (如果您想尝试追查,在两台机器上比较执行cat/proc输出/ PID /图

至于为什么RSS是几个字节不同,它是如此之小我不会“吨担心它可能只是由于叠加随机

+0

+1有用的贡献。谢谢。 – Homer6

相关问题