わたくしたちのブログが乗っている VPS のメモリ使用量が多すぎませんこと!?
- メモリ 1024 MB の内、994 MB を使用、余りが 29 MB とメモリの余裕はほとんどない。
- スワップは 1024 MB の内、18 MB を使用、余りが 1005 MB とスワップの余裕はずい分ある。
[root@oki2a24 ~]# free -mt total used free shared buffers cached Mem: 1024 994 29 0 0 841 -/+ buffers/cache: 152 871 Swap: 1024 18 1005 Total: 2048 1013 1034 [root@oki2a24 ~]#
スワップってなんでしょうか?でもメモリに余裕がありませんので、これ、良くないように思います。。。><
どうしましょう、オロロ><。。。
最近設定をいじりましたのは、確か MySQL でしたわね。まずは MySQL を容疑者として、調べました。
その過程は、大雑把に次のようになりましたの♪
- MySQL を診断してみる
MySQL チューニングしたいです!★MySQLTuner をきっかけに♪ | oki2a24 - スワップとはなにか、勉強する
- そういえば、どのプロセスがメモリを多く使用しているのかしら?
- Apache の設定をメモリ使用量を減らす方向に見直します!
1.MySQLTuner で再び診断してみます♪
次のようにコマンドを打ち、診断いたしました。
# ダウンロード、解凍、実行場所に移動 wget https://github.com/rackerhacker/MySQLTuner-perl/archive/master.zip unzip master cd MySQLTuner-perl-master/ # 診断実行 perl mysqltuner.pl
パフォーマンス部分を見ましても、問題はなさそうです。
-------- Performance Metrics ------------------------------------------------- [--] Up for: 2d 6h 7m 31s (1M q [7.811 qps], 17K conn, TX: 7B, RX: 209M) [--] Reads / Writes: 98% / 2% [--] Total buffers: 272.0M global + 1.2M per thread (256 max threads) [OK] Maximum possible memory usage: 576.0M (56% of installed RAM) [OK] Slow queries: 0% (0/1M) [OK] Highest usage of available connections: 3% (10/256) [OK] Key buffer size / total MyISAM indexes: 16.0M/8.7M [OK] Key buffer hit rate: 99.9% (1M cached / 1K reads) [OK] Query cache efficiency: 85.2% (1M cached / 1M selects) [OK] Query cache prunes per day: 0 [OK] Sorts requiring temporary tables: 0% (6 temp sorts / 30K sorts) [OK] Temporary tables created on disk: 5% (8K on disk / 174K total) [OK] Thread cache hit rate: 99% (10 created / 17K connections) [OK] Table cache hit rate: 22% (76 open / 333 opened) [OK] Open file limit used: 2% (108/4K) [OK] Table locks acquired immediately: 99% (147K immediate / 147K locks)
ただし、これは MySQL に限った話であって、サーバ全体を考えた時、これでは良くない、と考えるべきでしょう。
つまり結論として、サーバ全体のメモリ使用量をチューニングするのに、MySQLTuner は役に立たない場合がある、ということと考えます><。
2.メモリのスワップとは一体何なのかしら?
- 実メモリが足りなくなった時に、ハードディスクを使ってメモリの代わりをさせる。
- 実メモリの読み書きは高速だが、比較するとスワップ(ハードディスク)の読み書きは遅い。
- スワップイン スワップ → 実メモリーに復元
- スワップアウト 実メモリー → スワップに退避
- ざっくり言って、スワップは使用されないようにした方がよい。
このことは、次のページから読み取りました。ありがとう存じます。
また、次の情報も勉強になりました。
スワップが発生すると、サーバのスループットは極端に落ちてしまいます。サーバの調子が悪い場合に、メモリ不足でスワップが発生しているか否かが疑わしい場合は sar -W を利用すると、その時間にスワップが発生している / いたかどうかを確認することができます。
- P186 [24時間365日] サーバ/インフラを支える技術 ~スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)
やはり、スワップ発生よくない!><、とざっくり覚えておいてよさそうですわね。
2−1.sar -W でスワップが発生している / いたかどうかを確認!
スワップインも、スワップアウトも、時折発生しております!これを、ゼロにしたいですわね。。。
[root@oki2a24 ~]# sar -W Linux 2.6.32-042stab079.5 (oki2a24.com) 01/16/14 00:00:01 pswpin/s pswpout/s 00:10:01 0.00 0.00 …略… 05:20:01 3.71 8.71 …略… 20:30:02 0.68 14.92 …略… Average: 0.13 0.32 [root@oki2a24 ~]#
3.そういえば、どのプロセスがメモリを多く使用しているのかしら?
WordPress 用途でサーバを使用しておりますので、Apache もしくは MySQL が最も多くメモリを消費していると予想できます。
それを、どうやって確認いたしましょうか?次のコマンドを使用します。
# すべてのプロセスを詳細に表示 ps auxw
得られる VSZ 、RSS に注目します。
- VSZ そのプロセスが確保している仮想メモリ領域のサイズ。Virtual Set Size の略。
- RSS そのプロセスが確保している物理メモリ領域のサイズ。Resident Set Size の略。
桁違いに大きいプロセスがございました。それらを抜き出します。
これらだけ、一桁大きい使用量でしたの。これから判断いたしますと、MySQL というよりも、Apache のプロセスが多く、各プロセスのメモリ使用量もかなり大きい、と言えますわね。
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND mysql 1035 0.1 7.2 180576 75928 ? Sl Jan14 4:11 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugi root 1120 0.0 1.4 108480 15412 ? Ss Jan14 0:12 /usr/sbin/httpd apache 5940 0.9 3.3 112856 34640 ? S 22:07 0:29 /usr/sbin/httpd apache 5982 0.9 3.4 116264 36592 ? S 22:37 0:13 /usr/sbin/httpd apache 5991 0.6 2.9 111420 30728 ? S 22:42 0:07 /usr/sbin/httpd apache 6000 0.6 2.9 111648 30876 ? S 22:52 0:03 /usr/sbin/httpd apache 6001 0.5 3.3 116480 35648 ? S 22:53 0:02 /usr/sbin/httpd
と、いうことで、Apache の設定を見直すことといたします。
4.Apache の設定をメモリ使用量を減らす方向に見直します!
- StartServers 8 → 10
- MinSpareServers 5 → 5
- MaxSpareServers 20 → 15
- ServerLimit 256 → 256
- MaxClients 256 → 40
- MaxRequestsPerChild 4000 → 1000
上記のようにしました。今まで何度もお世話になった、次のページの設定です。
丁度、「1GBメモリ、2コア程度のサーバ(さくらのVPS 1Gプラン相当)でいつも行っている設定」とスペックが大体同じですのでありがたく採用させていただきました。
さて、その後、Apache と、ついでに MySQL も再起動しまして、しばらく待ちました。そしてパフォーマンスを計測です!
まあ!改善しましたわね♪
[root@oki2a24 ~]# free -mt total used free shared buffers cached Mem: 1024 852 171 0 0 756 -/+ buffers/cache: 95 928 Swap: 1024 5 1018 Total: 2048 857 1190 [root@oki2a24 ~]#
メモリです。
- used 994 → 852 MB
- free 29 → 171 MB
スワップです。
- used 18 → 5 MB
- free 1005 → 1018 MB
次に、プロセスの以前と同じ項目を見てみます♪
あら?。。。Apache のプロセスの各メモリ使用量が減るかと思っていたのですけれども、、、そんなことはございませんのね。。。
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 7780 0.0 0.1 2516 1104 pts/0 S 21:58 0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/ mysql 8229 0.1 1.0 175996 10548 pts/0 Sl 21:59 0:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin root 7671 0.0 1.6 108480 17740 ? Ss 21:15 0:00 /usr/sbin/httpd apache 7680 1.0 3.5 111688 36996 ? S 21:17 0:28 /usr/sbin/httpd apache 7720 0.8 3.5 116768 37308 ? S 21:46 0:07 /usr/sbin/httpd apache 7726 0.7 3.6 116308 37808 ? S 21:52 0:04 /usr/sbin/httpd apache 7733 1.3 3.3 113568 35284 ? S 21:56 0:04 /usr/sbin/httpd apache 8247 1.0 3.0 111528 31596 ? S 22:00 0:00 /usr/sbin/httpd
立ち上がっておりますプロセス数は同じですので、もっと時間が経ちましたら最初の時のようなメモリ使用量となってしまいませんかしら?
うーん、わかりません!あとは Apache Bench などで計測してみて、メモリ使用量以外に実際のパフォーマンス比較してみると良いのでしょうね。
ですが今回はここまでとします!
おわりに
いまいちスッキリしませんの><。改善されたのか、されていないのか。。。
いままさに、ずっと htop コマンドでメモリ使用量を監視しておりますけれども、今のところ設定変更後に計測した値のままです。
このままずっと、少し余裕のあるような状態で過ぎてくださると嬉しいのですけれども。
以上です。