ロードアベレージが高いのはCPUやディスクIOのせい?原因を解明したい

このQ&Aのポイント
  • ロードアベレージが高いのですが、CPUもディスクIOも低い状態です。この原因を解明し、問題を解決したいと考えています。
  • VPSサーバーでapache mysql phpが動いており、mysqlはほとんど使用されていませんが、apacheのプロセスが多くなっています。サーバーのスペック不足が原因と考えられます。
  • 本やブログなどでは、ロードアベレージの原因はCPUかディスクIOであると書かれていますが、この場合は納得できません。どういった要因がロードアベレージの高さに関係しているのでしょうか。
回答を見る
  • ベストアンサー

ロードアベレージが高いのですが、CPUもディスクIOも低く、これはどう

ロードアベレージが高いのですが、CPUもディスクIOも低く、これはどういったことが原因なんだろうと悩んでいます。 topやsar等の結果は以下の感じです。 VPSサーバーでapache mysql phpが動いていて、mysqlはほとんど使っていなくて、apacheが原因ということはわかっています。 apacheのプロセスがたくさん作られています。PV等からもうスペック不足だなとは思っていて近々サーバーを引っ越すのですが、 これの原因をつきとめてすっきりさせたいところです。http.confをいじれば解決する問題なのでしょうか? 本やブログなどを読んでもロードアベレージの原因はCPUかディスクIOであると書かれていてそう思っていたんですが、この状態だと納得できません。よろしくお願いします。 load average: 10.78, 18.97, 20.37 Cpu(s): 2.9%us, 1.8%sy, 0.0%ni, 95.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1572864k total, 587936k used, 984928k free, 0k buffers 06:20:01 PM CPU %user %nice %system %iowait %steal %idle 06:30:01 PM all  5.53 0.00 3.37 0.01   0.00 91.10 06:40:01 PM all   3.40 0.00 2.12 0.00   0.00 94.48 03:20:01 PM kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad 06:40:01 PM 776820 796044    50.61 0    0   0    0    0.00    0 06:50:01 PM 709144 863720    54.91 0    0   0    0    0.00    0 07:00:01 PM 914668 658196   41.85 0   0    0   0    0.00    0

質問者が選んだベストアンサー

  • ベストアンサー
  • onosuke
  • ベストアンサー率67% (310/456)
回答No.3

「ニワトリとたまご」問題的な勘違い(結果と原因の取り違え)をしていないか、 ちょっと気になりました。 まずは、前提知識から確認させてください。 1.ロードアベレージは何の数値なのか?  ロードアベレージとは、実行可能待ちプロセスの数です。  窓口(CPU)の前で待たされている人(プロセス)が多いことを示しているだけです。  よく言われるのは、   「CPU負荷やディスクIOが高いと、左記の状態の影響で、実行可能待ちプロセス数が増加し、    ロードアベレージが高くなる」  つまり、    "原因:CPU負荷、ディスクIOが高い"→"結果:ロードアベレージが高い"  という話であり、原因と結果と取り違えないよう注意して下さい。  インターネット上でも、よく勘違いしている人がいます。 次に、今回の現象の原因分析について 2.ロードアベレージが高い原因は何なのか?  "ロードアベレージ"="実行可能待ちプロセスの数"なので、  >apacheのプロセスがたくさん作られています  ということが直接原因の可能性が濃厚です。   apacheのプロセスがたくさんある    →たくさんのプロセスが窓口(CPU)前で待たされている     →ロードアベレージが高くなる  という考え方です。 3.「apacheのプロセスがたくさん作られている」原因は何か?  "apacheのプロセス(窓口)"がたくさん作られている原因ですが、  ア.大量HTTPリクエストを処理するために"apacheのプロセス(窓口)"がたくさん必要。   という処理量に起因する原因。    イ.一つ一つのHTTPリクエスト処理に時間が掛かっているため、   "apacheのプロセス(窓口)"がたくさん必要。   という処理の特徴に起因する原因。  と2通りが考えられます。  今回の場合は、localicaさんの回答にあるとおり、  イのパターンの原因でしょうね。  >CPUの負荷が低い割りにキューの処理が遅い理由は1つ1つのジョブに  >時間が掛かっていると思われます。  >従って、1つ1つのジョブに時間を要する理由が原因と思われます。 イのパターンの場合、  サーバ更新で処理能力を増強するとしても、  ボトルネックを明らかにして、ボトルネック部分を性能増強しないと性能向上は見込めません  例えば、WEBサーバのCPU能力は今でも十二分に足りており、  これを増強しても性能向上は見込めません。  また、アプリケーションの性能不具合が原因で待ちが発生している場合、  サーバ処理能力を向上させても、問題解決にはなりません。  アプリケーションの性能不具合の具体としては、   ・DB排他ロック待ち   ・ファイル排他ロック待ち   ・DBテーブルへのアクセスプランが最適化されていない   (インデックスを利用していない、全文検索を行っている等)   ・DBMS(mysql)の各種キャッシュが枯渇している  などがあります。  このアプリケーションの性能不具合を修正するには、  ボトルネック部分を明らかにした上で  プログラム改修やDBMS(mysql)の設定修正が必要になります。  一度、アプリケーションの性能不具合が発生していないか、  専門家に分析してもらうことをオススメします。

seltzer24
質問者

お礼

ありがとうございます。 勘違いはしていないと思ってます(笑) ただ、ロードアベレージの概念はわかっていたつもりでしたが、たいていCPUやディスクIOが原因で~~~みたいな書かれ方で、それらを調べる方法しか書かれていなかったものなので、自分の中で仮説はあったんですが、いまいち自信が持てずサーバー移転の前に原因をはっきりわかりたいと考えていました。 サーバー移転も行い、その後は一応負荷があがることなく動いていますが、お二人のお話を聞いて原因の目処はたちました。 データベースがやはりレスポンスが悪そうです。主にテーブルロックとインデックスの問題だと思います。 今後はデータベースのチューニングをしていこうかと思います。 皆さんありがとうございました。

その他の回答 (2)

  • localica
  • ベストアンサー率52% (202/385)
回答No.2

>apacheが原因ということはわかっています。 なぜapacheが原因と思われるのでしょうか? apacheが原因ならそこを見直しては? >apacheのプロセスがたくさん作られています たくさんっていくつでしょうか? >ロードアベレージの原因はCPUかディスクIOであると書かれていて 一般論で言えば上記通りですが、他のIOは思い浮かびませんか? CPUの負荷が低い割りにキューの処理が遅い理由は1つ1つのジョブに時間が掛かっていると思われます。 従って、1つ1つのジョブに時間を要する理由が原因と思われます。 以下は勝手な推測ですが、Webサービスのロジックがネットワーク、或いはDBの応答を待っているのではありませんか? 仮にネットワーク越しに値を取得してから処理するようなロジックでは相当にパフォーマンスが悪いでしょうし、MySQLに無駄な処理をさせていませんか? 後はネットワーク帯域の問題の可能性もあります。 いずれもきちんとボトルネックを計測すればある程度推論は立つと思います。 時間が無いので中途半端な回答になりましたが、ログ解析をお勧めします。

seltzer24
質問者

補足

>apacheが原因ということはわかっています。 >apacheのプロセスがたくさん作られています ロードアベレージが高くなる時はapacheのプロセスが多くなっています。 たしか100以上はあったはずです。 >以下は勝手な推測ですが、Webサービスのロジックがネットワーク、或いはDBの応答を待っているのではありませんか? たしかにその可能性はあります。ネットワークはともかくDBの可能性は否定できません。 この質問の以前にDBも同じサーバー内にあったのですが、DBのCPU使用率が高く、ロードアベレージの高い原因はDB だと考え(決めつけて)、WEBサーバーから切り離したんですが、結局あまり変わらなかったという経緯があります。 確かにリクエストがあると基本DBに何回も問い合わせするページがあるので、まずはその辺を疑ってみたいと思います。 >時間が無いので中途半端な回答になりましたが、ログ解析をお勧めします。 時間がない中ありがとうございます。

  • mega2007
  • ベストアンサー率33% (40/118)
回答No.1

root権限はありますか。 一度、再起動してみて下さい。 又、各種ログをご覧になっていますか。 特に、エラーログです。 PLESKから管理しているのでしょうか。??

seltzer24
質問者

補足

再起動は運用中ですのでできません。 ログは見ていますが基本的に異常な所はないと思います。←ここは自信なし PLESKは入っていますが私はつかっておりません。

関連するQ&A

  • サイトが重く、load averageが高い

    サイトが重く感じたので、topコマンドで見てみるとload averageが7~10をいったりきたりと高い値でした。 load average: 8.57, 7.08, 10.73 Tasks: 114 total, 1 running, 113 sleeping, 0 stopped, 0 zombie Cpu(s): 80.2%us, 19.8%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 3368216k total, 2805768k used, 562448k free, 298348k buffers Swap: 2048276k total, 80k used, 2048196k free, 1977940k cached また、mysqldの%CPUが200近くまでなっており異常に突出していました。 mysql 15 0 164m 39m 4096 S 196.7 1.2 221:52.29 mysqld これはMYSQLへの負荷が高いのかなと思い、 show full processlist をみてみたものの、よくわかりませんでした。 そこでslow queryログを取ろうと思い、3秒以上で出力するように、my.cnfなどに設定したものの、slow queryログファイル自体がなかなか作成されません。 3秒以上掛かるクエリがないのか、それとも設定が間違っているのかは分かりません・・・ また、その際にmysqldをリスタートしたものの、load averageやCPUなどはほとんど変わりませんでした。 topでみたときのmysqldの%CPUが200近いのが気になって仕方ないのですが、他にどこをみたらいいでしょうか。 また、どのような対処法などありますでしょうか。 どうぞよろしくお願い致します。

  • CPU Load Average の目安

    つい先日、サーバである作業をしていましたら その間 Apache が激重になりました。 MRTG で CPU の Load Average を確認したところ 5 分置きの計測で MAX 7% の使用率でした。(RAM 512MB) 通常は 1% を越える事もないと思いますが、 7% の使用率は Apache が激重になるくらいの負荷なのでしょうか? 何パーセントを越えるとマズイとか、そういう目安がイマイチ解っておりません。 アドバイスを頂けますと幸いです。 よろしくお願いします。

  • ロードアベレージの取得について

    PHPの関数でサーバのロードアベレージ(CPU使用率)を 取得するような関数はありませんでしょうか? マニュアルを一通り見たつもりですが それらしいものは見つけられませんでした。 でも、前にどこかでみた記憶があり とても気になっています(^^; よろしくお願いします。

    • 締切済み
    • PHP
  • CPU率が低いのにLoad Averageが高い

    某プロバイダのVPSにてサイトを運用しています。 OSはFreeBSD 4.7です。 最近、突然サイトが重くなることがあり、topで状態を確認しますと、 一番CPU使用率が高いプロセスがmysqldで、5%前後にもかかわらず、 Load Averageが2~4、ひどいときは5を超える時があります。 この状態は短いときは15分程度、長いときは2時間ほど続きますが、 何もしなくても勝手に収束します。 topには表示されないプロセスがCPUを占有しているのでしょうか? VPSだと、同じサーバを共用しているユーザの負荷を影響したりするのでしょうか? この質問はプロバイダの技術担当にしてみましたが明確な解答をいただけませんでした。 負荷の原因となっているプロセスを特定したいのですが、 他に方法がありましたら教えていただけると助かります。

  • サーバ状況の見方と対策方法をどうすべきか?

    CentOS 4を導入してMySQLのインデックスを作っていますが、 サーバが動かなくなってしまい、どうしたらいいか困っています。 メモリを足すだけでよいのか? CPUを上げた方がよいのか? ハードディスクを取り替えた方がよいのか? どう見て、どう動けばよいのでしょうか? よろしくお願いします。 # 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 0 2 241628 872 1144 487020 19 8 1852 1270 5 1 12 2 45 41 0 1 241628 1616 1140 486428 0 0 3680 7084 1223 249 4 2 0 94 0 2 241628 2144 1140 485868 0 0 588 0 1153 315 6 0 0 94 0 1 241628 1936 1140 486120 0 0 556 0 1145 291 6 1 0 93 0 2 241628 1512 1108 486584 0 0 1192 0 1177 149 5 1 0 94 1 0 241628 2580 1084 485492 0 0 1332 2684 1205 247 3 4 0 93 0 2 241628 1656 1076 486400 0 0 1564 0 1191 153 4 1 0 95 0 2 241628 1128 1076 486920 0 0 1828 24 1214 95 0 1 0 99 0 2 241628 1256 1056 486856 0 0 1048 0 1176 176 3 1 0 96 0 2 241628 808 1052 487304 0 0 3764 0 1206 252 4 1 0 95 # top top - 11:52:27 up 9 days, 3:07, 1 user, load average: 1.83, 1.69, 1.66 Tasks: 49 total, 2 running, 47 sleeping, 0 stopped, 0 zombie Cpu(s): 0.7% us, 0.3% sy, 0.0% ni, 0.0% id, 98.0% wa, 1.0% hi, 0.0% si Mem: 507484k total, 506012k used, 1472k free, 1456k buffers Swap: 1052248k total, 241644k used, 810604k free, 485980k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 21899 mysql 15 0 1257m 332m 332m S 1.3 67.2 243:22.41 mysqld 1 root 16 0 3252 88 68 S 0.0 0.0 0:01.17 init 2 root 34 19 0 0 0 S 0.0 0.0 0:00.13 ksoftirqd/0 3 root 5 -10 0 0 0 S 0.0 0.0 0:00.04 events/0 4 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 khelper 5 root 15 -10 0 0 0 S 0.0 0.0 0:00.00 kacpid 20 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 kblockd/0 41 root 13 -10 0 0 0 S 0.0 0.0 0:00.00 aio/0 21 root 15 0 0 0 0 S 0.0 0.0 0:00.00 khubd 40 root 15 0 0 0 0 S 0.0 0.0 12:31.75 kswapd0 188 root 25 0 0 0 0 S 0.0 0.0 0:00.00 kseriod 296 root 15 0 0 0 0 D 0.0 0.0 2:40.01 kjournald # free total used free shared buffers cached Mem: 507484 505440 2044 0 1372 485748 -/+ buffers/cache: 18320 489164 Swap: 1052248 241640 810608

  • mysqlとapacheの設定について

    現在、mysqlのデータベースを利用して商品販売をしているのですが、特に夜間はなかなか接続出来ない状況です。 原因を調べてみているのですが、ロードアベレージも低いままですし、メモリも十分あまっています(メモリは4Gです)。トラフィックもまだ余裕があります。 考えられる原因としてmysqlとapacheの設定かと思うですが、色々検索してみたところ現在の状況にあう設定が見当たりません。 どなたか、mysqlやapacheの設定の変更についてご教授願えないでしょうか? よろしくお願いします。

  • 専用サーバーのロードアベレージ、メモリー使用率、スワップについて

    国内の専用サーバーを借りています。 まだ何もサイトを置いていない借りた当初から、ロードアベレージ(というのでしょうか?)が1~2、メモリー使用率が30~50%、スワップが25%程度あるのですが、こんなものなのでしょうか? 同様の数値を確認できる海外の共有サーバーを借りているのですが、スワップはほとんど0か0に近いですし、メモリー使用率も30%以下です。 専用サーバーのスペックは、Intel(R) Xeon(TM) 1.66Ghz×2、メモリーが1GBです。 確かに海外の共有サーバーはCPUの数もメモリーも大きいです。 ただ、何も使っていないのにどうしてスワップが発生のだろうという気がします。 スワップの意味をよく理解していないのかもしれませんが。 よろしくお願いします。

  • 【メモリ]】vmstat、free、topの表示

    Linux(CentOS)でサーバのメモリ状態を確認するために 以下のコマンドを実行しました。 ・vmstat ・free ・top 【vmstat】 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 140 29812 137284 242088 0 0 0 3 2 0 1 0 96 3 0 【free】 total used free shared buffers cached Mem: 515312 485500 29812 0 137284 242088 -/+ buffers/cache: 106128 409184 Swap: 1052216 140 1052076 【top】 Mem: 515312k total, 485500k used, 29812k free, 137284k buffers Swap: 1052216k total, 140k used, 1052076k free, 242088k cached 各コマンドの表示結果の関連性を教えてください。 1.vmstatコマンドでは「used」項目が表示されないため  メモリの使用量が分からない? 2.「used」項目と「free」項目を足し合わせると、実メモリサイズ(total)と一致する。  「buff(ers)」項目と「cashe(d)」項目は、実メモリの情報?仮想メモリの情報? 3.「buff(ers)」項目と「cashe(d)」とは?また違いは?  #freeコマンドでは、「cashed」項目は「Mem(実メモリ)」列に表示されているが  #topコマンドでは、「Swap(仮想メモリ)」列に表示されている。 4.「-/+ buffers/cache:」列の意味は?  「used」項目と「free」項目を足し合わせると、実メモリサイズ(total)と一致する。  #「Mem」項目の「buffers」項目と「cashed」との違いは? ご教示お願いいたします。 <環境> CentOS(5.5) カーネルバージョン:2.6.18-194.11.3.el5 実メモリ:512MB スワップ領域:1024MB 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 140 29812 137260 242080 0 0 0 3 2 0 1 0 96 3 0 top - 17:00:00 up 125 days, 16:04, 1 user, load average: 0.05, 0.05, 0.02 Tasks: 107 total, 1 running, 106 sleeping, 0 stopped, 0 zombie Cpu(s): 0.2%us, 0.2%sy, 0.4%ni, 96.2%id, 3.1%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 515312k total, 485500k used, 29812k free, 137260k buffers Swap: 1052216k total, 140k used, 1052076k free, 242080k cached

  • Apache.pm failed to load!.エラーについて

    いつもお世話になってます。 今回もよろしくお願い致します。 Perl5.8をインストールして、apacheでCGIを動かしたいのですが、うまくいきません。(perl5.61でも同じことが起こります。) perl、mod_perl等をインストールしてから、apacheを起動しようとすると、”Apache.pm failed to load!.”と表示されて起動できないのです。(http.confの最後に”PerlModule Apache”を加えても同じでした。) また、Apache.pmが、/usr/local/lib/perl5/5.8.0/CGI/にしかなかったので、apacheが起動時にApache.pmを探しに行っている、/usr/local/lib/perl5/5.8.0/にもコピーしたのですが同じく起動できませんでした。 確認のため、 # /usr/local/bin/perl -e 'use Config; print $Config{"usemymalloc"}' として見るとnと返ってきてしまうので、perlが正しくインストールされていないようなのですが、Apache1.32ではCGIが動いているので原因がいまいち分かりません。なにか解決策がありましたらご教授願います。 OS TurboLinux7 Apache 1.327 perl 5.61と5.8ともに試してみました。

  • MySQLのプロセスがCPUを喰っています

    会社でサーバーの管理を任されている者です。 最近サーバーが重くなったという報告を受け、ターミナルでログインして調べてみたところ、MySQLにプロセスがCPUを30%ほど常時使用している事がわかりました。 これがサーバーが重くなった原因かどうかはわかりませんが、正常ではないような気がします。 ちなみにプロセスに表示されているのは以下のような感じです。 -------------------------------------------------- mysql 2444 30.1 0.8 109756 17332 ? S 21:06 4:00 /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/v・・・ -------------------------------------------------- CPU使用率は変化しますが、大体30%前後です。 サーバーの再起動をしてみましたが、しばらくするとまたこれぐらいCPUを使用しています。 たまたまプロセスを見たときに、なんらかのクエリーが出ていた可能性はありますが、一ヶ月ほどウォッチしてみましたが、いつも同じような感じです。 これを解消する手だてはないのでしょうか・・・

    • ベストアンサー
    • MySQL