当方Red Hat Linux 7.3を常用しています。Linux特性として物理メモリの使用推移てのがあります。Linuxはfree+buffers+cachedがフリーな領域となる部分です。freeコマンドで見た場合、「-/+ buffers/cache:」のusedにあたる数値が、実際にシステムを動作させるための領域です。
なのでメモリの見かたを誤るとメモリリークか!?と思われるやもしれません。
物理メモリはハードウェアの再起動を行わない限り開放されません。
足りなくなったらシステムがメモリを開放するような感じです。
その開放するタイミングですが非常にプアで、MAXのメモリ容量に比例せずギリギリ(Memのfreeが一桁切ったら)のところで開放されます。
一般的なWebサーバーではこのような現象を確認することは難しいかもしれませんが、ApacheとTomcatとOracleを1マシンに納めているようなカッツカツの環境では、2GBのメモリを積んでも、滑り台のようにフリーが底ついてしまい、バッファが動き回ります。
そんなところに集中アクセスを行うとシステムが混乱し、ほかのプロセスに手が回らなくなりタイムアウトを引き起こす可能性が高くなります。
ですが、プロセスの増加で重くなったりするのはメモリが原因ではありません。
1.メモリが底をついて、メモリの開放を行うバッファの処理
2.アプリケーションでリクエストに対応する際の処理
これによりCPUが処理しきれなくなり、プロセスが大量に増えて重くなる。
MAXのプロセスに至るとhttpdがタイムアウトをクライアントに返す。
しかしプロセスは重い中動いている、といった感じですかな。
回線速度がとてつもなく速くなったご時勢、いくらでも負荷をかけるような(F5アタックとか)行為に対して、TCPでも対策してない限りまともにアタックを食らうことになります。
でもアタックだけではアプリケーションは落ちることは早々ないので、Apacheなら1プロセスに対し20分間レスポンスがなければプロセスを開放するからです。
ちなみにWindowsサーバへのアタックに関して、Linuxサーバよりハングする確立は高いです。
プアな環境だと一発で親プロセスを落とされたりします。
Apache+Tomcatでサーバを構築しており、アクセスが集中するようなサーバの運営を行われている際に起こるPage Not Foundや503エラーでサービスが停止する不具合を回避する方法は以下。
1.スペックを上げる(CPUは必須。処理ができればプロセスは早々増えることはない為)
2.ロードバランサー等の負荷分散で対応(金があればね)
3.パフォーマンスチューニング(当然限界はありますのであまり当てにせぬよう大人しく1.か2.で。。。)
Webアプリケーションを開発するに至りぶち当たる問題でもあるのでしょうが、これらは2の次に引き起こる問題の対応策です。
アプリケーションサーバを運営する際は負荷テストを必ず行ってくださいねヾ(゚ω゚)ノ゛