出産前後の痔にはご注意!

ロードアベレージが高いのですが、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

このQ&Aに関連する最新のQ&A

A 回答 (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)の設定修正が必要になります。

 一度、アプリケーションの性能不具合が発生していないか、
 専門家に分析してもらうことをオススメします。
    • good
    • 0
この回答へのお礼

ありがとうございます。
勘違いはしていないと思ってます(笑)

ただ、ロードアベレージの概念はわかっていたつもりでしたが、たいていCPUやディスクIOが原因で~~~みたいな書かれ方で、それらを調べる方法しか書かれていなかったものなので、自分の中で仮説はあったんですが、いまいち自信が持てずサーバー移転の前に原因をはっきりわかりたいと考えていました。

サーバー移転も行い、その後は一応負荷があがることなく動いていますが、お二人のお話を聞いて原因の目処はたちました。
データベースがやはりレスポンスが悪そうです。主にテーブルロックとインデックスの問題だと思います。

今後はデータベースのチューニングをしていこうかと思います。

皆さんありがとうございました。

お礼日時:2010/10/26 14:43

>apacheが原因ということはわかっています。



なぜapacheが原因と思われるのでしょうか?
apacheが原因ならそこを見直しては?

>apacheのプロセスがたくさん作られています

たくさんっていくつでしょうか?

>ロードアベレージの原因はCPUかディスクIOであると書かれていて

一般論で言えば上記通りですが、他のIOは思い浮かびませんか?

CPUの負荷が低い割りにキューの処理が遅い理由は1つ1つのジョブに時間が掛かっていると思われます。
従って、1つ1つのジョブに時間を要する理由が原因と思われます。

以下は勝手な推測ですが、Webサービスのロジックがネットワーク、或いはDBの応答を待っているのではありませんか?
仮にネットワーク越しに値を取得してから処理するようなロジックでは相当にパフォーマンスが悪いでしょうし、MySQLに無駄な処理をさせていませんか?
後はネットワーク帯域の問題の可能性もあります。
いずれもきちんとボトルネックを計測すればある程度推論は立つと思います。

時間が無いので中途半端な回答になりましたが、ログ解析をお勧めします。

この回答への補足

>apacheが原因ということはわかっています。
>apacheのプロセスがたくさん作られています

ロードアベレージが高くなる時はapacheのプロセスが多くなっています。
たしか100以上はあったはずです。

>以下は勝手な推測ですが、Webサービスのロジックがネットワーク、或いはDBの応答を待っているのではありませんか?

たしかにその可能性はあります。ネットワークはともかくDBの可能性は否定できません。
この質問の以前にDBも同じサーバー内にあったのですが、DBのCPU使用率が高く、ロードアベレージの高い原因はDB
だと考え(決めつけて)、WEBサーバーから切り離したんですが、結局あまり変わらなかったという経緯があります。
確かにリクエストがあると基本DBに何回も問い合わせするページがあるので、まずはその辺を疑ってみたいと思います。


>時間が無いので中途半端な回答になりましたが、ログ解析をお勧めします。

時間がない中ありがとうございます。

補足日時:2010/10/22 14:27
    • good
    • 0

root権限はありますか。


一度、再起動してみて下さい。

又、各種ログをご覧になっていますか。
特に、エラーログです。

PLESKから管理しているのでしょうか。??

この回答への補足

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

PLESKは入っていますが私はつかっておりません。

補足日時:2010/10/22 14:16
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCPU使用率とロードアベレージ

Linuxのtopコマンド等で出力されるCPU使用率とロードアベレージの違いを教えてください。
また、ロードアベレージをCPU使用率に換算することは可能でしょうか?
可能であれば方法を教えてください。

Aベストアンサー

 ロードアベレージは、最も簡単に説明すると、実行プロセス数の平均だ。説明によっては実行待ちプロセス数や実行可能プロセス数となっているが、正確には実行プロセス数(実行中プロセス数+実行可能プロセス数)だ。つまり、I/O待ちのプロセスはカウントされない。
 ここで、たとえば、1秒間に10回実行プロセス数をカウントすると、1分間では600回カウントする。カウントした時に、毎回3、4、5あたりをうろうろしていると、平均値としては4ぐらいになる。これがロードアベレージだ。正確に、Linuxが1秒に何回カウントしているかは知らんが、どちらにせよ
(カウントした時のロード数1+...カウントした時のロード数n)/カウント数
という計算式になるので、1分に何回カウントしたかはあまり重要な数字ではない(もちろん1分に1回やら数回やらというのは困るが)。ロードの平均値を取っているのでロードアベレージだ。

 ロードアベレージは、「システム負荷率」と表現される事が多い。負荷ってCPU使用率じゃないのと思うかも知れないが、例えば、CPUが1個のマシンにおいて、CPU使用率が常に100%の状態が1時間続いたと仮定して、その間ロードアベレージが常に1だったとすると、システムの負荷は0という事になる。なぜかと言うと1個のプロセスが常にCPUを占有している状態だからで、それは1個のプロセスが理想的にCPUを使いつづけた状態だからだ。
 つまり、ロードアベレージが負荷と表現されるのは、「CPUが割り当てられたらすぐ実行できるのに実行できないプロセスの割合」だからかな。

 別のモデルを考える。I/Oを行わず、常にCPUによる処理をしている3つのプロセスがあり、システムプロセスを含め、それ以外のプロセスは一切動作しないとすると、ロードアベレージは常に3になる。CPUが1個だと3、2個だと3、3個だと3、4個だと3だ。変わってCPU利用率はCPUが1個だと100%、2個だと100%、3個だと100%、4個だと75%となる。
 もちろん、ロードアベレージが3でも、CPUが1個だと常に2つのプロセスが実行可能(CPU割り当て待ち)となるが、3個だと3つのプロセスが全て実行中になる。なので、CPU利用率は1個でも3個でも同じ100%だが、3個だと十分仕事をさばけている状態だし、1個だとさばけていないよね。CPU利用率だけでは分からないって事。なのでロードアベレージが存在するわけだ。
 そういう訳で、「ロードアベレージの理想値=CPUの個数」または、「ロードアベレージがCPUの個数を超えなければシステムは良好」などと説明されている訳だな。

 これが、私が解釈しているロードアベレージだが、何か参考になれば。

 ロードアベレージは、最も簡単に説明すると、実行プロセス数の平均だ。説明によっては実行待ちプロセス数や実行可能プロセス数となっているが、正確には実行プロセス数(実行中プロセス数+実行可能プロセス数)だ。つまり、I/O待ちのプロセスはカウントされない。
 ここで、たとえば、1秒間に10回実行プロセス数をカウントすると、1分間では600回カウントする。カウントした時に、毎回3、4、5あたりをうろうろしていると、平均値としては4ぐらいになる。これがロードアベレージだ。正確に、Linuxが1秒に何回カ...続きを読む

Qテーブルの最後(最新)のレコードを抽出したい

宜しくお願いします。
PHP MYSQL の組み合わせで使っています

以下のようにして、最後のレコードを取り出したいのですが
まったく違う事をしているのかもしれません。

$sql =" select * from テーブル where フィールド='max' " ;

フィールドはauto_incrementで番号を振っています。
これで最大のつもりなのですが・・・。

他にも、レコードを入れた時間も記録したフィールドがあるのですが
どうしてよいか?判りません。

テーブルの最新のレコードを出したいのです。
**その中の一つのフィールドを取り出すのですが、
  それはうまくいっているみたいです 
  (max の所に数字を入れると表示します)

お手数かけますが、どなたかご教授お願いいたします。

Aベストアンサー

#2回答者です。

MySQL 4.1以前(サブクエリを使えない)なら、以下のような方法が考えられます。

select * from 表名
order by 列名 desc limit 1

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

Q/ が何時の間にか「Read-only file system」になってしまった

PlamoLinuxの3くらいを使っています。
18日間起動しているマシンで、
いつものように作業をしようと思ったら、
なぜか動作が変でした。
いろいろと調べてみると、どうやら
/ が何時の間にか「Read-only file system」になっていました。
そのため、/tmpに一時的に書き込んだりする
プログラムの動作がおかしくなったのではないかと思っています。
試しに「# touch /tmp/test」を実行すると
「Read-only file system」とか「読み込み専用ファイルシステムです」
と文句を言われてしまいます。
/etc/fstabと/etc/mtabを確認したところ、
「/dev/hda2 / ext3 defaults 1 1」
「/dev/hda2 / ext3 rw 0 0」
だったので、問題はないかなと思っています。
「# mount -o rw,remount /」を試してみると、
block device /dev/hda2 is write-protected, mounting read-only
と言われてしまいました。
ログを確認したところ、7/30 04:26に書き込まれたのが最後で、
それ以上書かれていないところからすると、
その直後くらいに / がRead-onlyになってしまったようです。
ちなみに、ログにはおかしな記録は見当たりませんでした。

/dev/hda1がswap
/dev/hda2が/
/dev/hda3が/boot
/dev/hda4が/home
で、/だけがRead-onlyになってしまったようで、
/home, /bootは書き込めました。
再起動はできるだけしたくないのですが、
元にもどす方法はないでしょうか?
宜しくお願いします。

PlamoLinuxの3くらいを使っています。
18日間起動しているマシンで、
いつものように作業をしようと思ったら、
なぜか動作が変でした。
いろいろと調べてみると、どうやら
/ が何時の間にか「Read-only file system」になっていました。
そのため、/tmpに一時的に書き込んだりする
プログラムの動作がおかしくなったのではないかと思っています。
試しに「# touch /tmp/test」を実行すると
「Read-only file system」とか「読み込み専用ファイルシステムです」
と文句を言われてしまいます。
/etc/fsta...続きを読む

Aベストアンサー

dmesg を実行したり /var/log/messages を調べると kernel から何かファイルシステムに関するエラーが出力されていませんでしょうか。経験上、ファイルシステムのエラー(I/O error)によって強制的に Read-Only モードに移行させられているように見えます。

もし I/O error 等のエラーが出ている場合は、/ 以下だけではなく、出来れば全パーティションのバックアップを早急に行うことをオススメします。もしディスクの破損が原因であれば、バックアップ作業中に止まってしまう事もありますので、バックアップ作業自体にもリスクを伴うことにご注意下さい(止まってしまうと二度とブートできなくなる、という現象を目の当たりにしたこともあります)。

HDD のセクタ内の情報が単に矛盾しているだけであれば、サーバの再起動後にシングル・ユーザ・モードで fsck を実行してファイルの整合性を確認することが必要です。

もしファイル情報の不整合がハードディスクの物理的な故障によるものであれば、ハードディスクの交換作業が必用になってしまいます。。

まずは、ログを確認して、どのようなメッセージが出ているか確認をなされてみては如何でしょう。上記の記述は最悪のケース、ですので。。

dmesg を実行したり /var/log/messages を調べると kernel から何かファイルシステムに関するエラーが出力されていませんでしょうか。経験上、ファイルシステムのエラー(I/O error)によって強制的に Read-Only モードに移行させられているように見えます。

もし I/O error 等のエラーが出ている場合は、/ 以下だけではなく、出来れば全パーティションのバックアップを早急に行うことをオススメします。もしディスクの破損が原因であれば、バックアップ作業中に止まってしまう事もありますので、バックアップ作...続きを読む

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

Qデータを削除しても表領域の使用率が減りません

いつもお世話になっております。

今使用している表領域の使用率が高くなってきたため、
不要なテーブルやデータを削除しました。

ですが、少ししか使用率が減らず困っています。

テーブルを削除した際にはPURGE RECYCLEBINで、BIN~のテーブルも
消しています。

何か他に原因があるのでしょうか?

Aベストアンサー

前の方のおっしゃるとおり、DELETEしただけでは領域は開放されません(ハイウォーターマークが下がらない)ので、以下を試してみてください。

1.該当テーブルの全件削除で良い場合
truncate テーブル名 drop storage;
を実行する。
これで領域も開放されます。(最後のところをreuse storageとすると領域保持する意味となる)

2.部分的にdeleteして、領域を開放したい場合
alter table テーブル名 enable row movement;
alter table テーブル名 shrink space cascade;
alter table テーブル名 disable row movement;
を実行する。
1行目は領域開放の前準備、3行目は1行目の変更を元に戻す意味。
2行目でcascadeしておくと、関連インデックスの領域も一緒に縮小してくれます。

Q実行中のプロセス数をカウントしたい

ネットで以下コマンドを見つけて実行しました。
ps -ef | grep -v grep | grep httpd
実行結果は/usr/sbin/htpdが9行表示

この9行をカウントしたい為、
ネットで以下コマンドを見つけて実行しました。
ps -ef | grep -v grep | grep httpd | wc
実行結果は『9 72 576』が表示
上記の結果で9のみを表示させるコマンドがあれば
教えていただけないでしょうか。

また、実際にカウントしたいプロセスは以下例のように
半角スペースと()をふくんでおり
上記httpdのようにうまくいきませんでした。
例:test (rei)
半角スペースと()を含んだプロセス数をカウントするコマンドがあれば
教えていただけないでしょうか。

Aベストアンサー

例でいくと

ps -ef | grep -v grep | grep 'test (rei)' | wc -l

でいけるかと。

プロセス名はシングルクォート(ダブルクォートでも)で囲み、
wcコマンドでは -l のオプションを付けてあげれば。


人気Q&Aランキング