ななめ45°から見たJavaOne

28
ななな 45° なななな JavaOne なななななななななななななな ~~ なな なな @YaSuenag 2011/11/14

Transcript of ななめ45°から見たJavaOne

Page 1: ななめ45°から見たJavaOne

ななめ 45° から見た

JavaOne

~ネイティブな世界に注目して~

末永 恭正 ( @YaSuenag )2011/11/14

Page 2: ななめ45°から見たJavaOne

自己紹介 末永 恭正( @YaSuenag ) NTT OSS センタ勤務

◦ Java の障害解析、 Q&A 対応 合言葉は「 Java いい子だから!」 hs_err ログやコアの解析 Java と libc 、 Linux カーネルの間を行ったり来たり…

◦ たま~に OpenJDK のパッチ書いてます 根っからのサンデープログラマー

◦ Object Pascal (Delphi) 大好き◦ C と Java も好き◦ アセンブラも結構好き

JavaOne 歴: 2 年( 2010 & 2011 )

すえなが やすまさ

Page 3: ななめ45°から見たJavaOne

JavaOne で感じたこと 求められるスキルの 2 極化 (EE vs SE)

◦ EE とりあえず「クラウド」 とにかく「ポータビリティ」! EoD

◦ SE とりあえず「並列化」 マルチリンガル?な VM の実現 VM の作りや動きを意識 究極を目指すなら、マシンを意識した領域へ…

いきなりですが

今回の注目ポイント!

対極

Page 4: ななめ45°から見たJavaOne

まずは事例から…

Page 5: ななめ45°から見たJavaOne

みんなどうしてる? Tuning Twitter の場合

時間切れ

Page 6: ななめ45°から見たJavaOne
Page 7: ななめ45°から見たJavaOne

みんなどうしてる? Tuning Twitter の場合

!!!

java.lang.Integer (32bit)

Page 8: ななめ45°から見たJavaOne

みんなどうしてる? Tuning Twitter の場合

◦ GC のチューニングをきめ細かく実施◦ GC コストを下げるため、 VM 内部の C++ オブジェクト表現

( oop )まで意識 クラスの継承関係やフィールドの型・数から、実際の消費メモリ量を見積

もり

メモリ負荷を考え抜いたチューニング

Page 9: ななめ45°から見たJavaOne

みんなどうしてる? Tuning Goldman Sachs の場合

Page 10: ななめ45°から見たJavaOne

みんなどうしてる? Tuning Goldman Sachs の場合

◦ hsdis を使ったディスアセンブルhttp://wikis.sun.com/display/HotSpotInternals/PrintAssembly

スカラ演算…

Page 11: ななめ45°から見たJavaOne

みんなどうしてる? Tuning Goldman Sachs の場合

◦ ハードウェア関連情報のチェック キャッシュのミスヒット( CPU キャッシュ・ TLB など) etc…

Page 12: ななめ45°から見たJavaOne

みんなどうしてる? Tuning Goldman Sachs の場合

◦ Large Page

Page 13: ななめ45°から見たJavaOne

みんなどうしてる? Tuning Goldman Sachs の場合

◦ OS やハードウェアまで含む最適化◦ JVM のハードウェア最適化を信頼しながらも、さらなるファ

インチューニング メモリアクセス 命令コード

「ナノ秒レベル」のチューニング

Page 14: ななめ45°から見たJavaOne

ななめ 45°下からチューニングポイントを覗き見る

※GC 以外

Page 15: ななめ45°から見たJavaOne

その1 : Superword 単純なベクトル化 SSE / AVX 命令を有効活用できるはず

◦ プロセッサの本領発揮! JDK7 RI にも UseSuperWord が存在するが、ベクトル化の

実装のみ

Page 16: ななめ45°から見たJavaOne

その1 : Superword

①64bit 転送→ 256bit 転送

② スカラ演算→パックド演算

③ jj++ → jj +=4

Page 17: ななめ45°から見たJavaOne

その1 : Superword

Page 18: ななめ45°から見たJavaOne

その2 : Compressed String 文字列内部表現を byte 配列で扱う SSE4 の文字列処理系命令が使用される Java7 の String switch で効果絶大!? OpenJDK には実装がありません…

Page 19: ななめ45°から見たJavaOne

その3 : 細かいオプション OptimizeFill

◦ java.util.Arrays.fill()のような、単純な配列書き込みループを VM の最適化済みメソッドの置換する

◦ JDK7 RI では SSE 命令( MOVDQU など)を使ったメモリ転送命令に置換される

◦ サポートされるプリミティブ型のビット幅は 32bit まで

UseFPUForSpilling◦ スタックメモリアクセスで浮動小数レジスタ( SSE の場合は

XMM レジスタ)を積極的に活用◦ GPR を使い切るような、ローカル変数が多数登場する場合に

効果が見込める

/** * Assigns the specified int value to each element of the specified array * of ints. * * @param a the array to be filled * @param val the value to be stored in all elements of the array */ public static void fill(int[] a, int val) { for (int i = 0, len = a.length; i < len; i++) a[i] = val; }

Page 20: ななめ45°から見たJavaOne

その3 : 細かいオプション

Page 21: ななめ45°から見たJavaOne

その4 : ”Write Once, Run Anywhere” に敢えて逆行してみる

その4 : ガリガリ書く!!

Page 22: ななめ45°から見たJavaOne

C/C++ VS Java低レベル好きエンジニアなら誰もが(?)気になる

Page 23: ななめ45°から見たJavaOne

永遠の?テーマ: C vs Java 去年もあったテーマ

2010 2011

Page 24: ななめ45°から見たJavaOne

永遠の?テーマ: C vs Java 内容:結構一般的な話

◦ 最適化手法 C++ の静的 VS Java の動的 実際に動きながらプロファイルできるのが Java の強み

◦ メモリ管理 malloc って、鬼速いわけではない(特にマルチスレッド環境) UseNUMA / UseCompressedOops / UseLargePages でパフォー

マンスを上げられるかも◦ 同時並行性

C++ は pthread や boost でマルチスレッドが実現できるが、使うのがなかなか大変

Java はカンタン java.util.concurrent Fork/Join バイアスロックで排他制御周りの性能向上まで見込める

Page 25: ななめ45°から見たJavaOne

永遠の?テーマ: C vs Java で、どっちがいい?

!!!

Page 26: ななめ45°から見たJavaOne

永遠の?テーマ: C vs Java評価軸

◦ パフォーマンス◦ スケーラビリティ◦ etc…

ビジネス要素◦ TCO◦ ROI◦ etc…

保守◦ アプリケーションの想定使用期限まで、技術的にサポートが可能か?

関係者全員で合意をとりましょう!~決めるのはアナタです~

Page 27: ななめ45°から見たJavaOne

Thank You!!

Page 28: ななめ45°から見たJavaOne

今回使わせていただいた資料 Everything I Ever Learned About JVM Performance Tuning at Twitter

https://oracleus.wingateweb.com/published/oracleus2011/sessions/37941/S37941_2408980.pdf

Every Last Nanosecond: Tuning the JVM for Extreme Low Latencyhttps://oracleus.wingateweb.com/published/oracleus2011/sessions/20262/20262_Cho144249.pdf

From Java Code to Java Heap: Understanding the Memory Usage of Your Applicationhttps://oracleus.wingateweb.com/published/oracleus2011/sessions/24001/S24001_138281.pdf

Attack on Scaling: Methods and Tools for Eradicating Performance Bottleneckshttps://oracleus.wingateweb.com/published/oracleus2011/sessions/20580/20580_Cho156823.pdf

Blazing JVM Performance: Trends Fueled by the Latest Hardware and JVM Optimizationshttps://oracleus.wingateweb.com/published/oracleus2011/sessions/18540/S18540_2625060.pdf

Java or C++: Practical Advice You Can Usehttps://oracleus.wingateweb.com/published/oracleus2011/sessions/24029/S24029_239397.pdf