40/sec への500/sec
導入
、タイトルによって驚かされるか。よく、これは私達が毎秒500 の記録に毎秒meagre 記録40 処理からのスケーラビリティのjinx をいかにの割ったか旅行である。用心しなさい、私達が直面した問題のほとんどはまっすぐに前方だった、従って経験された人々はこれを余分見つけるかもしれない。
目次
* 私達があったところ1.0 か。
1.1 記憶は空に当る
1.2 低い加工率
1.3 データ損失は: - (
1.4 Mysql は私達を引っ張る
1.5 遅いWeb クライエント
* Nirvana への2.0 道
2.1 制御の記憶!
2.2 加工率を流線形にすること
2.3 どんなデータ損失のuh-uh か。
2.4 調整のSQL の問い合わせ
2.5 調整のデータベースのスキーマ
2.5 Mysql は私達が前方に造るのを助ける!
2.6 より速く... より速くWeb クライエント
* 3.0 要点
私達はどこにあったか。
最初に私達は40 の記録/sec までしか量ることができないシステムを有した。私は記録の理想的な率のべきである"何についての議論を、思い出すことができるか。"。最終的に私達は40/sec が単一の防火壁のための理想的な率だったことを決定した。そう私達が出かけなければならないとき私達はatleast 3 つの防火壁を支える必要があった。それ故に私達は120/sec が理想的な率であることを決定した。私達のcompetitor(s) からのデータに基づかせていて私達は240/sec のまわりで、それら支えることができる結論に来た。私達はそれが良かったことを考えた! それが私達の最初解放だったので。競争相手全員が防火壁の数述べていたので彼は率でない支えた。
記憶は空に当る
私達の記憶は常に512MB で空に当っていた! (OutOfMemory の例外) 私達は私達が長くのために脱出できなかった発生させたimages.But のcewolf(s) のinmemory 貯蔵の責任にした! 私達が顧客を接続したまたはない私達は平らな二三日最高の3-4 日の空に当るのが常でなかったどうか問題! 興味深く、これは私達が非常に高いrates(then) でデータを送ったときに50/sec のまわりでの再生可能、だった。それを権利、屋根に当るまで育つ無制限の緩衝推測した。
低い加工率
私達は40/sec の率で記録を処理していた。私達はdataobject(s) のバルク更新を使用していた。しかしそれは期待された速度を与えなかった! このために私達は板囲いの記憶に終って記憶のデータを貯蔵し始めた!
データ損失は: - (
非常に高い速度で私達は多くのpacket(s) を逃すのが常であった。私達は少しデータ損失を有したようであるがそれは記憶ブタで起因した。バッファ・サイズを限るためにひねる一部で私達は非常に高い比率で約20% の安定したデータ損失を有し始めた。
Mysql は私達を引っ張る
私達は私達が140MB のログファイルを約輸入した堅い時に直面していた。Mysql は機械によって始められた這うことhog
始め、時々それ均一な停止されたresponding.Above すべて、私達はdeadlock(s) 及びトランザクションtimeout(s) を得始めた。結局システムの敏感さを減らしたかどれが。
遅いWeb クライエント
ここに再度私達は私達がシステムを引っ張っていた多くの他の要因があったという事実を無視するネックとしてページで示したグラフの数の責任にした。ページはインターネットのデータセンタで4 日後の6-8 のグラフそしてテーブルが付いているページのための負荷に30 秒を取るのが常であった。
Nirvana への道
制御の記憶!
私達は10,000 のバッファ・サイズに限界を置くことを試みたが長くのために持続しない。設計の主要な欠陥はおよそ10000 の緩衝が足りると私達が仮定したことだった、すなわち私達はプロセス記録前に10,1000 の範囲の緩衝である。インラインに主義と"何かが間違って行くことができるそれ間違って行く!" それは間違って行った。私達はデータを緩め始めた。データがフラットファイルに投げ出され、"infile" 負荷データを使用してデータベースに荷を積まれるか私達がフラットファイルの基づかせていた貯蔵と行くことにしたSubsesquently 。これはあなたはまたチェックアウトにinfile 負荷データのある可能な最適化がほしいと思うかもしれないデータベースの運転者によるバルク挿入物の何倍も速くだった。これは未加工記録のバッファ・サイズを増加する私達の問題を解決した。
私達が直面した第2 問題はメカニズムを貯蔵する記憶のcewolf(s) の増加だった。デフォルトによってそれは記憶でイメージの目的を貯蔵する目的の上のクリーニングの問題だったそこにようであった"TransientSessionStorage" を、使用したrerferences が失われた後でさえも! そうローカルファイルでイメージの目的を貯える私達は"FileStorage" の小さい実施を書いた。そして要求が入る時として役立たれれば。さらに、私達はまた一掃の10mins より古い古いimages(のイメージに一掃のメカニズムをimplmentated) 。
私達がここに見つけたもう一つの興味深い面は、ほとんどきれいになった塵芥収集車が低い優先順位従って各のために作成された目的を記録備えていたことでなかった。ここに問題の大きさを説明する少し数学はある。私達が私達が‾20 objects(hashmap を作成した丸太の記録を受け取る時はいつでも、1 第2 のための500/sec の率でひも等を) 、目的の数あった10,000(20*500*1) がそうtokenized 。重い処理の塵芥収集車のために決して一掃にチャンスを目的持っていなかった。私達がしなければならなかったそうすべては目的の参照にマイナーな心痛、私達ちょうど割り当てた"0" をだった。Voila! 塵芥収集車は決して無理に曲られて私は推測するでなかった; -)
加工率を流線形にすること
加工率は意味するmeagre 40/sec に私達はほとんど丸太の記録の小さい爆発に抗できないことをあった! 記憶制御は私達に慰めを与えたが、実際の問題は記録上の注意深いフィルターの適用とあった。私達は各記録のためのおよそ20 の特性を、私達特性すべてを捜すのが常であった有した。私達は私達が規準をのための有したそれらの特性のためのマッチに実施を変えた! さらに、私達はまた注意深いフィルター処理で記憶漏出を有した。私達は永久に育った列を維持した。目的を形作るために記録の再分析を避けるためにそう私達は投げ出すフラットファイルの目的を維持しなければならなかった!
さらに、私達は特性のそれぞれのために私達が注意深い規準を形成してもらわなかった時でさえマッチを捜すことの行為をするのが常であった。
どんなデータ損失のuh-uh か。
私達が固定したら記憶は私達決して失わなかったデータを出ないすなわちフラットファイルに投げ出すデータを受け取ることで! それに加えてデータを投げ出している間間接費を避けるために私達は未加工テーブルの幾つかの不必要な索引を取除かなければならなかった。私達最大3 つの可能な価値があることができるコラムのためのhadd の索引。実際に挿入物をより遅くさせ、有用でなかったかどれが。
調整のSQL の問い合わせ
あなたの問い合わせは性能へあなたのキーである。問題を釘付けし始めればテーブルをde 正常化しなければならないかもしれないことを見る。私達はそれをした! ここに主learnings のいくつかはある:
* mysql の問い合わせがいかに働くか識別するために使用は"テーブル" を分析する。これはテーブルのレベルスキャン等を使用しているどうかすなわち正しい索引を使用しているどうか問い合わせが遅いなぜか洞察力を約与える。
* 決して削除は単一のテーブルの50,000 の記録の順序で巨大なデータを取扱うと漕がない。"低下をする" 常に試みはできるだけ台に置く。それが可能でなかったら、あなたの唯一に出口があること、あなたのスキーマを設計し直しなさい!
* 不必要なjoin(s) を、ないde 正常化すること恐れていないが(すなわちコラムの価値を重複させなさい) できるだけ避けるjoin(s) を、あなたの問い合わせを引っ張りがちである避けなさい。1 つの隠された利点は彼らがあなたの問い合わせの簡易性を課すという事実である。
* バルクデータを取扱えば、常に使用"infile" は負荷データそこに2 つの選択、local およびリモートここにである。mysql および適用が同じ機械使用リモートに他ではあれば使用local 。
* 2 つか3 つのより簡単な問い合わせにあなたの複雑な問い合わせを裂くことを試みなさい。このアプローチの利点はmysql 資源が全体のプロセスのためにhogged ことである。一時的なテーブルを使用しであつて下さい。使用するかわりに5-6 を渡って及ぶ単一の問い合わせは台に置く。
* データの巨大な量を取扱うとき、すなわちバッチプロセスにproces に言う50,000 の記録または限界を使用して単一の問い合わせの試みの多くを記録ほしい。これは新しい高さにシステムを量るのを助ける
* すなわち"n" のテーブルを渡って及ぶ大きい物の代りの常に使用より小さいtransaction(s) 。これは簡単な問い合わせのためのシステムの遅さを引き起こすかもしれないmysql 資源を締める、
* 索引または外国のキーのコラムの使用join(s)
* ユーザ・インタフェースからの問い合わせに規準がある確認しなさいまたは限りなさいことを。
* 規準のコラムが指示されることをまた確認しなさい
* mysql がタイプ鋳造物をするので、引用内のsql の規準の数値を持ってはいけない
* 一時的なテーブルをできるだけ使用し、それを... 落としなさい
* select/delete の挿入物は二重テーブルロック... わかっている... である
* データベースにあなたの更新の頻度のmysql のデータベースを苦しめないこと取得心配。私達に私達が後300 の記録毎にデータベースに投げ出すのが常であった典型的な場合があった。そう私達が500/sec のためにテストし始めたときに私達はmysql が文字通り私達を引張っていたことを見始めた。それはそこの500/sec あらゆる秒の率のtypicall はmysql のデータベースへ"負荷データinfile" 要求であることを私達がわかったときである。3 分後の記録よりもむしろ300 の記録を投げ出すためにそう私達は変わらなければならなかった。
調整のデータベースのスキーマ
データの巨大な量を取扱うとき、あなたのデータを仕切ったことを常に確認しなさい。それはスケーラビリティへあなたの道である。発言10 のlakhs が付いている単一のテーブルは決して量ることができない。レポートのための問い合わせを実行するように意図する時。常に実際のデータのためのテーブル、未加工表1 およびレポートのtables(のための別のセットの2 つのレベルをユーザ・インタフェースが! ただすテーブル持ちなさい) あなたのレポートのテーブルのデータが限界を越えて決して育たないことを常に確認しなさい。Oracle の使用するために計画している規準に基づく仕切りを試すできる包みなさい。しかし不運にもmysql はそれを支えない。そう私達はそれをしなければならない。あなたがすなわち一組のある特定の規準の時間のための見出し内容を捜すために台に置く普通有するメタテーブルを維持しなさい。
* 私達は私達のデータベースのスキーマを通って歩かなければなり、ある索引を加えるために加え、いくつかを削除し、そして高価なjoin(s) を取除くために重複させていたcolumn(s) を均等にする。
* 私達は先に行くことMyISAM にInnoDB
がシステムへ間接費実際にだった、従って私達を持っているそれを変えたそれを実現したので未加工テーブル
* 私達はまた含まれた静的なテーブルの列の数の減少の範囲に結合する行った
* データベースのテーブルの0 により性能は当るようである従ってそれらを避けなさい
* コラムのための索引を持ってはいけない2-3 という値を可能にした
* 十字点検あなたのテーブルの各索引のための必要性、それらは高価である。テーブルがInnoDB のそして倍の点検必要性なら。InnoDB のテーブルがおよそ取るようであるので10-15 はMyISAM のテーブルのサイズを時間を計る。
* 大半がのある時はいつでも使用MyISAM 、どちらか(または挿入物選びなさい) 問い合わせの1 つ。挿入物および選り抜きがそしてあることを行けばInnoDB としてそれを持っていることはよい
Mysql は私達が前方に造るのを助ける!
あなたのqueries/schemas およびあなたのコードを微調整する後やっとあなたのmysql サーバーを調整しなさい。それからただ性能のperceivable 改善を見ることができる。ここに便利入って来変数のいくつかはある:
* あなたの問い合わせが-- InnoDB のためのinnodb_buffer_pool_size=64M 及び使用するため-- MyISAM のためのキーbufer size=32M をより速く実行することを可能にする緩衝域プールのサイズを使用しなさい
* 均一で簡単な問い合わせは期待されるより時間をかけ始めた。私達は実際に困惑した! 私達はmysql が挿入し始めるあらゆるテーブルの索引に荷を積むようであることをわかった。普通起こった何がそう、あらゆる簡単な問い合わせ取ったおよそ1-2 秒をあった5-10 列のテーブルに。それ以上の分析で私達はことが簡単な問い合わせの直前に、起こった"負荷データinfile" 分った。これはinnodb のためのバッファ・サイズおよびMyISAM が2 つの構成であるので私達がMyISAM のタイプに未加工テーブルを変えたときに消えた。
構成可能変数についてはここに見なさい。
先端: 次の選択から始まりあなたのmysql を始めなさい-- 丸太間違いはこれ間違い記録を可能にする
より速く... より速くWeb クライエント
ユーザ・インタフェースはあらゆるプロダクトへキー、ページの特に感知された速度であるより重要である! ここに便利入って来かもしれないlearnings 及び解決のリストはある:
* あなたのデータが3-5 分発言のために変わらない筈だあなたの顧客側面のページを貯蔵することはよい
* あなたのページに感知された固着を与えるIframe(s)for の内部グラフ等を使用しであつて下さい。使用をジヤバ・スクリプトによって基づかせている満足なローディングのメカニズムまだよくしなさい。これは同じページで発言3+ グラフを有するときあなたがしたいと思うかもしれない何かである。
* Internet Explorer は内容すべてがサーバーから届くときだけ全ページを表示する。そう満足なローディングのためにiframes かジヤバ・スクリプトを使用することは勧められる。
* 決してCSS の使用multiple/duplicate 記入項目はHTML ページでファイルしない。Internet Explorer は別の記入項目として各CSS ファイルに荷を積みがちで、完全なページで適用する!
Bottomline はあなたの問い合わせおよびスキーマシステムをより遅くさせる! それらを最初に固定し、次にデータベースを責任にしなさい!
また見なさい
* 高性能Mysql
* 問い合わせの性能
* 問い合わせを説明しなさい
* 最大限に活用する問い合わせ
* InnoDB の調整
* 調整のMysql
部門: 防火壁の検光子 | 性能はこのページをだった最終変更18:00 、2005 年8 月31 日ひっくり返す。
- Ramesh-
記事のソース: Messaggiamo.Com
Related:
» Seo Elite: New Seo Software!
» AntiSpywareBOT
» Reverse Mobile
» Error Nuker
ウェブマスター向けのHTMLコードを取得
この記事を追加してお客様のウェブサイトを今しなさい!
ウェブマスター向けの記事を送信してください
登録の必要なし!フォームに記入してください Messaggiamo.Com 記事は、ディレクトリ!