Everything I Ever Learned About JVM Performance Tuning at Twitter
https://oracleus.wingateweb.com/published/oracleus2011/sessions/37941/S37941_2408980.pdf
Twitterの中の人がパフォーマンスチューニングについて語るセッション。
スケーリング? いや、エクストリームです。
きっと凄いスケーリングの話をするのかと思ったら、
全くの真逆で超細かい、エクストリームな話でした。
たとえば「メモリを使いすぎない」ようにするための説明では、
Objectをnewするだけで64bitマシンなら128bit (16byte) 消費する、という話に始まり
ポインタ、オブジェクトヘッダ、配列ヘッダ、継承クラスで消費するメモリ(4byteとか24byte)の
説明が続きます。
intとIntegerのメモリ使用量ってそんなに考えてます?
極めつけは、Scala 2.7.7を例にして
Seq[Int]はIntegerで値を保持するから、24 + (32 * 要素数) というバイト数になるけど
Array[Int]はintで値を保持するから、24 + (4 * 要素数) というバイト数で済むんだ、
そしてScala 2.8ではこれが治ったんだ、という話。
正直、私はこのレベルでメモリ使用量を意識したことはなく、
どちらかと言えば、可読性やnull許容等を考えて、intかIntegerを使い分けていました。
世の中、パフォーマンスを上げるためには、あまりきちんとチューニングせずに
ハードウェアのスケールアップ、スケールアウトで片付けてしまう事が多いと思います。
一方でTwitter社のエンジニアが、ここまでエクストリームなチューニングを行い、
少しでもハードウェアのコストを下げるよう(1%下げれば数千台、数万台のハードウェアを減らせる?)
努めている、それができている、という所に、Twitter社の技術力の高さを垣間見た気がします。
Compactness * Throunghput * Responsiveness = a
また、このセッションの後半にあった
「パフォーマンスのトライアングル」という説明もなかなか興味深かったですね。
この論理では、
「メモリ消費量の削減」と「スループット」と「応答速度」を掛け算した値は一定であり、
どこに重きを置くかを調整するのが「チューニング」で、
掛け算した値自体を大きくするのが「最適化」だと説明されていました。
この資料は読んどけ!
ちなみにこの後も、
GCチューニングについて、いくつかの状況ごとの、取るべき対策などを具体的に説明したり
同期処理の最適化について説明したりと、
かなり「具体的」な説明の多いセッションでした。
なんかこの資料を読むだけでも、一回、勉強会を開けそうな感じですね?
パフォーマンスに興味のある方は、ぜひ資料をダウンロードしてみてください。
有用っぽいので、もう一度URLを貼っておきますね。
https://oracleus.wingateweb.com/published/oracleus2011/sessions/37941/S37941_2408980.pdf
@yusukey ありがとう!
ちなみに、このセッションが終わった後、Twitter本社に行ってランチを頂きました。
@yusukey ありがとう!!