私の知る限り、私のサーバー(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
私はこれと同じ問題を抱えていました。 mytopはキューにたくさんのクエリを表示しました。テーブルにインデックスを追加すると、問題は解決しました。
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でロック/クエリの競合が発生し、カーネル実行キューの長さが長くなっているように感じます。
状態S(スリープ)にないコマンドは、アクティブなプロセスとしてカウントされます。これには、R実行状態とDブロッキング状態のものが含まれます。 (後者は通常、ディスクまたはネットワークデバイスからIOから待機しているときに発生します)Zombieプロセスが負荷平均を実行している場合もあります。
具体的にそれらのリストを見つけるには、次のコマンドを試してください。ps -efl | cut -c3- | egrep -v "^S"
iowait時間があまりないので、ゾンビになる可能性があります。
Mysqldからの100%のCPU使用率も、断続的なハングアップを説明している可能性があります。 (たぶん、それは「時々」だけペグされますか?)負荷平均は赤いニシンであるか、問題の根本的な原因ではない可能性があります。
また、マシンが4GBのRAMのうち3.5GBを使用しているようです。 free -m
は、何が使用されているかを少しよく把握できます。
私はあなたのための完全な解決策を持っていませんが、私はいくつかの推測があります。
ただし、上記のデータから、セットアップに多くの問題があることは明らかではありません。箱から出してもう少しパフォーマンスを上げることができるかもしれませんが、単に限界に近づいている可能性があります。
更新:
明確化再:以下のコメント。
典型的なネットワーク指向のTCPサーバーは、リスニングソケットとクライアントへの多数のオープン接続を持つデーモンで構成されます。これらの各ソケットには、待機中のプロセスがあります(1つのプロセスが待機する場合があります)多数のソケット)これらのプロセスはスリープ状態になり、一部のデータが到着するとOSによってウェイクアップされます。効率的である場合(静的Webサーバーなど)、ウェイクアップにかかる時間はわずか100マイクロ秒であるため、実行中のプロセスをキャッチできない可能性があります。アップして、いくつかのデータを提供し、スリープ状態に戻ります。
アップデート2:
最新のOSは、メモリが不足するまで空きメモリを新しいディスクバッファに割り当ててから、最も使用されていないバッファを再利用します。したがって、メモリは常にいっぱいになります。さらに、2つのプロセスが同じページのメモリをそのサイズの一部として報告する方法がいくつかあります。その結果、a)最新のOSは常にメモリ不足になり、b)メモリがどのように使用されているかを正確に把握することは困難です。最も簡単な兆候は、物理メモリの大部分としてバッファとキャッシュされた数値を探すことです。このボックスでは、メモリの30%以上がキャッシュされたディスクデータにあります。