web-dev-qa-db-ja.com

負荷平均は高いが、リソースが十分に使用されていない

私の知る限り、私のサーバー(Ubuntu Linux 8.04.1)の平均負荷は非常に高く、実際には、ピーク時に速度が低下したり、サービスが停止したりします。

明らかにディスクから多くのコンテンツ(画像)を提供する単一のサイト(画像ホスティング)に電力を供給するかなりストックのLAMPですが、提供するにはPHP)を通過する必要があります。一般的なアドバイスは別としてこれにキャッシュ/プロキシアプローチを使用するために、利用可能なリソースの半分未満(4GB RAM、Linode 4096)を使用しているように見える理由に迷いました。

私はLinuxの初心者なので、役立つものは何でも聞いてください。これはhtopの一部です(MySQLは98.9%のCPU使用率を示していますが、それはわずかであり、ほとんど常に0。*%を使用しています):

  1  [|||||||||||||||||||||||||||||||||||         69.0%]     Tasks: 355 total, 6 running

  2  [|||||||||||||||||||||||                     44.8%]     Load average: 18.32 15.02 11.58 
  3  [||||||||||||||||||||||||||||||||||||        71.9%]     Uptime: 01:10:22
  4  [|||||||||||||||||||||||||||||               57.9%]
  Mem[||||||||||||||||||||||||||||||||||||||2190/4096MB]
  Swp[|                                         0/127MB]

  PID USER     PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command                                                  
 2345 mysql     18   0  177M 72640  5140 S 98.9  1.7  7:47.58 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql 
 9350 www-data  16   0 48940 24304  4376 R 13.7  0.6  0:01.05 /usr/sbin/Apache2 -k start
 9301 mysql     15   0  177M 72640  5140 S 10.0  1.7  0:00.17 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql 
 9186 mysql     17   0  177M 72640  5140 S 10.0  1.7  0:00.22 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql 
 9150 www-data  15   0 58400 33900  4476 S  8.1  0.8  0:02.03 /usr/sbin/Apache2 -k start
 9077 mysql     15   0  177M 72640  5140 S  8.1  1.7  0:00.39 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql 
 9270 mysql     15   0  177M 72640  5140 S  7.5  1.7  0:00.12 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql 
 9037 mysql     16   0  177M 72640  5140 S  7.5  1.7  0:00.45 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql 
 9333 www-data  15   0 35724 11260  4560 S  6.2  0.3  0:03.88 /usr/sbin/Apache2 -k start

これは現在のApache2.confですが、私は多くの組み合わせを試しましたが、 過去にここで尋ねました

Timeout 90
KeepAlive On
MaxKeepAliveRequests 150
KeepAliveTimeout 3
<IfModule mpm_prefork_module>
    StartServers          1
    MinSpareServers       1
    MaxSpareServers      5
    MaxClients          275
    ServerLimit          275
    MaxRequestsPerChild   1250
</IfModule>

UPDATE:質問されたように、これはtopの一部です:

top - 15:07:31 up  1:46,  2 users,  load average: 12.83, 10.64, 10.14
Tasks: 223 total,  17 running, 206 sleeping,   0 stopped,   0 zombie
Cpu(s): 84.3%us,  8.8%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  1.0%si,  5.9%st
Mem:   4194528k total,  3555696k used,   638832k free,    27748k buffers
Swap:   131064k total,      588k used,   130476k free,  1458672k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                   
 2345 mysql     17   0  180m  76m 5140 S   55  1.9  13:09.79 mysqld                                                    
12479 www-data  18   0 73224  47m 4552 S   48  1.2   0:03.74 Apache2                                                   
12294 www-data  17   0 71788  46m 4472 R   39  1.1   0:05.78 Apache2                                                   
12382 www-data  17   0 73744  48m 4460 R   33  1.2   0:03.19 Apache2                                                   

UPDATE:提案されているように(Christopher Karel、ありがとう)、ここにアクティブなプロセスがあります(ps -efl | cut -c3- | egrep -v "^S"からの出力)。平均して、1〜5個のApache2プロセスが表示されます。 現在のApache2.confと負荷平均を考えると、これは意味がありますか?

T root     12519 12508  0  75   0 -   612 finish 15:07 pts/1    00:00:00 top
R www-data 18677  2774  1  76   0 - 17130 -      16:23 ?        00:00:04 /usr/sbin/Apache2 -k start
R www-data 18965  2774  2  76   0 - 13397 -      16:26 ?        00:00:04 /usr/sbin/Apache2 -k start
R www-data 19047  2774  2  76   0 - 11613 -      16:28 ?        00:00:00 /usr/sbin/Apache2 -k start
R www-data 19088  2774 55  76   0 - 10482 -      16:29 ?        00:00:00 /usr/sbin/Apache2 -k start
R www-data 19091  2774  0  81   0 -  8579 -      16:29 ?        00:00:00 /usr/sbin/Apache2 -k start
R www-data 19092  2774  0  81   0 -  8355 -      16:29 ?        00:00:00 /usr/sbin/Apache2 -k start
R www-data 19093  2774  0  82   0 -  8322 -      16:29 ?        00:00:00 /usr/sbin/Apache2 -k start
R root     19094 18557  0  77   0 -   593 -      16:29 pts/2    00:00:00 ps -efl
R root     19095 18557  0  78   0 -   729 -      16:29 pts/2    00:00:00 -bash
R root     19096 18557  0  78   0 -   729 -      16:29 pts/2    00:00:00 -bash
1
lima

私はこれと同じ問題を抱えていました。 mytopはキューにたくさんのクエリを表示しました。テーブルにインデックスを追加すると、問題は解決しました。

1
Ross

Apacheのmod_status( http://httpd.Apache.org/docs/2.0/mod/mod_status.html )を有効にして、Webサーバー内で何が起こっているかを正確に確認することをお勧めします。具体的には、リクエストごとのCPU消費量に関する数値が表示されます。

Vmstat/iostatからのいくつかのスナップショットも害はありません。

また、MyISAMまたはInnoDBテーブルを使用していますか?これらの負荷スパイクの1つを取得すると、MySQLの「SHOWFULL PROCESSLIST\G」から何が得られますか? MySQLでロック/クエリの競合が発生し、カーネル実行キューの長さが長くなっているように感じます。

1
MrTuttle

状態S(スリープ)にないコマンドは、アクティブなプロセスとしてカウントされます。これには、R実行状態とDブロッキング状態のものが含まれます。 (後者は通常、ディスクまたはネットワークデバイスからIOから待機しているときに発生します)Zombieプロセスが負荷平均を実行している場合もあります。

具体的にそれらのリストを見つけるには、次のコマンドを試してください。ps -efl | cut -c3- | egrep -v "^S" iowait時間があまりないので、ゾンビになる可能性があります。

Mysqldからの100%のCPU使用率も、断続的なハングアップを説明している可能性があります。 (たぶん、それは「時々」だけペグされますか?)負荷平均は赤いニシンであるか、問題の根本的な原因ではない可能性があります。

また、マシンが4GBのRAMのうち3.5GBを使用しているようです。 free -mは、何が使用されているかを少しよく把握できます。

0

私はあなたのための完全な解決策を持っていませんが、私はいくつかの推測があります。

  1. あなたのmysqlサーバーは128MBのプールのようなものしかないようです。 LAMPシステムがかなりのサイズのデータ​​ベースを利用している場合、これは低い側にあるように思われます。これにより、ディスクに対して大量のI/Oが生成されます。また、mysqlにCPUスパイクがある場合は、低速クエリロギングを少しオンにして、何が表示されるかを確認します。新しいインデックスが1つか2つあるかもしれません。
  2. 最新のカーネルでプロセスごとのコンピューターのほとんどを読み取ることができる最上位の代替品については、最上位をお勧めします。特に、プロセスごとにディスクアクセスを表示できます。 atopにはセットアップの一部として実行中のデーモンがあるため、完了後にアンインストールすることをお勧めします。
  3. 信頼できるCPU使用率に注意してください。それらは、多少異なる方法を使用して生成されます。私の経験では、全体的なCPU使用率を示すために、vmstatは「最良の」(==知覚される負荷に最も近い)数値を示します。
  4. 深刻な作業を行っているApacheプロセスがあります。おそらくいくつかのPHPコードの最適化が必要ですか?

ただし、上記のデータから、セットアップに多くの問題があることは明らかではありません。箱から出してもう少しパフォーマンスを上げることができるかもしれませんが、単に限界に近づいている可能性があります。

更新:

明確化再:以下のコメント。

典型的なネットワーク指向のTCPサーバーは、リスニングソケットとクライアントへの多数のオープン接続を持つデーモンで構成されます。これらの各ソケットには、待機中のプロセスがあります(1つのプロセスが待機する場合があります)多数のソケット)これらのプロセスはスリープ状態になり、一部のデータが到着するとOSによってウェイクアップされます。効率的である場合(静的Webサーバーなど)、ウェイクアップにかかる時間はわずか100マイクロ秒であるため、実行中のプロセスをキャッチできない可能性があります。アップして、いくつかのデータを提供し、スリープ状態に戻ります。

アップデート2:

最新のOSは、メモリが不足するまで空きメモリを新しいディスクバッファに割り当ててから、最も使用されていないバッファを再利用します。したがって、メモリは常にいっぱいになります。さらに、2つのプロセスが同じページのメモリをそのサイズの一部として報告する方法がいくつかあります。その結果、a)最新のOSは常にメモリ不足になり、b)メモリがどのように使用されているかを正確に把握することは困難です。最も簡単な兆候は、物理メモリの大部分としてバッファとキャッシュされた数値を探すことです。このボックスでは、メモリの30%以上がキャッシュされたディスクデータにあります。

0
Bittrance