74544


ローカルの MAC 上でデバッグした python スクリプトを  
AWS EC2 上で動かすと以下のような messages がでてメモリがあふれてしまいます

[code]

    Mar  8 07:11:29 xxx kernel: Out of memory: Kill process 4405 (python) score 382 or sacrifice child
    Mar  8 07:11:29 xxx kernel: Killed process 4405 (python) total-vm:1625200kB, anon-rss:372468kB, file-rss:0kB, shmem-rss:0kB
    Mar  8 07:11:29 xxx kernel: oom_reaper: reaped process 4405 (python), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
    
[/code]

そこで以下のようなメモリプロファイラをはさんでみたのですが

[code]

    from memory_profiler import memory_usage
    
    if __name__ == '__main__':
      try:
        memory_out = memory_usage((main, (sys.argv,)))
    
        print('peak memory used: %.3f MB' % max(memory_out))
      except Exception as e:
        logger.error(e)
        sys.exit(-1)
    
[/code]

MAC 上での実行結果は

[code]

    peak memory used: 117.137 MB
    
[/code]

となりました

EC2で実行前の top をみると

[code]

    top - 07:15:20 up 3 days, 29 min,  0 users,  load average: 0.33, 0.94, 0.55
    Tasks: 119 total,   2 running,  75 sleeping,   0 stopped,   0 zombie
    %Cpu(s): 49.1 us,  5.8 sy,  0.0 ni, 44.8 id,  0.2 wa,  0.0 hi,  0.0 si,  0.2 st
    KiB Mem :   980016 total,   223448 free,   594760 used,   161808 buff/cache
    KiB Swap:        0 total,        0 free,        0 used.   251552 avail Mem
    
[/code]

となっていて 223MB ほどあいています  
何度実行してもメモリエラーが再現して  
その間に他のプログラムが起動してメモリを使ったということもありません

どちらも同じ S3 上のデータを参照して  
botocore の認証部分が MAC では credentials で  
EC2 は インスタンスロールを使ってる違いはあるのですが扱うデータ量は全く同じです  
OS のメモリマネージメントの違いでこれほど差が出るものなんでしょうか

EC2上ではプログラムが完走しないので途中どうなってるかもわからないのですが  
原因の調べ方を教えていただけるとありがたいです

python はどちらも 3.7.5  
使用するライブラリのバージョンも全く同じでOSとメモリは  
EC2 が amzn2.x86_64 t3.micro 1GB  
ローカルが Mac Catalina 16GB  
です

* * *
[code]

    > sysctl vm.panic_on_oom
    vm.panic_on_oom = 0
    
[/code]

でした


CC BY-SA 4.0
2021-03-08T07:52:04.010
74516
2021-03-09T08:02:23.477
2021-03-09T07:32:41.037
question
python linux macos
MAC 上で 100MB のメモリで動く python プログラムが 200MB 以上空いてる Linux 上でメモリエラーになる


アクティビティモニタでみたMAC上のpython動作中の仮想メモリは４GB以上要求してました

> Killed process 4405 (python) total-vm:1625200kB

で Linux 上では 1.6GB 要求したあたりで落ちてるので  
落ちるか落ちないかは指摘していただいた通り swap の有無ということみたいですね

そうなるとメモリプロファイラが  
peak memory used: 117.137 MB  
とだしてくるのが何のメモリなのかが不明なのと  
小さなプログラムでメモリを何Gも要求してくるのがふに落ちないですが

とりあえず質問の答えとしては環境の差ではなかったということでしめます


CC BY-SA 4.0
2021-03-09T08:02:23.477
74544
2021-03-09T08:02:23.477
74516
answer