JJUG CCC 2017 Springメモ【CD4 Unified JVM Logging: Java 9 から変わる JVM ログ】
JJUG CCC 2017 Springに参加した。
表題のセッションに参加したので、参加メモを書いておく。
またJava9のea版を使って自由研究という名の動作確認もしてみた。
※正確な情報・見解は後日公開される(であろう)登壇者のスライドや公式資料等を参照のこと。
JJUG CCC 2017 Spring
■Call for Papers
https://jjug-cfp.cfapps.pez.pivotal.io/submissions/48f28c8d-8c73-4460-906c-4e0c980ae891
■動作確認環境
java version "9-ea"
Java(TM) SE Runtime Environment (build 9-ea+170)
Java HotSpot(TM) 64-Bit Server VM (build 9-ea+170, mixed mode)
【概要】
Java 9 から JEP 271: Unified GC Logging により、従来の GC ログが廃止され、新たな JVM logging framework (JEP 158: Unified JVM Logging) と統合して生まれ変わります。
本セッションではこれまでのロギングと比べて、どのようにフォーマットやオプション指定方法などが異なるのか、そしてどう対処していくべきかについて可能な限り紹介していきます。
本セッションでは java.utl.logging については扱いません。JVM そのもののロギングについて扱います。
※事前に上級者向けとアナウンスされていたが、分量的に中級者向けの内容へ変更?となったらしい
■JEP 271
JEP 271: Unified GC Logging
【内容】
1.なぜ変わるのか
・歴史的経緯によりアドホックに改善されてきた。
その結果、コンポーネントごとに個別実装がなされてきた。
→マイナーバージョンによってログのフォーマットが変わることもあり、
発表者の方(NTTでJavaのサポートやってる人)でも全て把握しきれない
・設定が多種多様
→レベル・カテゴリ管理ができない(※デバッグ用のバイナリはあるが自前でビルドが必要)
→パーサを書くのも大変(マイナーバージョンによってフォーマットが変わる件もあり)
→使われないからドキュメントも作られない
2.-Xlog
・Java9より「-Xlog」で統一される。
-Xlog[<what>][:[<output>][:[<decorators>][:<output-options>]]]
※仕様はJEP158を参照。
■JEP 158
http://openjdk.java.net/jeps/158
what…対象=レベル (例:gc=trace)
output…対象=出力先 (例:file=gctrace.txt)
decorators…フォーマット (例:uptimemillis,pids)
output-options…オプション(※現在はローテーションの指定のみ) (例:filecount=5,filesize=1024)
(1)what
・「*」「+」といった識別子が使える
→組み合わせることで細かな出力指定ができるようになるが、(JVMログにおける)ワイルドカードの使い方が一般的な考え方と異なっているので注意が必要。
・フォーマット自体も大きく変わる
→全てのGC方式に対して共通的なフォーマットとなる予定。
(2)output
・デフォルトは標準出力
・JVMログとjavaコマンドの応答は別扱い。
→JVMログをoffの設定にしてもjavaコマンドとしての応答結果は出力される。
(3)decolator
・一般的なwebアプリのオススメは「t,l,tg」※うろ覚え
→time,level,tags
→短命なプロセス(バッチアプリ等)は「uptime(millis|nanos)」もつけたほうが良い
■出力例:-Xmx512MBで起動してFULL GC発生したとき(※ParallelOldGC)
【指定オプション】-Xlog:all:file=gc%p.txt:t,l,tg
[2017-05-21T17:18:48.766+0900][info][gc,start ] GC(32) Pause Full (Ergonomics) [2017-05-21T17:18:48.766+0900][info][gc,phases,start ] GC(32) Marking Phase [2017-05-21T17:18:49.294+0900][info][gc,phases ] GC(32) Marking Phase 527.637ms [2017-05-21T17:18:49.294+0900][info][gc,phases,start ] GC(32) Summary Phase [2017-05-21T17:18:49.294+0900][info][gc,phases ] GC(32) Summary Phase 0.044ms [2017-05-21T17:18:49.294+0900][info][gc,phases,start ] GC(32) Adjust Roots [2017-05-21T17:18:49.295+0900][info][gc,phases ] GC(32) Adjust Roots 0.596ms [2017-05-21T17:18:49.295+0900][info][gc,phases,start ] GC(32) Compaction Phase [2017-05-21T17:18:49.473+0900][info][gc,phases ] GC(32) Compaction Phase 178.576ms [2017-05-21T17:18:49.473+0900][info][gc,phases,start ] GC(32) Post Compact [2017-05-21T17:18:49.475+0900][info][gc,phases ] GC(32) Post Compact 1.979ms [2017-05-21T17:18:49.479+0900][info][gc,heap ] GC(32) PSYoungGen: 131583K->131583K(153088K) [2017-05-21T17:18:49.479+0900][info][gc,heap ] GC(32) ParOldGen: 349393K->349393K(349696K) [2017-05-21T17:18:49.479+0900][info][gc,metaspace ] GC(32) Metaspace: 4186K->4186K(1056768K) [2017-05-21T17:18:49.479+0900][info][gc ] GC(32) Pause Full (Ergonomics) 469M->469M(491M) 713.021ms [2017-05-21T17:18:49.479+0900][info][gc,cpu ] GC(32) User=2.31s Sys=0.00s Real=0.71s [2017-05-21T17:18:49.480+0900][info][safepoint ] Total time for which application threads were stopped: 0.7133178 seconds, Stopping threads took: 0.0000177 seconds [2017-05-21T17:18:49.480+0900][info][safepoint ] Application time: 0.0000583 seconds [2017-05-21T17:18:49.480+0900][info][safepoint,cleanup ] deflating idle monitors, 0.0000023 secs [2017-05-21T17:18:49.480+0900][info][safepoint,cleanup ] updating inline caches, 0.0000005 secs [2017-05-21T17:18:49.480+0900][info][safepoint,cleanup ] compilation policy safepoint handler, 0.0000005 secs [2017-05-21T17:18:49.480+0900][info][safepoint,cleanup ] mark nmethods, 0.0000112 secs [2017-05-21T17:18:49.480+0900][info][safepoint,cleanup ] purging class loader data graph, 0.0000000 secs
■出力例:-Xmx512MBで起動してFULL GC発生したとき(※CMS GC)
【指定オプション】-Xlog:all:file=gc%p.txt:t,uptimemillis,l,tg
[2017-05-21T16:22:16.645+0900][847ms][info][gc ] GC(9) Concurrent Cycle [2017-05-21T16:22:16.645+0900][847ms][info][gc,marking ] GC(9) Concurrent Clear Claimed Marks [2017-05-21T16:22:16.645+0900][847ms][info][gc,marking ] GC(9) Concurrent Clear Claimed Marks 0.034ms [2017-05-21T16:22:16.645+0900][847ms][info][gc,marking ] GC(9) Concurrent Scan Root Regions [2017-05-21T16:22:16.652+0900][854ms][info][gc,marking ] GC(9) Concurrent Scan Root Regions 6.629ms [2017-05-21T16:22:16.652+0900][854ms][info][gc,marking ] GC(9) Concurrent Mark (0.854s) [2017-05-21T16:22:16.652+0900][854ms][info][gc,marking ] GC(9) Concurrent Mark From Roots [2017-05-21T16:22:16.652+0900][854ms][info][gc,task ] GC(9) Using 1 workers of 1 for marking [2017-05-21T16:22:16.696+0900][898ms][info][safepoint ] Application time: 0.0508277 seconds [2017-05-21T16:22:16.696+0900][898ms][info][safepoint,cleanup ] deflating idle monitors, 0.0000019 secs [2017-05-21T16:22:16.696+0900][898ms][info][safepoint,cleanup ] updating inline caches, 0.0000009 secs [2017-05-21T16:22:16.696+0900][898ms][info][safepoint,cleanup ] compilation policy safepoint handler, 0.0000005 secs [2017-05-21T16:22:16.696+0900][898ms][info][safepoint,cleanup ] mark nmethods, 0.0000089 secs [2017-05-21T16:22:16.696+0900][898ms][info][safepoint,cleanup ] purging class loader data graph, 0.0000000 secs [2017-05-21T16:22:18.713+0900][2915ms][info][gc,marking ] GC(9) Concurrent Mark From Roots 2061.666ms [2017-05-21T16:22:18.714+0900][2916ms][info][gc,marking ] GC(9) Concurrent Mark Abort [2017-05-21T16:22:18.714+0900][2916ms][info][gc ] GC(9) Concurrent Cycle 2068.537ms
(4)output,output-option
・Java9よりjcmd経由でログを強制ローテートできるようになったので「filecount」は1以上を指定するべき。
・「filesize」はデフォルトで20MBなので、大抵のwebアプリの場合は増やすべき。
(5)tags
GC系…gc
エラー系…exceptions
スレッド系…os, thread
動作解析…class, vmoperation
3.そのほか
・STW(Stop The World)時間が出力されるようになった。
→今まではフォーマットによって計算が必要だったり出力されていなかったりした。
・OOME(Out Of Memory Error)起こした時の例外(exceptions)ログは下記
→実際はArrayListにHashMapを突っ込みまくってOOME起こしているが、そこまでは追えなさそうな印象
■出力例:-Xmx512MBで起動してOOME発生したとき(※CMS GC)
指定オプション:-Xlog:all:file=gc%p.txt:utc,l,tg
[2017-05-21T07:02:41.618+0000][info][exceptions ] Exception <a 'java/lang/OutOfMemoryError'{0x00000000e1ba0958}> (0x00000000e1ba0958) [2017-05-21T07:02:41.618+0000][info][exceptions ] Exception <a 'java/lang/OutOfMemoryError'{0x00000000e1ba0958}: Java heap space> [2017-05-21T07:02:41.618+0000][info][exceptions ] 1 [Exception (): a 'java/lang/OutOfMemoryError'{0x00000000e1ba0958} in {method} {0x0000022753c07b88} 'putVal' '(ILjava/lang/Object;Ljava/lang/Object;ZZ)Ljava/lang/Object;' in 'java/util/HashMap' at 0x00000227483fb160] [2017-05-21T07:02:41.618+0000][info][exceptions ] 2 [Exception (): a 'java/lang/OutOfMemoryError'{0x00000000e1ba0958} in {method} {0x0000022753ec0468} 'main' '([Ljava/lang/String;)V' in 'hoge/fuga/OOME' at 0x00000227483ffe88]
Rakuten Technology Conference 2016参加メモ
Rakuten Technology Conference 2016に参加した。
会場が楽天クリムゾンハウスで、全セッションが英語での開催とのことだったので割を気合いをいれて会場に行ったが、受付の外国人のお兄さん(エンジニア?)が「受付はこちらでーす」と日本語で呼び込みをしていたので、心配は杞憂だった。
受付に限らず、参加者に対する案内は英語と日本語の両方でなされていたので、会場で過ごすこと自体に支障はなかった。
肝心のセッション内容については下記に参加メモを書く。*1
※正確な情報・見解は後日公開される(であろう)登壇者のスライドや公式資料を参照してください。
またYouTubeに各講演の動画がアップされているので、そちらも併せて参照してください。
■Managing Creativity
Shuzo John Shiota
President and CEO, Polygon Pictures Inc.
Rakuten Technology Conference 2016: Managing Creativity
・Polygon Pictures Inc.のCEOによる講演。
・『シドニアの騎士』のテレビシリーズの制作を通じて、「Managing Creativity」を解説していた。
www.knightsofsidonia.com
・モーションキャプチャの収録や3Dモデリングの様子を収めた動画を多用されていたので、非常に見ていて楽しかった。
・アニメーションの製作は細かな工程に分かれており、非常にたくさんの人が担当している。
→178名、12か国のメンバーをマネージメントする必要があった。
・製作現場ではスクラムボードを使って、各個人の作業進捗がわかるようにしていた。
・Motivation Management等、動機付け?に関するお話もしていた。
■Rakuten, Inc. Keynote Speech
Yasufumi Hirai
Group Executive Vice President, CIO & CISO, Rakuten, Inc.
Rakuten Technology Conference 2016: Rakuten, Inc. Keynote Speech
※写っているのは前に講演したTerje Marthinussen氏
・基調講演。
・楽天グループが提供するサービスと、サービスから生み出されるデータを利用した、IoTやブロックチェーンといった分野のサービスを提供し、「Best Customer Experience」を提供します、というような内容だった。
・エンジニアの構成比を紹介していた。
→48%がアプリケーションエンジニア。女性エンジニアが22%を占める、などのデータを示していた。
・楽天におけるAIの導入ステップとして、下記の3つのフェーズを経て導入しているとのこと。
「Routine(ルーチンワークの置き換え)」→「Desicion(意思決定支援)」→「Collabolation(コラボレーション)」
・『TIPPING POINT』という本に感銘を受けたとのこと。
The Tipping Point: How Little Things Can Make a Big Difference
- 作者: Malcolm Gladwell
- 出版社/メーカー: Back Bay Books
- 発売日: 2002/01/07
- メディア: ペーパーバック
- 購入: 1人 クリック: 31回
- この商品を含むブログ (11件) を見る
■Huge Enterprise Systems Architecture Design with Java EE
Hirofumi Iwasaki
Group Manager, Rakuten Card Co.,Ltd.
Rakuten Technology Conference 2016: Huge Enterprise Systems Architecture Des...
・JavaEEでエンタープライズ向けのシステムを「今」作るとしたらどのような技術要素を選択すればよいか、という内容の講演。
・JavaEEとは~JavaEEの歴史は~というJavaに関わってない人にも向けた講演内容だった。*2
・StrutsからJSFへの、FrontEnd側の実装にパラダイムシフトが起こった、と解説されていたスライドが個人的には非常にわかりやすかった。
→Strutsだと1viewに複数Actionが紐づけられるので実装が複雑になるが、JSFだとそのような作り方をしない、等
・IDEはNetBeans使ってます、とのことだった。
■Creating a team of DevOps “Super Sentai”
Damien Caro
Tsuyoshi Ushio
Rakuten Technology Conference 2016: Creating a team of DevOps “Super Sentai”
・牛尾さんの「DevOps!!」というコールから始まった。
・牛尾さんの話はなく、牛尾さんの上司であるDamien Caro氏によるMicrosoft社内でのDevOps話がメインだった。
→「日本にいれば私の話はいつでも聞けるでしょ」的なことを仰っていた気がする
・Microsoft社内の社風が変わりつつあるという話で、ハッカソンを定期的に開催している話をされていた。
→顧客も巻き込んで実施しているとのこと。
■感想
・英語で聞いて英語で理解する訓練が必要だと感じさせられた。
→発表中ならまだ単語を認識することができたが、QAやLT中の"普通"の速度で話されると全く聞き取れなかった。
・参加したセッションによるが、全体的に技術の話がメイン、というよりはサービス運営やサービスの活用といった話がメインだった。
・日本人の参加者も多かったが、日本語を話してるとなんとなくダサいと感じる雰囲気があったので、英語勉強しようという気にさせられた。
一億人の英文法 ――すべての日本人に贈る「話すため」の英文法(東進ブックス)
- 作者: 大西泰斗,ポール・マクベイ
- 出版社/メーカー: ナガセ
- 発売日: 2011/09/09
- メディア: 単行本
- 購入: 12人 クリック: 68回
- この商品を含むブログ (49件) を見る
Developers Summit 2016 Summerメモ【[A-3]共創と競争から生まれる新たなエコシステム】
Developers Summit 2016 Summerに参加した。
下記セッションに参加したので、参加メモを書いておく。
※正確な情報・見解は後日公開される(であろう)登壇者のスライドや公式資料等を参照のこと。
■Developers Summit 2016 Summer
Developers Summit 2016 Summer [Enterprise] #devsumi
[A-3]共創と競争から生まれる新たなエコシステム
小笠原 治 (さくらインターネット)
Developers Summit 2016 Summer [Enterprise] #devsumi
【概要】
「さくらのIoT Platform α」のパートナーの取組みの紹介
【内容】
1.スマートロックに関する取組み
・賃貸物件の引っ越し時の際、一般的には12000円位支払って鍵交換をしている。
スマートロックは月額500円位で運用することができ、鍵交換の際は電子データの書き換えで対応することができる。
これにより、鍵交換をめぐるビジネスをサービス化することができる。
【参考】
ASCII.jp:賃貸で月額課金型スマートロック!さくらインターネットとシステムソフトが賃貸住宅向けホームIoTの合弁会社設立
2.IoT Matrix
・世間でいうところの「IoT」を2つの区分に分けていた。
「狭義のIoT」:工業の効率化。受益者が「企業」。
「広義のIoT」:人々の生活に新たな価値を与える。受益者が「消費者」。
・『IoT Matrix』とは、縦軸が「Internet」「Devise」「Things」、横軸が「Input」「Logic」「Output」のIoTのサービス特性を分析するマトリクス。
広義のIoTを目指すサービスを提供するベンチャー企業は「Input」の「Internet」「Devise」の部分が弱い傾向がある。
さくらのIoTはその部分をカバーするのが狙い。
・何をセンシングして、何をフィードバックし、何を提供するか、を考えることが重要。
3.水田ソリューションに関する取組み
・水田から取得したデータを農家から有料で買い取り、企業に売る。さくらは情報のとりまとめを行う。
・実証実験はさくらインターネット研究所が行い、その後事業化した。
4.人選(採用)の基準について
・ロボットに関わったことのある人、を基準にしている。
色んな人と協力して物事を進めること、がわかっている人が多いため。学生ならアルバイトでもいいから雇う。
・ハード屋とソフト屋が共創するには、それぞれが普段使っているプラットフォームで開発できるようにする必要がある。
5.IoTのセキュリティ
・閉塞域でNW構築する必要があり、非常に面倒。
→NWの全てをさくらが提供する。
6.天草Xアスロン
・パラグライダーのリアルタイムでの位置情報把握を行うプロジェクトの話
・パラグライダーという競技自体がかなりハードな競技だったので、サービスの要求水準が高かった。
・電波法
・本番1か月前に、基地局は空をとんではいけないという決まりがあることを知った。
・そのためハードウェアとソフトウェアの大幅な見直しを行う必要があった。
・プロジェクトに参画していたハードウェアメーカーと協力して対応することができた。(納期1ヵ月)
・パラグライダーという競技を、「鑑賞できるスポーツ」に変えることができた。
・今後の目標:今回開発したモジュールをパラグライダー競技の標準装備にする。
【天草Xアスロン2016 公式サイト】
kuratakepara.info
OCJP Gold SE8へアップグレードした
Upgrade Java SE 7 to Java SE 8 OCP Programmer(1Z0-810)に合格した。
OCJP Gold SE7から同SE8への移行試験だったので、純粋なOCJP Gold SE8の試験(1Z0-809)とは内容が異なる。
点数は66点だった。(※合格点は65点)前回のSE7試験の時と同様に、超ギリギリだった。
なので今回も感想文もとい反省文を書く。
【試験】
Upgrade Java SE 7 to Java SE 8 OCP Programmer | Oracle Certification Exam
移行試験は公式*1でも言われている通り、ラムダまつりだった。
試験の8~9割はラムダ式とStreamAPIで占められており、たまにDate and Time APIが出現する問題構成だった。
【勉強方法】
1Z0-809試験に対応する英語の参考書は存在するが、1Z0-810試験に対応した参考書が日本語英語ともに存在しないという状態だった。(2016/5月時点)
1Z0-809用の参考書も検討したが、ラムダ式・StreamAPIの分量が少なく、また内容も基礎的な部分のみ試験対象とされていたので、参考書は使用せずWeb上の情報を中心に勉強を進めた。
【使用した教材 Web】
1.Exam 1Z0-810: Upgrade Java SE 7 to Java SE 8 OCP Programmer Study Guide
java.boot.by
初めは記述内容が合っているか不安だったが、記述内容は正確だった。*2
1Z0-810試験の試験項目に合わせた章立てとなっている。
各単元ごとに参照先のページが示されていたので、そこから一次情報を追うことができた。Oracle Tutorialからの引用が多かった印象。
docs.oracle.com
出典のページが最後にまとめられていたのが便利だった。
Bibliography
勉強手順としては、読む→サンプルコード写経→和訳してブログに書く という手順を繰り返した。
途中で和訳がしんどくなったので、読む→サンプルコード写経→大事そうな部分をメモる という手順に変えたが、効果はあったと感じている。
特にCollectionの辺りは他の方のブログやサイトのコードも写経した。
Javaラムダ式メモ(Hishidama's Java8 Lambda Expression Memo)
2.MyExamCloud
1Z0-810 OCPJP 8 Upgrade Practice Mock Exam 1 MyExamCloud online exam
IT系資格の模擬試験を提供するサイト。
「Time Offer(50% Discount)」などと書かれており、非常にうさんくさい。しかし無料の模擬試験を受けたところ、割といい感じと思えたので、「1Z0-810 OCPJP 8 Upgrade Practice Mock Exam 1~5」 を購入した。*3
難易度的には本番より少し易しめ~同程度だが、試験的中率はそこまで高くなかった印象*4。ただ、試験問題の雰囲気をつかむことはできる。
3.その他よく参照した資料
Java 8:ラムダ式、パート1
Java Magazineのラムダ式解説。ラムダ式の必要性の部分から解説されている。
Java7→Java8アップグレードに成功・・・ - M12i.
先人の合格記。
必修! Date and Time API──Java SE 8の新日時APIの基本を学ぶ - builder by ZDNet Japan
Date and Time APIの基礎
Java SE 8のストリームAPIの正しい使い方──ラムダ式とともに導入された新APIで、並列処理の実装はどう変わるのか? - builder by ZDNet Japan
Parallel Stream周り
StreamAPIのおさらい - java.util.stream.Stream - ITお絵かき修行
StreamAPIの各メソッドを覚えるのに使用した。
4.受ける前に見ておきたかった資料
自分の受験後に見つけた、Oracle Universityより公開された資料。
http://www.oracle.co.jp/jdt2016/pdf/HO-1.pdf
Java Day Tokyo 2016での試験対策セッション資料。非常にわかりやすく、練習問題も本番の感じに近い。
Oracle Certified Java Programmer, Gold SE 8 認定資格移行試験(1Z0-810)対 策ポイント解説セミナー(1) - YouTube
Oracle Certified Java Programmer, Gold SE 8 認定資格移行試験(1Z0-810)対 策ポイント解説セミナー(2) - YouTube
1Z0-810試験対策セミナー動画。これで睡眠学習ができる。
【使用した教材 書籍】
1.『現場で使える[最新]Java SE 7/8 速攻入門』
- 作者: 櫻庭祐一
- 出版社/メーカー: 技術評論社
- 発売日: 2015/11/19
- メディア: 大型本
- この商品を含むブログ (1件) を見る
英語の情報をあたっているときに意味不明な箇所が出てきたら辞書的に引く、という使い方をした。この1冊を覚えるだけでも十分かもしれない。
Date and Time APIについては、日本語書籍の中では一番詳しく解説されていると思う。ただしアメリカの夏時間の取り扱いなど、微妙に触れきれていない部分もあるので、Web上の情報も併用して試験対策にあたった方が良いと思われる。
【試験の感想】
・Map、List、Collectionクラスに追加された新規メソッドはどれ?や正しい使い方はどれ?といった問題に苦戦した。
・内部クラス、無名内部クラス系の変数のスコープ問題にも苦戦した。
・StreamとIntStream、LongStreamなどのプリミティブなデータ型を使うStreamとの違い、はそもそもほとんど覚えられていなかった。
・Instant、Period、Durationはネット上でも積極的に取り上げている人が少なく、APIの利用方法を問われると弱かった。(さらにLocalDate、LocalDateTimeの違いや夏時間の計算、各種定数クラスを絡められたので非常にとてもつらかった)
【総括】
・非常にしんどかった。1回目の受験で合格できたが、落ちてたら挫折していたと思う。。
・全体的に間違いが多かったので、集合に対する操作にはラムダ式を意識してソースを書くよう心掛ける。
→試験のおかげで、関数に対する心理的な障壁はかなり無くなった、と感じている。
AWS Summit Tokyo 2016メモ【The State of The Art - AWS / EC2 Networking (同時通訳)】
AWS Summit Tokyo 2016に参加した。
下記セッションに参加したので、参加メモを書いておく。
※正確な情報・見解は後日公開される(であろう)登壇者のスライドや公式資料等を参照のこと。
www.awssummit.tokyo
The State of The Art - AWS / EC2 Networking (同時通訳)]
Kevin Miller (Director, Software Development, EC2 Networking, Amazon Web Services, Inc.)
【概要】
EC2における、LinuxカーネルレベルでのTCPネットワークパラメータチューニングの話。
AWS,EC2に拘った内容というよりは、Linux全般でのTCPチューニングの話だった。
とにかく話が早くあっという間に終わった。
【内容】
①TCPの性能
・TCPはSSH、HTTP等のベースプロトコルであり、送信側と受信側それぞれが互いに接続しあう。
・TCPの特徴として、異なる大きさの送信/受信ウィンドウを持つ。
・輻輳制御ウィンドウ:送信側が制御する。輻輳制御アルゴリズムで制御する。
・パケットの損失(パケットロス)がスループットに与える影響について触れていた。
TCPの統計値取得 :netstat -s | grep retransit
ソケットレベルの診断:ss -ite
・パケットの再送状況をリアルタイムに取得できるコマンドがgithub上にあるとのこと。詳しくは下記を参照。
github.com
・Linuxの輻輳制御アルゴリズム
1.BIC (Linux2.6.6~2.6.18)
2.CUBIC(Linux2.6.19以降)
→TCP Renoに代わるアルゴリズム。
・再送タイマー
パケットロスした、とみなす時間の設定。
短すぎると:過剰反応してしまい、パフォーマンスが落ちる。
長すぎると:パケットロスの検知が遅れ、パフォーマンスが落ちる。
デフォルトは200ミリ秒。
・ip route list
AWSの場合、サブネット内の他のインスタンスへルーティングしている場合があるので、そこの再送時間の設定を変える。(例えば10ミリ秒にする等)
・ネットワークパスのチューニング
パス上のルータにネットワークバッファがある。
→NWへの負荷が高まると、再送が多くなり、結果としてタイムアウトを引き起こす原因となる。
・ネットワークバッファのアクティブキュー管理
→tc qdisc list
・fq_codel
→チューニングが不要な、qdiscのアルゴリズム。
・EC2拡張NW機能
EC2で提供するAmazonLinux,Windows(WindowsServer?)に組み込まれたドライバにて利用することができる。詳しくは下記を参照。
www.youtube.com
・MTU
Maximum Transmission Unit (MTU)は、ネットワークにおいて1回の転送(1フレーム)で送信できるデータの最大値を示す伝送単位のこと。
Maximum Transmission Unit - Wikipedia
多くのドライバは1500バイトを設定することができる。しかし上記の「EC2拡張NW機能」のドライバを使うと9000バイトまで設定することができる。よってオーバヘッドを減らすことができる。
→MTUの設定値は「ip route list」から確認することができる。
②応用
実際に上記で取り上げた要素を使って、測定を行った結果を紹介していた。
JavaDayTokyo2016メモ【3-E: Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか】
JavaDayTokyo2016に参加した。
下記セッションに参加したので、参加メモを書いておく。
www.oracle.co.jp
[3-E: Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか]
TIS株式会社
アプリケーション開発センター シニアエキスパート
川島 義隆 氏
【概要】
Java9で追加された新機能を使った設計・実装の紹介
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
【内容】
1.nullチェック
・Optionalクラスを使いましょう、という話。
・Optionalクラスの使い方としては、nullが発生しうる実装個所を包み込むように実装すべき。
→Javaの個々のAPIはnullチェックを意識した戻り値となっていないので、
Optionalを使ってAPI単位でのnullチェックを行うべき。
2.Mixin
mixin とはオブジェクト指向プログラミング言語において、サブクラスによって継承されることにより機能を提供し、単体で動作することを意図しないクラスである。
Mixin - Wikipedia
・Javaは多重継承が認められていない。そのため、ミドルウェアパターンの実装を行う場合は、ミドルウェアに対応するサブクラスを実装する。(例:ResultSet)
・Javaでミドルウェアパターンを実装するときは、事前に(※I/F側に)多くのメソッドを予め用意しておく場合が多い。
・Java8以降ではI/Fにデフォルトメソッドを持つことが可能となったので、共通的な実装をI/F側で持つことができるようになった。
→ただし状態を持つことはできないので、デフォルトメソッド内からI/Fの別メソッドを参照するような実装をしておき、実装クラス側からオブジェクトを渡すよう強制する、といった方法をとることができる。
・動的mixinの方法として、MethodHandleというクラスがJava7から追加された。
→ただし従来のリフレクションの10~100倍遅い。
3.システム挙動の動的な変更(using REPL)
・アプリケーションに管理用APIを用意するには、という話。
・enkanというFWでは疑似REPLが用意されており、REPLからMWの状態を変更することが可能。
→enkanではJShellを取り込む、とのこと。
4.Java9時代の無停止デプロイ
●従来
①LBでサーバごと切り替え
→問題点:サーバが2台ないし3台必要。
②APサーバ(コンテナ)で対応
→問題点:メモリリーク
●これから
JVMのプロセス単位で切り替え
・SO_REUSEPORT((Linux kernel 3.9~より利用可能。同じuidから利用可。Windowsでは不可)という仕組みを利用して、同一ポートに対してリッスンするプロセスを複数立ち上げる。
・SO_REUSEPORTの利用には、ServerSocketChannelクラスのメソッドを実装したAPサーバが必要。現状だとJettyくらいしか選択肢がない。
・falchion-containerというJVMプロセスをプールするコンテナを作られたそう。
→JMX・JStatで監視。
JavaDayTokyo2016メモ【2-A: Project Jigsawではじめるモジュール開発】
JavaDayTokyo2016に参加した。
下記セッションに参加したので、参加メモを書いておく。
※正確な情報・見解は後日公開される(であろう)登壇者のスライドや公式資料等を参照のこと。
www.oracle.co.jp
[2-A: Project Jigsawではじめるモジュール開発]
Java in the Box 櫻庭 祐一 氏
【概要】
Project Jigsawの導入背景、モジュールの作成方法・使用方法の紹介
【内容】
1.導入背景
(1)現状
・現在のJavaには「クラスパスが複雑」「rt.jarの肥大化」という2つの課題を抱えている。
・上記に関連し、「JAR HELL」と呼ばれるような.jarファイル間の依存関係の複雑さも発生している。
(2)(1)の原因
・クラスパス・JARのパッケージング機構における、
「依存関係」「バージョン」「公開範囲」をコントロールする仕組みが不足しているため。
・特にクラスのpublic属性のアクセス範囲が広すぎることが大きな原因とみられている。
→『public is TOO public』
(3)歴史
・2005年頃から提言はされていた。
・JSR277、JSR294といったJSRを経てProject Jigsawが発足し、Java9で採用。
2.モジュールの作成
・モジュールを作成する際の定義内容は以下の3要素。
Module extends JAR{ dependency …「依存関係」 export …「公開範囲」 version …「バージョン」 ※バージョンに対応する仕組みはまだない。今後どうなるか不明とのこと。 }
・モジュールはJARの拡張。JARと同じくクラスパスに追加しクラスを読み込ませることは可能。
・今までのpublicクラスは誰からでもアクセス可能だった。これからの(※モジュール内の)publicクラスは、公開範囲に対応するクラスからしかアクセスできなくなる。
→今後はmainメソッドを含むクラスを明示的に公開しないと、アプリが起動できなくなる。
・モジュールの定義内容は「modules-info.java」に記述する。「modules-info.java」は「src」フォルダ直下に置く。(※読み込み効率、複数ファイル対応etcの為)
例:modules-info.java
module fxdemo { requires javafx.controls; requires javafx.graphics; }
3.モジュールの使用
(1)コンパイル
・jarコマンドに「--create」などのオプションを付与して実行する。tarっぽいらしい。
(2)実行
・実行時はオプションを指定して実行する。
「モジュールのみ使用」「モジュールとクラスパス」といった使い方が可能。
例:実行コマンドの先頭部
java -mp mods -addmods ・・・
・mainメソッドの実行コマンドは「モジュール名/クラス名」となる。