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



2011/11/14
末永 恭正          ( @YaSuenag )
自己紹介
    すえなが   やすまさ

 末永 恭正(@YaSuenag)
 NTT OSSセンタ勤務
    ◦ Javaの障害解析、Q&A対応
       合言葉は「Javaいい子だから!」
       hs_errログやコアの解析
       Javaとlibc、Linuxカーネルの間を行ったり来たり…
    ◦ たま~にOpenJDKのパッチ書いてます
   根っからのサンデープログラマー
    ◦ Object Pascal (Delphi) 大好き
    ◦ CとJavaも好き
    ◦ アセンブラも結構好き
   JavaOne歴:2年(2010 & 2011)
JavaOneで感じたこと
   求められるスキルの2極化 (EE vs SE)
    ◦ EE
      とりあえず「クラウド」
      とにかく「ポータビリティ」!
      EoD
対
    ◦ SE
極       とりあえず「並列化」
        マルチリンガル?なVMの実現
        VMの作りや動きを意識
        究極を目指すなら、マシンを意識した領域へ…


今回の注目ポイント!
まずは事例から…
みんなどうしてる?Tuning
   Twitterの場合




時間切れ
みんなどうしてる?Tuning
   Twitterの場合




            !!!




                  java.lang.Integer (32bit)
みんなどうしてる?Tuning
     Twitterの場合
      ◦ GCのチューニングをきめ細かく実施
      ◦ GCコストを下げるため、VM内部のC++オブジェクト表現
        (oop)まで意識
        クラスの継承関係やフィールドの型・数から、実際の消費メモリ
         量を見積もり



メモリ負荷を考え抜いたチューニング
みんなどうしてる?Tuning
   Goldman Sachsの場合
みんなどうしてる?Tuning
   Goldman Sachsの場合
    ◦ hsdisを使ったディスアセンブル
     http://wikis.sun.com/display/HotSpotInternals/PrintAssembly




スカラ演算…
みんなどうしてる?Tuning
   Goldman Sachsの場合
    ◦ ハードウェア関連情報のチェック
      キャッシュのミスヒット(CPUキャッシュ・TLBなど)
      etc…
みんなどうしてる?Tuning
   Goldman Sachsの場合
    ◦ Large Page
みんなどうしてる?Tuning
    Goldman Sachsの場合
     ◦ OSやハードウェアまで含む最適化
     ◦ JVMのハードウェア最適化を信頼しながらも、さらなる
       ファインチューニング
       メモリアクセス
       命令コード



「ナノ秒レベル」のチューニング
※GC以外

ななめ45°下から
チューニングポイントを
覗き見る
その1: Superword
 単純なベクトル化
 SSE / AVX命令を有効活用できるはず
    ◦ プロセッサの本領発揮!
   JDK7 RIにもUseSuperWordが存在するが、ベクトル化
    の実装のみ
その1: Superword




      ①64bit転送→256bit転送

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


         ③ jj++ → jj +=4
その1: Superword
その2: Compressed String
 文字列内部表現をbyte配列で扱う
 SSE4の文字列処理系命令が使用される
 Java7のString switchで効果絶大!?
 OpenJDKには実装がありません…
その3: 細かいオプション
   OptimizeFill
    ◦ java.util.Arrays.fill()のような、単純な配列書き
      込みループをVMの最適化済みメソッドの置換する
    ◦ JDK7 RIではSSE命令(MOVDQUなど)を使ったメモリ転
      送命令に置換される
    ◦ サポートされるプリミティブ型のビット幅は32bitまで
             /**
              * 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;
             }



   UseFPUForSpilling
    ◦ スタックメモリアクセスで浮動小数レジスタ(SSEの場合
      はXMMレジスタ)を積極的に活用
    ◦ GPRを使い切るような、ローカル変数が多数登場する場合
      に効果が見込める
その3: 細かいオプション
その4: ガリガリ書く!!
   ”Write Once, Run Anywhere” に敢えて逆行してみる
低レベル好きエンジニアなら誰もが(?)気になる

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




    2010        2011
永遠の?テーマ:C vs Java
   内容:結構一般的な話
    ◦ 最適化手法
      C++の静的 VS Javaの動的
      実際に動きながらプロファイルできるのがJavaの強み
    ◦ メモリ管理
      mallocって、鬼速いわけではない(特にマルチスレッド環境)
      UseNUMA / UseCompressedOops / UseLargePagesでパフォーマ
       ンスを上げられるかも
    ◦ 同時並行性
      C++はpthreadやboostでマルチスレッドが実現できるが、使うのが
       なかなか大変
      Javaはカンタン
        java.util.concurrent
        Fork/Join
        バイアスロックで排他制御周りの性能向上まで見込める
永遠の?テーマ:C vs Java
   で、どっちがいい?



        !!!
永遠の?テーマ:C vs Java
     評価軸
      ◦ パフォーマンス
      ◦ スケーラビリティ
      ◦ etc…
     ビジネス要素
      ◦ TCO
      ◦ ROI
      ◦ etc…
     保守
      ◦ アプリケーションの想定使用期限まで、技術的にサポート
        が可能か?

関係者全員で合意をとりましょう!
           ~決めるのはアナタです~
Thank You!!
今回使わせていただいた資料
   Everything I Ever Learned About JVM Performance Tuning at Twitter
    https://oracleus.wingateweb.com/published/oracleus2011/sessions/37941/S37941_2408980.p
    df
   Every Last Nanosecond: Tuning the JVM for Extreme Low Latency
    https://oracleus.wingateweb.com/published/oracleus2011/sessions/20262/20262_Cho144249.
    pdf
   From Java Code to Java Heap: Understanding the Memory Usage of Your
    Application
    https://oracleus.wingateweb.com/published/oracleus2011/sessions/24001/S24001_138281.pd
    f
   Attack on Scaling: Methods and Tools for Eradicating Performance Bottlenecks
    https://oracleus.wingateweb.com/published/oracleus2011/sessions/20580/20580_Cho156823.
    pdf
   Blazing JVM Performance: Trends Fueled by the Latest Hardware and JVM
    Optimizations
    https://oracleus.wingateweb.com/published/oracleus2011/sessions/18540/S18540_2625060.p
    df
   Java or C++: Practical Advice You Can Use
    https://oracleus.wingateweb.com/published/oracleus2011/sessions/24029/S24029_239397.pd
    f

ななめ45°から見たJavaOne

  • 1.
  • 2.
    自己紹介 すえなが やすまさ  末永 恭正(@YaSuenag)  NTT OSSセンタ勤務 ◦ Javaの障害解析、Q&A対応  合言葉は「Javaいい子だから!」  hs_errログやコアの解析  Javaとlibc、Linuxカーネルの間を行ったり来たり… ◦ たま~にOpenJDKのパッチ書いてます  根っからのサンデープログラマー ◦ Object Pascal (Delphi) 大好き ◦ CとJavaも好き ◦ アセンブラも結構好き  JavaOne歴:2年(2010 & 2011)
  • 3.
    JavaOneで感じたこと  求められるスキルの2極化 (EE vs SE) ◦ EE  とりあえず「クラウド」  とにかく「ポータビリティ」!  EoD 対 ◦ SE 極  とりあえず「並列化」  マルチリンガル?なVMの実現  VMの作りや動きを意識  究極を目指すなら、マシンを意識した領域へ… 今回の注目ポイント!
  • 4.
  • 5.
    みんなどうしてる?Tuning  Twitterの場合 時間切れ
  • 7.
    みんなどうしてる?Tuning  Twitterの場合 !!! java.lang.Integer (32bit)
  • 8.
    みんなどうしてる?Tuning  Twitterの場合 ◦ GCのチューニングをきめ細かく実施 ◦ GCコストを下げるため、VM内部のC++オブジェクト表現 (oop)まで意識  クラスの継承関係やフィールドの型・数から、実際の消費メモリ 量を見積もり メモリ負荷を考え抜いたチューニング
  • 9.
  • 10.
    みんなどうしてる?Tuning  Goldman Sachsの場合 ◦ hsdisを使ったディスアセンブル http://wikis.sun.com/display/HotSpotInternals/PrintAssembly スカラ演算…
  • 11.
    みんなどうしてる?Tuning  Goldman Sachsの場合 ◦ ハードウェア関連情報のチェック  キャッシュのミスヒット(CPUキャッシュ・TLBなど)  etc…
  • 12.
    みんなどうしてる?Tuning  Goldman Sachsの場合 ◦ Large Page
  • 13.
    みんなどうしてる?Tuning  Goldman Sachsの場合 ◦ OSやハードウェアまで含む最適化 ◦ JVMのハードウェア最適化を信頼しながらも、さらなる ファインチューニング  メモリアクセス  命令コード 「ナノ秒レベル」のチューニング
  • 14.
  • 15.
    その1: Superword  単純なベクトル化 SSE / AVX命令を有効活用できるはず ◦ プロセッサの本領発揮!  JDK7 RIにもUseSuperWordが存在するが、ベクトル化 の実装のみ
  • 16.
    その1: Superword ①64bit転送→256bit転送 ②スカラ演算→パックド演算 ③ jj++ → jj +=4
  • 17.
  • 18.
    その2: Compressed String 文字列内部表現をbyte配列で扱う  SSE4の文字列処理系命令が使用される  Java7のString switchで効果絶大!?  OpenJDKには実装がありません…
  • 19.
    その3: 細かいオプション  OptimizeFill ◦ java.util.Arrays.fill()のような、単純な配列書き 込みループをVMの最適化済みメソッドの置換する ◦ JDK7 RIではSSE命令(MOVDQUなど)を使ったメモリ転 送命令に置換される ◦ サポートされるプリミティブ型のビット幅は32bitまで /** * 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; }  UseFPUForSpilling ◦ スタックメモリアクセスで浮動小数レジスタ(SSEの場合 はXMMレジスタ)を積極的に活用 ◦ GPRを使い切るような、ローカル変数が多数登場する場合 に効果が見込める
  • 20.
  • 21.
    その4: ガリガリ書く!!  ”Write Once, Run Anywhere” に敢えて逆行してみる
  • 22.
  • 23.
    永遠の?テーマ:C vs Java  去年もあったテーマ 2010 2011
  • 24.
    永遠の?テーマ:C vs Java  内容:結構一般的な話 ◦ 最適化手法  C++の静的 VS Javaの動的  実際に動きながらプロファイルできるのがJavaの強み ◦ メモリ管理  mallocって、鬼速いわけではない(特にマルチスレッド環境)  UseNUMA / UseCompressedOops / UseLargePagesでパフォーマ ンスを上げられるかも ◦ 同時並行性  C++はpthreadやboostでマルチスレッドが実現できるが、使うのが なかなか大変  Javaはカンタン  java.util.concurrent  Fork/Join  バイアスロックで排他制御周りの性能向上まで見込める
  • 25.
    永遠の?テーマ:C vs Java  で、どっちがいい? !!!
  • 26.
    永遠の?テーマ:C vs Java  評価軸 ◦ パフォーマンス ◦ スケーラビリティ ◦ etc…  ビジネス要素 ◦ TCO ◦ ROI ◦ etc…  保守 ◦ アプリケーションの想定使用期限まで、技術的にサポート が可能か? 関係者全員で合意をとりましょう! ~決めるのはアナタです~
  • 27.
  • 28.
    今回使わせていただいた資料  Everything I Ever Learned About JVM Performance Tuning at Twitter https://oracleus.wingateweb.com/published/oracleus2011/sessions/37941/S37941_2408980.p df  Every Last Nanosecond: Tuning the JVM for Extreme Low Latency https://oracleus.wingateweb.com/published/oracleus2011/sessions/20262/20262_Cho144249. pdf  From Java Code to Java Heap: Understanding the Memory Usage of Your Application https://oracleus.wingateweb.com/published/oracleus2011/sessions/24001/S24001_138281.pd f  Attack on Scaling: Methods and Tools for Eradicating Performance Bottlenecks https://oracleus.wingateweb.com/published/oracleus2011/sessions/20580/20580_Cho156823. pdf  Blazing JVM Performance: Trends Fueled by the Latest Hardware and JVM Optimizations https://oracleus.wingateweb.com/published/oracleus2011/sessions/18540/S18540_2625060.p df  Java or C++: Practical Advice You Can Use https://oracleus.wingateweb.com/published/oracleus2011/sessions/24029/S24029_239397.pd f