2013-02-12 24 views
5

AWSにMySQL m2.2xlargeインスタンスがあります。 MySQLデータディレクトリはルートEBS /にあります。それはRAIDではない単一のEBSです。私たちは3つのメインテーブルを持っています。それらのうちの1つTable Cは、コンテンツの中で最大のもので、最後の日分のデータのみが使用されます。これらのテーブルの挿入率は、1日あたり80.000行です。 3つのテーブルには約4200万行があります。 innodb_buffer_pool_sizeには〜30GBのインスタンスRAMがあります。EC2/EBSのMySQL。遅すぎる?

Table A最も重要なのは、そのデータ長が〜33ギガバイトとインデックスが11ギガバイト Table Bは、データ長を有し~~ 8ギガバイトおよび当社のウェブサイトにインデックス〜5ギガバイト

、二つの主要なクエリ(レイテンシワイズ)がされているありますこのように:ほとんどのページで

SELECT * FROM TableA WHERE id in (.....) 

SELECT * FROM TableB JOIN .... WHERE id in (.....) 

(...)これらのクエリは< 50ミリ秒ごとに服用して、いくつかの〜50件の最近のIDになります。しかし、他のいくつかのページでは古いIDを使用していましたが、これらのクエリの待ち時間は500ミリ秒、800ミリ秒、最長1.5秒に急増しました。

私はMysqlを再起動した後、キャッシュ/メモリにインデックスを強制的に入れるためにSELECT id FROM TableBを実行しました。 Table Bクエリはまだ遅くなります。それから私はSELECT * FROM TableBをやった。そして、キャッシュ/メモリ内のテーブル全体が本当に速くなりました(< 50ms)。

私の質問:> 500ms、> 1000msはPRIMARY KEYで行を取得するだけの妥当な遅延ですか? 42Mのテーブルでも?すべての行がディスクに入っていても?それは私のためにあまりにも多くのようです。

MySQLデータを一時記憶域(/ mnt)に移動するとこれが改善されますか?プロビジョニングされたIOPSを使用すると役立つでしょうか?

+0

あなたは、単一のEBSボリュームまたはRAIDを使用していますセット?/mntを使うと、しっかりした複製がなければやや危険です。プロビジョニングされたIOPSは、あまりコストをかけずにテストできます。 – datasage

+0

シングルEBS。新しいEBSボリュームにデータセット全体をダンプすることなく、プロビジョニングされたIOPSに移行することはできません。だから私は最初にいくつかの知識が、移動の仕事の価値がある場合はしたいと思います。 –

+1

私はあなたのボリュームをスナップすることができ、IOをプロビジョニングしたスナップショットから新しいボリュームを作成できると思います。次に、それを新しいインスタンスに接続してテストします。 ec2の素晴らしい点は、新しいインスタンスをプロビジョニングして、パフォーマンス変更をコミットすることなくテストする柔軟性です。 – datasage

答えて

8

免責事項:私は(My)SQLのパフォーマンスに関する専門家はいません。あなたのユースケースのAWS側面についてコメントしています。それと

の方法のうち、アドレスにいくつかの質問があり、何よりもまず:はかないストレージにMySQLのデータを移動する

でしょう(/ MNT)これを改善?私は同じ質問Will moving data from EBS to ephemeral storage improve MySQL query performance?のための答えを提供してきました

、いくつかの重要な詳細のためにそれをチェックしてみてください - TLを; DR:あなたがもし除く任意の耐久性のニーズを(持っている場合は、最も確実ことを行うにはしたくありませんあなたは何をやっているのかを正確に知っている)、かつ過去に主張されていた一時記憶域によるパフォーマンスの向上は、今日の観点からは間違っていない限り、最高でも疑わしい。

プロビジョニングされたIOPSは役に立ちますか?

絶対、Provisioned IOPS Volumesポストを参照して、I/Oスループットランダムアクセス記憶性能および一貫性に敏感であるI/O集約型のワークロード、特にデータベース・ワークロードのニーズを満たすように設計具体的あるFast Forward - Provisioned IOPS for EBS Volumes一般的なご紹介です

  • これらは、理想的には、(必ずしも必要ではないが)最適化された構成のスタックを使用し、EBS I/O用の追加、専用の容量を提供EBS-Optimized Instances、と手をつないで行くことに注意してください。この最適化は、EBS I/OとAmazon EC2インスタンスからの他のトラフィックとの競合を最小限に抑えることによって、EBSボリュームに最適なパフォーマンスを提供します。

  • は、具体的に、あなたはどのように必要なI/Oパフォーマンスを見て、RAIDとそれらの要件を満たすためにEBSのパフォーマンスを向上するためのオプションを扱う専用のセクションIncreasing EBS Performance、一読することをお勧めしますおよび/またはユースケースに応じて、プロビジョニングされたIOPS

私の質問:ちょうどPRIMARY KEYで行を取得するクエリのための合理的なレイテンシは> 500ミリ秒、> 1000msのでしょうか? 42Mのテーブルでも?すべての行がディスクに入っていても?それは私のためにあまりにも多くのようです。

私はあなたがm2.2xlargeインスタンスはメモリの「のみ」34.2ジブます限り、メモリの競合を持っているように見えるように、しかし、与えられた自分の仕様としての値を判断することはできません、あなたが配分されている前述のように〜30ギガバイトすでにinnodb_buffer_pool_sizeのために - これは、OSやMySQLの他のメモリ要件を考慮して私には少し高いようですので、あなたが経験しているキャッシュ/メモリの温暖化の動作を完全に説明するスワップが既に行われているかもしれません。データベース・ワークロードのための一般的な推奨事項として

  • はるかに降圧のための最大の強打であると思われるだけで、あなたのデータセットを確保するために、これらの日は、インスタンスタイプの過多でこれまで以上に簡単である、完全にRAMに収まる(もし一番最初に実現可能)。

は最後に、私はImproving PostgreSQL performance on AWS EC2について非常に最近の記事を読むことをお勧めします - そこ勧告は、主に、同様のもののAWS側に対処し、あまりにもそれに応じてMySQLへの適用ありません。 耐久性のあるデータベースかなりの部分は、上記の私の提案をまとめたもの:あなたはあなたの代わりに、高いIの欲しいもの、あなたのデータを、気に耐久性のあるデータベースの場合

/Oインスタンスは、ネットワークの帯域幅を保証しているEBS Optimized instance、ありますEBSストレージサーバー最適な結果を得るには、EBSボリュームのグループをRAID10アレイにストライプ化してください(provisioned IOPsのEBSボリュームを使用してください)。 increasing EBS performanceを参照してください。

0

それは(MySQL is extremely slow on EC2でMOR詳細一見のため)のMySQL 5.5を使用して、デフォルトでとしてEC2インスタンスよりもあなたIN-の文conatinsのSQL-サブクエリが非常に遅くなる可能性がある場合