OpenVZ環境のApacheとMySQLでメモリ節約してやりくりする

先日の続きでメモリが少ないVPS環境でなんとかやりくりする方法を考えました。
OpenVZのメモリ管理 - Guyon Diary

各種リソース表示コマンドでメモリ消費が大きいものがApacheMySQLであることはわかりました。

MySQL

まずはMySQLのメモリー消費を抑える為にとった方法は、機能を制限する事。

今回ネックになっているのが初期使用メモリなので、DBのCRUD処理やMySQL自体の機能を使う以前の問題です。

一番効果的な方法がこれです。

  • InnoDB機能をOFFにする
    • my.conf
      • skip-innodbを[mysqld]に書く

【ON時】

Mem: 262144k total, 256292k used, 5852k free, 0k buffers
Swap: 0k total, 0k used, 0k free, 0k cached

【OFF時】

Mem: 262144k total, 173092k used, 89052k free, 0k buffers
Swap: 0k total, 0k used, 0k free, 0k cached

デーモンを起動しているだけの状態で80Mの差があります。
128Mしかない環境での80Mは「天と地くらい」の違いを感じられると思います。

MySQLのDBストレージエンジンはMyISAMを使う事になり、トランザクション関係とか行ロックなどの機能差がでてきますが、ネガティブな事ばかりではないと思います。詳細はid:naoyaさんのMyISAM vs InnoDB - naoyaのはてなダイアリーがわかりやすいと思いました。


限定的なリソース環境なのでMyISAMが有利に働いてくれるとうれしい。


今回の環境構築の最終目的はVPSRailsアプリ運用なので、Railsとの絡みも確認と。。。

  • テストを使わないモードでトランザクションの設定をする必要がある
    • test/test_helper.rb
      • self.use_transactional_fixtures = false
      • ロールバックをしないようになる。
  • Migration
    • InnoDBが使用できれば、明示的にオプションでMyISAMを指定する必要がある
    • 今回みたいにInnoDBをOFFにしてあれば、Migrationでは気にする必要はない?
  • ActiveRecord


メモリ関係に話を戻して、他にできる事といったらバッファサイズを変更したり??
とりあえず、これで様子を見る。

Apache2編

次はApacheです。

たぶん、Apacheの方がメモリを食っています。

Apacheも設定次第でメモリを減らせると思います。
モジュール削除などで機能を減らすより、パフォーマンスを落とす方法を選びました。

【PC関係のメモ】Hajime Miyauchiさん
http://www.mylab.jp/diary/20031205.html

を参考にさせて頂きました。

  • apache2.conf
    • StartServers
      • 減らす
    • MaxSpareServers・MinSpareServers
      • これも減らす
    • MaxClients
      • いやいやもっと極端に減らす
    • MaxSpareThreads・MinSpareThreads
      • 減らすってば
    • ThreadsPerChild

これでかなり初期メモリ使用量を減らす事に成功し、MySQLとApache2を同時に起動する事ができました。

ただしパフォーマンスには疑問があるので、様子を見ながら調整していく事にします。

【TODO】
あまりにもパフォーマンスや運用に無理があるなら、lighttpdやsqlite3も検討する。