私の時代遅れの特徴として、RDP や Citrix と同等に動作する Java サービスをリモート UI の効率化によってサポートしました。 このサービスは、相互接続された Java オブジェクトで構成されるセッションに依存していました。これらのセッションは、ユーザーがログアウトしたとき、または所定のタイムアウト時間が経過した後にクリーンアップされることを前提としていました。
私たちの能力計画の方向性の長さ、私はあなたと共有したい深刻な思い出の残骸に出くわしました.
能力計画
次年度の能力計画を組み込んだグループでの私の日常業務のフェーズ。 使用率の指標を調べ、パターンを強化し、母集団を比較することで、レコードデータ サイエンティストは、今後 1 年以内にレコードデータを取得するために何人の顧客からデータを取得できるかを予測する準備ができていました
。 . この予想されるユーザーの不親切さを強化するために必要な重要なインフラストラクチャを見つけるために、高度なシステムを採用しました:
何台の サーバー
を保持するために、次の年に所有することを希望しています。
私たちの能力計画セッションの 1 つが、私たちのサービスの効果的な評判の結果として、今後 1 年以内に顧客の解決策を大幅に強化する準備ができていることを発表しました。 私たちの計算では、この高いクイズに対応するには、アクセスできるよりも多くのサーバーが必要になることが示されました。 その結果、私たちは、より多くの顧客を各特定の個人サーバーに適合させて、予測されるユーザーを非友好的に強化することを主張するという自己規律に直面していました. 私たちは何を確信していますか?
機能サイズで、意図のボトルネックを特定できます。この場合、それは回想です。 より多くの顧客がサーバーに追加されると、負荷が高くなると意図が弱まり始めます。 私たちは 回想 – 確かな
であると考えています。サーバー.ユーザーごとの回想消費の演習:
[text{Per User Memory}={ text{Server Memory} over text{User Capacity} }]
虚数を使用すると、感心する何かをうなり声を上げることができます:
[text{Per User Memory}=text{300MB}={ text{90 GB} over text{300} }]
したがって、ユーザーごとの思い出の要件を 300MB と見積もることができます。
サーバーの Java reminiscence ダンプの調査を開始して、一見改善が必要な領域にタイトルを付けました。 起動時にダンプを手動で確認しましたが、サーバーの問題が完全に解決された結果、戦略を自動化するためのパーソナライズされたスクリプトを開発しました。 このスクリプトを使用して、特定のセッションに起因する思い出を失うオブジェクトにタイトルを付ける準備ができていました. これらの障害を特定することにより、難破を効果的に回避し、意図の回想の利用を最適化することができます.今、私は回想予言が私たちに与えてくれた特定のきびきびとした解決策に焦点を合わせようとしています. 私たちは、何千もの memdumps を調べて、ひどく山のようなオブジェクトを購入することから始めました。 理想のクジラが 1.5GB の文字列になりました。 それは何かがこれを賞賛すると考えました:
画像でメッセージが表示されなかった場合、文字列に多数のバックスラッシュが含まれています。 同じような小さいのが出てきたのですが、これが理想の形になりました
ひもがどうしてこうなったのか調べてみると、これに感心するクラスがあったようです。 :
class カモフラージュ迷彩を表示
{
//... 非公開 迷彩迷彩
時代遅れ; 公共 弦 toJson
()
{
JSONObject jo
=オリジナル JSONObject
(); //... もしも
( 時代遅れ
!=ヌル) {
じょ.
場所( 「時代遅れ」
,
時代遅れ
.toJson ());
} //... 戻る じょ。
toString
();
} } クラス セッション { //... 弦 currentScreen; 公共 void setUrl(
カモフラージュを表示 ) s
)
{
currentScreen=
s
.toJson (); }
}
class カモフラージュ迷彩を表示
{
//... 非公開 迷彩迷彩
時代遅れ; 公共 弦 toJson
{
()
JSONObject jo
=オリジナル JSONObject
(); //... もしも
( 時代遅れ
!=ヌル) {
じょ.
場所(
「時代遅れ」
,
時代遅れ
.toJson ());
} //... 戻る じょ
();
toString 。
} } クラス セッション { //... 弦 currentScreen; 公共 void
setUrl
(
カモフラージュを表示 ) s
)
{
currentScreen=
s
.toJson (); }
}
}したがって、各ショー迷彩には、ユーザーがアクセスした古いショー迷彩があり、ユーザーが「友達になり」、以前にあったカテゴリ別のショー迷彩を収集できるようにします (教える、スクロール スペース、検証通知など)。 ユーザーセッションには、基本的にユーザーがいる最新のショーカモフラージュが追加されているため、ユーザーが既存のセッションに再接続すると、元の場所に戻ることができます.
ここには 2 つの問題があります:
jo.place("古い", 古い.toJson());、JSON 辞書を文字列に変換しています。 JSON フィールドには引用符があり、これらの引用符は文字列に保持するときにエスケープされることを好むため、
” として保持されます。 . この文字列が別の文字列の内部に保持されている場合、そのバックスラッシュをエスケープする必要があります。 \”. これをさらに数ラウンドして、収集します \\\\\\\"明らかに、多数のディスプレイを表示するセッションを持つユーザーが currentScreen
山岳プロポーションの文字列
)
取り扱いとフォローアップ
実際のシナリオを簡単な修理と長時間の修理に分けました:
簡単な修理は、特定の文字を超えた場合に「古い」文字列を切り捨てることに変わりました。数量 (例: 100MB を超えないようにします). ここではもはや全体的な解像度ではなく、ユーザーの専門知識に影響を与える可能性がありますが、実行するのが非常に迅速で確認が簡単になり、信頼性が向上しました (苦労して
長時間の修理は、「時代遅れ」のスタック解像度を完全に書き換え、本物の本物のスタックを整理することになりました。自己課された寸法制限とレポート。 書くのに本当に長い時間がかかり、確認してゆっくりと解放するのに時間がかかりましたが、記憶の難破を避け、記憶の別の構成要素(非常に深いJSONオブジェクトなど)としてクジラの糸を簡単に覆い隠しました.
エピローグ
私たちは、回想ダンプの予言ツールを実行するために忍耐強く、私たちが殺したより多くのナンセンスに出くわしましたが、これほど簡単なものはありません.
この物語からの私の最も重要なポイントつまり、通常、プログラムがソースをどのように使用しているかの詳細を確認すること (たとえば、記憶の総使用率を実際に測定するのではなく、memdump を調査すること) が成功の鍵であり、起動時から素早い勝利をもたらします.
𝚆𝚊𝚝𝚌𝚑 𝙽𝙾𝚆 📺