web-dev-qa-db-ja.com

I / OレートとCPUがサーバーを食いつぶしてサイトがひどく遅くなる

Linode(1024MB ram、40 GBストレージ、400 GB転送)上のサーバー(Ubuntu 10.04 Lucid LAMP Stack)の読み込みが非常に遅い。私のサイト(WordPress)は比較的小さく(1.5ギガのmysql)、1日あたり約2kのページビューを取得します。 512MBのRAMと20ギガのストレージ+ 200GBの転送でトラフィックが10倍のサイトを運営している人を見たことがあります。何が間違っているのか本当にわかりません。iotopをインストールして結果を確認したところ、mysqlが多くのCPUを使用していることがわかりました。キャッシュシステムをインストールしています。以下は過去24時間のスナップショットです。あなたが私にいくつかの提案を言うことができれば、それは本当に機知に富むでしょう。

以下の更新を参照してください

enter image description here

Update: Solved: Thank you all for your recommendations. I did instal mysqltuner and was able to see at depth what some of the problems were. I found out that the reason for the spike in io rate and swap was a wordpress plugin. The plugin was basically "processing" every minute and after I disabled it, things looked way better. Pic below

enter image description here

1
andrewk

これがMySQLによるものだと思われる場合は、次のことを確認します。

  • mysqltuner.pl を実行すると、MySQLのインストールに関する明らかな問題がどこにあるかがわかります。
  • MySQL Slow Query Logをアクティブにして監視すると、完了までにN秒以上かかるすべてのクエリがログに記録されます(Nは構成可能です)。クエリは、この問題がWordPressまたは他の何かに関連しているかどうかを教えてくれるかもしれません。詳細については、 MySQLドキュメント を参照してください。

グラフを見て、ピーク時間をaccess.logと相関させることができるかどうかも確認します。たぶん、これらのリクエストが正当なWebリクエストであるかどうかをログから確認できます。

2
Oliver

ネットワークの負荷を見ると、アクティビティのバーストがあると思いますが、それはユーザー/顧客からのものですか、それとも他の場所からのものですか?多分見るべき何か。

また、MySQLデータベースはどのように構成されていますか。1.5Gbは場合によっては大規模なデータベースになる可能性があります...インデックスと最適化スクリプトが配置されていますか?

もちろん、私はこのような問題の通常の原因を突き止めていますが、あなたのインストールには、この負荷を引き起こす可能性のある通常とは異なる何かがありますか? Wordpressプラグイン、cronジョブなど?

これは単にWordpressに関連しない問題である可能性が非常に高いと言わなければなりません-cronジョブの自動更新など?

1
Kenneth Coyle

そこでグラフを見ると、非常に周期的に見えます。 Wordpressですか?時計のように1時間に1回実行しているように見えますが、cronジョブや「スケジュールされたタスク」はありません。

Wordpressインストールして X-Debug をインストールして、プロファイリングを実行し、ボトルネックがどこにあるかを確認できます(長い処理PHP/MySQLクエリがここに表示され、すばらしいスタートを切ることができます)。

オリバーが提案したように、MySQLの低速クエリログを有効にすることもできます

編集:また、特定の時間に大量のトラフィックを取得しているように見えます。クローラー(Googleを考えてください)、または誰かがサーバーを攻撃している可能性があります(または、特定の時間にサイトにアクセスするのが好きな人もいます...)。 。これらのピーク時にアクセスログを確認する必要があります。

次のコマンド(rootとして実行)を使用して、すべてのシステムcronジョブを表示できます。

for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done
1
Mattisdada