[Linuxメモ]Osukini Server LTのメモリ節約
その後のOsukini Server LTですが、前より幾分マシなもののやっぱり固まる時は固まるので、更に対処してみた。
最初にやったこと。
さくらのシャチョさんのブログをみて不必要なプロセスを全て停止した。
CentOSをサーバーとして活用するための基本的な設定 – さくらインターネット創業日記
また、コンソールの数も1個にしたが、CentOS5の方法は使えないので
/etc/sysconfig/initを以下のように編集してサーバーを再起動して対応した。
ttyのところはtty1でいいが、増やす時の書き方がわからなくなると嫌なので[1-1]と変更したが、よく考えてみれば、元の行をコピーしてコメントアウトしておけばよかった。
変更前
ACTIVE_CONSOLES=/dev/tty[1-6]
変更後
ACTIVE_CONSOLES=/dev/tty[1-1]
CentOS6 仮想コンソール「mingetty」の数を調整するの巻 – TrippyBoyの愉快な日々
Fedora 14:「mingetty」仮想コンソール数を変更する
これだけやって、数日様子をみた。まあ、前よりは良かった。
が、今日の夜中にブログを更新したらまた固まった。写真多めだったからだろうか?
/var/log/messagesを眺めてみると、kernelがOut of memoryしていた。
Nov 14 03:49:26 rad-xen-vwebxx kernel: Out of memory: Kill process 12854 (httpd) score 11 or sacrifice child
Nov 14 03:49:26 rad-xen-vwebxx kernel: Killed process 12854, UID 48, (httpd) total-vm:46320kB, anon-rss:1940kB, file-rss:24kB
Nov 14 03:49:26 rad-xen-vwebxx kernel: mt-kiss-mint.cg invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0
Nov 14 03:49:26 rad-xen-vwebxx kernel: mt-kiss-mint.cg cpuset=/ mems_allowed=0
Nov 14 03:49:26 rad-xen-vwebxx kernel: Pid: 26428, comm: mt-kiss-mint.cg Not tainted 2.6.32-279.14.1.el6.i686 #1
やっぱりメモリーが足りないんだなーということを痛感する。
AMA-TOOLBOXのサーバーと違って、こっちはMySQLとWebminが入っているし、ついでに入れてしまったEC-CUBEまで入っている。MTでメール通知が出来るようにPostfixまで動かしている。メモリーが足りなくなるのもしかたがない気もするが、本格的にメモリーの節約をしようと考える。10年前の感覚だと512MBメモリーがあればそれなりに動きそうな気もするが、OSや各アプリケーションも時代とともにメモリー食いになったということか。
とりあえず、ps auxwでメモリー喰いなプロセスを探してみる。下記は抜粋であるが、apache以外でメモリーを食っているのはやっぱりmysql、とりあえず止める訳にはいかないので、他を見るとvsftpdはそうでもないので放置、postfixもそれほどでもない。Webminのプロセスであるminiserv.plがなにげにメモリーを食っている。メモリー上に13Mほど載っかっている。めったに使わないので止めることにする。使う時だけ立ち上げればいいだろう。
mysql 1051 0.0 2.9 135852 15228 ? Sl 04:07 0:00 /usr/libexec/mysqld –basedir=/usr –datadir=/var/lib/mysql –user=mysql –log-error=/v
root 1176 0.0 0.4 12504 2504 ? Ss 04:07 0:00 /usr/libexec/postfix/master
root 1288 0.0 2.5 19604 13008 ? Ss 04:08 0:00 /usr/bin/perl /usr/libexec/webmin/miniserv.pl /etc/webmin/miniserv.conf
root 920 0.0 0.1 6804 636 ? Ss 04:07 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
下記のようにしてWebminを停止した。
#service webmin stop
#chkconfig webmin off
EC-CUBEを停止した。SaaSesのサポートページを見ると以下の方法でアンインストールできる。とりあえず、2の手順を参考にしてeccube.confの中身をコメントアウトして動かなくした。が、これはメモリーの節約には関係ないと思われる。
1. /opt/eccube, /opt/eccube-2.4.3 を削除
2./etc/httpd/conf.d/eccube.conf を削除
3. mysql で以下の操作を行う
・データベース「eccube_db」の削除
・ユーザ「eccube_db_user」の削除
4.httpd を再起動する
SaaSesサポートセンター » EC-Cubeのアンインストール
これだけやってみたがメモリーほとんど増えない。常にusedが400MB後半になっていて、ほとんどメモリーに空きがない。
やはり最大の敵はapacheだろうということで、apacheの設定を弄ることにする。とりあえずどれくらいメモリー食ってるのか調べてみる。かなりいってますね。プロセス数などを制限しないとダメっぽい。
# ps aux|grep httpd
root 1719 0.0 1.0 31712 5292 ? Ss 04:40 0:00 /usr/sbin/httpd
apache 1724 0.1 3.7 45816 19260 ? S 04:40 0:00 /usr/sbin/httpd
apache 1725 0.1 3.7 45832 19284 ? S 04:40 0:00 /usr/sbin/httpd
apache 1726 0.9 3.9 45816 20068 ? S 04:40 0:06 /usr/sbin/httpd
apache 1727 0.9 3.9 46848 19924 ? S 04:40 0:05 /usr/sbin/httpd
apache 1728 0.2 3.8 45816 19812 ? S 04:40 0:01 /usr/sbin/httpd
apache 1730 0.3 3.8 45816 19852 ? S 04:40 0:01 /usr/sbin/httpd
apache 1744 0.2 3.8 45816 19608 ? S 04:41 0:01 /usr/sbin/httpd
apache 1753 0.7 3.9 45816 20104 ? S 04:44 0:03 /usr/sbin/httpd
apache 1754 0.3 3.9 45844 20108 ? S 04:44 0:01 /usr/sbin/httpd
apache 1755 0.4 3.0 41740 15708 ? S 04:44 0:01 /usr/sbin/httpd
apache 1757 0.4 3.1 41720 15896 ? S 04:44 0:01 /usr/sbin/httpd
apache 1758 0.0 0.7 31876 3772 ? S 04:44 0:00 /usr/sbin/httpd
apache 1759 0.3 2.9 41740 14872 ? S 04:44 0:01 /usr/sbin/httpd
apache 1760 0.4 3.1 42764 16012 ? S 04:44 0:02 /usr/sbin/httpd
apache 1763 0.0 0.7 31876 3772 ? S 04:44 0:00 /usr/sbin/httpd
apache 1764 0.1 2.8 39708 14512 ? S 04:44 0:00 /usr/sbin/httpd
apache 1772 0.4 3.0 41736 15724 ? S 04:44 0:01 /usr/sbin/httpd
apache 1773 0.2 3.1 41740 15820 ? S 04:44 0:01 /usr/sbin/httpd
apache 1774 0.2 3.0 41748 15724 ? S 04:44 0:01 /usr/sbin/httpd
apache 1775 0.1 2.8 39716 14448 ? S 04:44 0:00 /usr/sbin/httpd
apacheのカスタマイズなんて久しぶりなので、色々探してたどり着いたブログ達を参考に色々やってみた。
/etc/httpd/conf/httpd.confを編集して、使わないロードモジュールを無効にした。最初から無効になっているもの以外で下記が新たに無効にした部分。
#LoadModule auth_digest_module modules/mod_auth_digest.so
#LoadModule authn_anon_module modules/mod_authn_anon.so
#LoadModule authn_dbm_module modules/mod_authn_dbm.so
#LoadModule usertrack_module modules/mod_usertrack.so
#LoadModule dav_module modules/mod_dav.so
#LoadModule info_module modules/mod_info.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule speling_module modules/mod_speling.so
#LoadModule userdir_module modules/mod_userdir.so
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
また、apacheの起動プロセス数や子プロセスの再生成タイミングなども縮小方向で変更した。これでだいぶメモリーが節約できることが期待できる。
変更前
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
変更後
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 50
MaxClients 50
MaxRequestsPerChild 300
</IfModule>
変更前
# ps axuw|grep httpd
root 1719 0.6 1.5 31712 8152 ? Ss 04:40 0:00 /usr/sbin/httpd
apache 1723 4.0 2.0 34936 10580 ? D 04:40 0:00 /usr/sbin/httpd
apache 1724 0.0 0.8 31712 4096 ? S 04:40 0:00 /usr/sbin/httpd
apache 1725 0.0 0.8 31712 4096 ? S 04:40 0:00 /usr/sbin/httpd
apache 1726 0.0 0.8 31712 4096 ? S 04:40 0:00 /usr/sbin/httpd
apache 1727 0.0 0.8 31712 4096 ? S 04:40 0:00 /usr/sbin/httpd
apache 1728 0.0 0.8 31712 4096 ? S 04:40 0:00 /usr/sbin/httpd
apache 1729 0.0 0.8 31712 4096 ? S 04:40 0:00 /usr/sbin/httpd
apache 1730 0.0 0.8 31712 4096 ? S 04:40 0:00 /usr/sbin/httpd
root 1732 0.0 0.1 4372 740 pts/1 S+ 04:40 0:00 grep httpd
#
変更後
# service httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
# !ps
ps auxw|grep httpd
root 3192 0.3 1.5 30992 7664 ? Ss 07:32 0:00 /usr/sbin/httpd
apache 3194 0.0 0.7 30992 3832 ? S 07:32 0:00 /usr/sbin/httpd
apache 3195 0.0 0.7 30992 3832 ? S 07:32 0:00 /usr/sbin/httpd
apache 3196 0.0 0.7 30992 3832 ? S 07:32 0:00 /usr/sbin/httpd
apache 3197 0.0 0.7 30992 3832 ? S 07:32 0:00 /usr/sbin/httpd
apache 3198 0.0 0.7 30992 3832 ? S 07:32 0:00 /usr/sbin/httpd
root 3200 0.0 0.1 4372 736 pts/1 S+ 07:32 0:00 grep httpd
# !ps
結果、常に400MB後半だった使用メモリーが300MB後半から400MB前半で、推移している。
Mem: 509668k total, 399100k used, 110568k free, 10360k buffers
ab -n 300 -c 30 https://blog.kumacchi.com/
Benchmarking blog.kumacchi.com (be patient)
apr_poll: The timeout specified has expired (70007)
Total of 30 requests completed
abコマンドでベンチマークしてみると同時接続数30では上記のようにtimeoutしてしまうものの、サーバーは固まらなくなった。同時接続数20なら普通に処理されるようになった。
【Apache】モジュールの削除によりメモリを節約する – (・∀・)イイ!!Memo
とりあえず、これで様子をみてみてこれでもダメだと、webサーバー自体を軽量なものに変更しようかと考えている。
あと、更に調べている時にさくらインターネットん田中社長のブログにロードモジュールの一覧と説明が載っているのを見つけたのでこれを参考にして、さらにロードモジュールを絞ればもうちょっとメモリーが節約出そうに思う。
●追記
田中社長のブログのロードモジュールの説明を参考にして、最終的にhttpd.confは下記の様になった。
LoadModule auth_basic_module modules/mod_auth_basic.so
#LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_alias_module modules/mod_authn_alias.so
#LoadModule authn_anon_module modules/mod_authn_anon.so
#LoadModule authn_dbm_module modules/mod_authn_dbm.so
#LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authz_host_module modules/mod_authz_host.so
#LoadModule authz_user_module modules/mod_authz_user.so
#LoadModule authz_owner_module modules/mod_authz_owner.so
#LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
#LoadModule authz_dbm_module modules/mod_authz_dbm.so
#LoadModule authz_default_module modules/mod_authz_default.so
#LoadModule ldap_module modules/mod_ldap.so
#LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
#LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule logio_module modules/mod_logio.so
LoadModule env_module modules/mod_env.so
#LoadModule ext_filter_module modules/mod_ext_filter.so
#LoadModule mime_magic_module modules/mod_mime_magic.so
#LoadModule expires_module modules/mod_expires.so
#LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
#LoadModule usertrack_module modules/mod_usertrack.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
#LoadModule dav_module modules/mod_dav.so
LoadModule status_module modules/mod_status.so
#LoadModule autoindex_module modules/mod_autoindex.so
#LoadModule info_module modules/mod_info.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
#LoadModule actions_module modules/mod_actions.so
#LoadModule speling_module modules/mod_speling.so
#LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
#LoadModule substitute_module modules/mod_substitute.so
LoadModule rewrite_module modules/mod_rewrite.so
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule cache_module modules/mod_cache.so
LoadModule suexec_module modules/mod_suexec.so
#LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule cgi_module modules/mod_cgi.so
#LoadModule version_module modules/mod_version.so
結果起動直後のhttpdのメモリー使用量はここまで減少した。
[root@rad-xen-vweb10 conf]# service httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
[root@rad-xen-vweb10 conf]# ps auxw|grep httpd
root 3632 0.1 1.4 29808 7156 ? Ss 08:20 0:00 /usr/sbin/httpd
apache 3634 0.0 0.9 29836 4936 ? S 08:20 0:00 /usr/sbin/httpd
apache 3635 7.1 2.9 37720 14984 ? S 08:20 0:00 /usr/sbin/httpd
apache 3636 0.0 0.6 29808 3472 ? S 08:20 0:00 /usr/sbin/httpd
apache 3637 0.0 0.6 29808 3472 ? S 08:20 0:00 /usr/sbin/httpd
apache 3638 0.0 0.6 29808 3472 ? S 08:20 0:00 /usr/sbin/httpd
apache 3639 0.0 0.6 29808 3472 ? S 08:20 0:00 /usr/sbin/httpd
root 3641 0.0 0.1 4372 736 pts/1 S+ 08:21 0:00 grep httpd
[root@rad-xen-vweb10 conf]#
これだけロードモジュールを削るとちょっと心配であるが、とりあえずサイトにはアクセスできているので、これでしばらく様子を見てみる。
注意点としてこれだけ削ると、httpd.confの定義がエラーになってサーバーを起動できなくななる恐れがある。というかなったので注意が必要。
たぶんautoindex_moduleを削った影響だと思われるが、AddIcon系の定義がエラーになってapacheを起動できなくなった。エラーの行を全てコメントアウトして対応した。
httpd.confの編集前にコピーをとっておくことを推奨。