同じサーバーの2つのバージョンが異なる動作をするのはなぜですか?

私はC ++で小さなジオープルックアップのLinuxデーモンを書いていますが、私は2つの異なる結果を得ています。なぜそれなら不思議です。

これはソースコードです: https://github.com/homer6/geoipd 私はvalgrindでメモリーリークをチェックしていて、何もありませんでした。

Amazon EC2上で同じUbuntuイメージを実行しているロードバランサの背後にある2つのWebサーバーがあり、ロードバランサの背後には両方とも同じ量のトラフィックを確保しています。私は両方のサーバーにデーモンをインストールしました。私は数日間、実稼動させました。

すべてが期待どおりに動作していますが、 "ps aux"の出力は2つのインスタンスでわずかに異なります。

サーバー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

私の質問は2つに分かれています:

  1. 仮想メモリの使用に大きな違いがあるのはなぜですか?
  2. 常駐メモリの使用に違いがある理由は?

前もって感謝します...

更新: 最初にプロセスを起動したときにVMのサイズを確認したことを覚えています。彼らは574752(またはわずかに575 MB未満)で、両方とも同じ価値を持っていました。

1
完了した仕事のランダムな違いかもしれません...
追加された 著者 vonbrand,
2つのシステム間で ulimit/etc/security/limits.conf は異なっていますか?
追加された 著者 chown,
ああ、申し訳ありませんが、ulimitはコマンドです、limits.confはファイルです。各システムで ulimit -a を実行して、リソースの制限を確認します。クローズ/ダウン投票は、これがsuperuser.com SEサイトに属していると思う人からのものかもしれません。彼らの意見にかかわらず、私はこれが素晴らしい質問だと思う。
追加された 著者 chown,
また、2つのプロセスはまったく同じ時間実行されましたか?そのうちの1人がより多くのメモリを消費するタスクを実行していたときにチェックしていましたか?
追加された 著者 chown,
/proc/28889/status/proc/16587/status ファイルをダブルチェックしても同じ不一致が報告されますか?
追加された 著者 chown,
また、/proc/[pid]/maps をチェックして、2つのプロセスのメモリマッピングにどのような違いがあるかを確認してください。サーバー1のプロセスには、何が起こっているのかを示すマッピングが必要です。
追加された 著者 chown,
Ubuntuには、そのようなディレクトリはありません。それらは同じイメージのクローンであるため、同一でなければなりません。私は "cat/proc/sys/fs/file-max"を走らせましたが、どちらも同じ値でした。それは同じことですか?
追加された 著者 Homer6,
そのファイルにulimitのエントリがありません
追加された 著者 Homer6,
はい、彼らは同時に、同じ単純な作業単位を開始していました。さらに、私はこれを数日間確認してきました。今日私はこの読書を得る前にそれは数日間575MBのレベルにあった。
追加された 著者 Homer6,
追加された 著者 Homer6,
追加された 著者 Homer6,

2 答え

VSZのサイズは無意味ですが、無視することができます。いくつかの奇妙なものによって引き起こされる可能性があります。 (それを追跡しようとする場合は、両方のマシンの cat/proc/ pid /maps の出力を比較してください。

なぜRSSが数バイト違うのかについては、それほど小さいので、私はそれについて心配しません。それはちょうどスタックのランダム化によるものかもしれません。

3
追加された
有用な貢献のために+1。ありがとうございました。
追加された 著者 Homer6,

サーバー1のマップの次の2行から、

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

サーバ1がまだサーバ2がまだ持っていないオブジェクトのためのメモリを(まだ初期化していないが)割り振っているようだ。これは必ずしも悪いことではありません。各カーネルは、メモリを適切に処理する可能性が高く、まったく異なっています。

bss (初期化されていない静的データ)が各システムの2つのデーモンで同じであることを確認するには、 size geoip_server.o

[ 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 is a very good read and may help explain the why a difference in VSZ for the same process running on 2 different systems can be normal.


いくつかの参考文献とリソース:

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

man proc:

/proc/[pid]/maps
  現在マップされているメモリ領域を含むファイル   およびそれらのアクセス許可。形式は次のとおりです。

  address permsオフセットdevのinodeのパス名
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
 
     

ここで "アドレス"は、それが占有するプロセス内のアドレス空間であり、   " perms "は一連のアクセス許可です。   "オフセット"はファイルへのオフセット/何でも、 " dev "は   デバイス(メジャー:マイナー)、 " inode "は   そのデバイス上のiノード。 0は、そのノードに関連付けられているiノードがないことを示します。   BSS(初期化されていないデータ)の場合と同じように、メモリ領域に格納されます。

2
追加された
素晴らしい情報とあなたの時間+1!本当にありがとう!
追加された 著者 Homer6,