2011-11-12 67 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

相關問題