プロが教えるわが家の防犯対策術!

centosでウェブサーバーが稼働しています。
ウェブサイトが急に遅くなるときがあり、その都度、下記URLを参考にTOPコマンドを見たりしているのですがよく分かりません。
https://qiita.com/moriyaman/items/366f7eca5eda36 …

下記がそのときのTOPコマンドの状態です。

top - 21:10:21 up 1173 days, 6:25, 1 user, load average: 0.22, 0.21, 0.18
Tasks: 722 total, 2 running, 720 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.9%us, 0.3%sy, 0.0%ni, 98.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 65947456k total, 57379340k used, 8568116k free, 276608k buffers
Swap: 8191996k total, 126868k used, 8065128k free, 3976344k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
27192 mysql 20 0 12.3g 117m 4052 S 9.3 0.2 89783:36 mysqld
16613 apache 20 0 1259m 22m 9932 S 3.0 0.0 0:00.80 httpd
16868 apache 20 0 1258m 21m 9512 S 2.6 0.0 0:00.61 httpd
17614 root 20 0 171m 11m 6592 R 2.0 0.0 0:00.06 php
16616 apache 20 0 1258m 47m 35m S 1.0 0.1 0:00.79 httpd
16948 apache 20 0 1259m 21m 8724 S 1.0 0.0 0:00.77 httpd
15194 apache 20 0 1260m 26m 12m S 0.7 0.0 0:01.80 httpd


スリープ状態のプロセス数が720あるのは目安として問題ない範囲なのでしょうか。

また、ウェブサイトは遅いのに、いつもロードアベレージは低いので
netstatコマンドでコネクション数を確認しましたが、下記のように3000ぐらいでした。

# netstat -an | wc -l
3313

また、下記URLを参考にvmstat コマンドを試してみたところ
http://www.sakito.com/2012/06/linux.html
https://www.denet.ad.jp/technology/2017/10/vmsta …

# vmstat 1 10
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 126868 8467180 276608 3981396 0 0 0 2 0 0 0 0 99 0 0
1 0 126868 8462600 276608 3981400 0 0 0 0 2029 2297 1 0 98 0 0
1 0 126868 8466544 276608 3981404 0 0 0 0 2242 2772 1 0 98 0 0
0 0 126868 8466332 276608 3981408 0 0 0 0 2163 2480 1 0 99 0 0
2 0 126868 8464228 276608 3981416 0 0 0 44 2876 3050 2 0 98 0 0
1 0 126868 8465336 276608 3981432 0 0 0 0 2599 2801 1 0 99 0 0
0 0 126868 8465612 276608 3981436 0 0 0 0 2507 2935 1 0 99 0 0
0 0 126868 8465228 276608 3981436 0 0 0 0 1971 2282 1 0 99 0 0
1 0 126868 8464608 276608 3981444 0 0 0 0 2838 3352 2 1 98 0 0
0 0 126868 8464340 276608 3981452 0 0 0 72 2115 2596 1 0 99 0 0

となりました。
たまにrの値が3のときもありましたが、特に問題ないように感じました。

上記のデータだけで何が原因なのか分かるものでしょうか。

また、他に原因の見つけ方がありましたら教えていただけると幸いです。

A 回答 (3件)

ぱっと見ですが、一時的にメモリが枯渇したのではないかと想像します。


私が見たポイントは、swapです。

このサーバには64GBのメモリを搭載しているようですが、万が一枯渇したときのためにスワップ領域を8GB確保しているようです。
通常、メモリ容量に余裕があるときは、スワップ領域は一切利用しませんが、topの結果を見ると120MB程度スワップ領域を使用しています。ということから、一時的にメモリが枯渇し、動いていないプロセスのメモリ領域がスワップに追い出されたということがわかります。なんだ、たった120MBじゃないかと思われるかもしれませんが、一時的に退避されたメモリも、物理メモリに余裕ができたときには動き出すタイミングでそちらに戻ります。最悪な状況ではもっとスワップに追い出されており、それがパフォーマンスを阻害する要因だったのではないかと想像します。

LAMP構成のWebサーバでメモリを大量に使うソフトウェアは、mysqlか、phpが代表的です。また、httpdはpreforkモデルで起動していると思いますので、接続数が多くなりかつphpなどのプログラムが同時にたくさん走ったりすると、これもメモリを食う要因になるかもしれません。もしかすると、messagesあたりにoom killerのログが出ているかもしれませんので、一度確認してみるといいかもしれません。

ちなみに、No.1の回答でworkerと言及がありますが、運用しているサーバがCentOS7以前でPHPのバージョンが5系だったりすると、このPHPはスレッドセーフではないので、httpdはpreforkでないと動きません。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。

スワップによるパフォーマンス低下のご指摘ありがとうございます。

また、文中でご指摘されているとおり、phpとmysqlで構成されたウェブサイト群を運営しております。

messagesを確認しましたが、該当日のログが削除されてしまっており、oom killerを確認できませんでした。

preforkは以下の設定になっているのですが、もし設定変更した方がよい箇所がありましたらアドバイスいただけると幸いです。

StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000


Server version: Apache/2.2.15 (Unix)
Server MPM: Prefork

どうぞよろしくお願いいたします。

お礼日時:2019/12/01 20:06

>もし上記の設定をチューニングすることでパフォーマンスがアップするのであれば~



設定値だけ見て良い悪いがわかるものではありません。
アプリの作り、メモリの状態、CPUの状態などいろいろな要素を見ながら増やしたり減らしたりしていくから「チューニング」なわけですから。
    • good
    • 0

>また、他に原因の見つけ方がありましたら教えていただけると幸いです。



httpdはapacheかと思いますが、チューニングはしていますか?
Webサイトの作りやコンテンツにもよりますが、preforkなのかworkerなのか、KeepAliveを使うか、ServerLimitやMaxClientsなどの設定はサーバのリソースを有効に使えるような数値になっているかとか。
これらが大きすぎて実メモリを超えてしまうとスワップするので、これはwebサーバとしては致命的です(拝見したところ大丈夫そうですが)。
またmysqlをお使いのようですが、場合によってはここがボトルネックになってサイトの反応が遅くなることもあり得ます。 スロークエリログ (Slow query log)をとってみるといいかもしれません。

いずれにせよいろいろな角度で考えながら、考えうる可能性をひとつづず潰しながら原因を突き止めていくしかないと思います。
そういう意味ではトータルに監視できるmuninあたりを仕込んで継続的に各種リソースの監視をしてみてはいかがでしょうか。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
ご指摘の通り、チューニングはほぼしていない状態です。
preforkで、KeepAliveはOffになっていました。

KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15

ServerLimitやMaxClientsなどの設定は下記のようになっております。

StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000

「考えうる可能性をひとつづず潰しながら原因を突き止めていくしかないと思います」とおっしゃる通りだと思います。

もし上記の設定をチューニングすることでパフォーマンスがアップするのであれば試したいのですが、もし気になる点などありましたらアドバイスいただけると幸いです。

お礼日時:2019/12/01 19:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!