2016年12月19日月曜日

[メモ] 楽天受注API取込をチューニングしてみた 〜JAVAのメモリについて〜 2016/12/16

社内勉強会の為、作った資料のメモ

目次
1. 自己紹介
    昔は直接メモリ管理をしてた

2. 始まりの物語
    調査を始めた経緯について

3. ネクストエンジンの受注API取込とは?
    受注API取込の概要を説明
    楽天受注API取込の特徴について(PHP→JAVA)

4. 楽天受注API取込の調査
    jconsole紹介
    jconsoleで監視する為の下準備

5. JAVAのメモリとGCについて
    heap/Permanent, new/old, Eden/Suvivor領域説明
    Scavenge GC/Full GC説明

6. メモリチューニング
    パフォーマンスに有利に働くように各値の初期値は、各値の最大値と同じ大きさに設定し、 JVM がメモリを増加させる処理が発生することを極力に抑えるようにします。
    -Xms値 = -Xmx値
    -XX:PermSize = -XX:MaxPermSize

7. GCチューニング
    gcログ出力
    -verbose:gc:一般的な GC 情報を出力    
    -XX:+PrintGCDetails:New 領域、Old 領域の詳細情報を出力    
    -XX:+PrintGCDateStamps:GCの発生時刻を出力    
    -Xloggc:filename:GCの出力情報をファイル filename に保存

    jstatでメモリ領域ごとのGC状況を確認しよう
    jstat -出力オプション(-h[ヘッダーを出力する行間隔]) [プロセス番号] [出力間隔(ミリ秒)]

8. 結果

おまけ
    遠隔サーバーのプロセスをjconsoleで確認しよう
リモートで実行する場合、「JAVAプロセスをJMX(jconsole)で監視できるようにするよ〜」ということで、jmxremote設定が必要。
サーバー全体に適用するのであれば設定ファイルに書く、JAVA単体で確認するのであればJAVAオプションに追加する。
com.sun.management.jmxremote.port=[port番号]     :JMXをリモートで参照する際のアクセスポート
com.sun.management.jmxremote.ssl=[true/false]     :リモートアクセスの際、sslを有効にするか
com.sun.management.jmxremote.authenticate=[true/false]     :IP/PASSWORDを要求するか   

参考資料
    ここが大変だよ、JavaのGC/メモリ管理

    [Java][JavaFX]Javaプログラムを多数動かす場合のチューニング

    メモリリークについての誤解

    PHP GC

    一般教養としてのGarbage Collection

    JVMのチューニング

    jconsoleでTomcatサーバをモニタリングする

    踏み台経由のsshでsocks proxyをつくって、jmx接続して監視する話

    インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識

    SSH で Permission Denied となる傾向と対策