概要
PHPで書いた重めのプログラム(何万行かわからないレコードをDBから取ってくる)を走らせたところ、10GB使わないうちにout of memoryで落ちてしまった
前提
- 搭載されているメモリは12GBで基本的に10GB程度はフリー
- out of memory で落ちた時にPHPに割り当てられていたメモリは2.5GB
- php.iniのmemory_limitは-1なので無制限
調査
無制限なのにout of memoryしてるのでPHP側ではなくOS側で何かしてるんだろうという考えに
そういやOSが32bitだった気がしたので調べてみたら32bitだった
そもそも32bitだったら12GB認識しないのでは?と思ったけどPAEのおかげで32bitより大きい番地でも割り当てられるようになってるらしい
PAEよくわかってなかったので調べた
物理アドレスは拡張されるので最大12GBは利用できるが、OS側が割り当てる仮想アドレス空間は結局32bitなので4GB程度しか利用できず、更にカーネル空間としてOSに1GB割り当てられるので結局メモリが全てフリーでも1プロセスあたりでは3GBが上限になる
結論
PHPのせいではなくOSが32bitだったせいだった