• 検索結果がありません。

Agenda SPARC Enterprise T シリーズのご紹介 Java Concurrency Utilities のご紹介 Java SE 7 新機能のご紹介 まとめ 2

N/A
N/A
Protected

Academic year: 2021

シェア "Agenda SPARC Enterprise T シリーズのご紹介 Java Concurrency Utilities のご紹介 Java SE 7 新機能のご紹介 まとめ 2"

Copied!
32
0
0

読み込み中.... (全文を見る)

全文

(1)

SPARC Enterprise T-シリーズで

実力を発揮する

Javaコンカレンシーユーティ リティ

1

サン・マイクロシステムズ株式会社

Java エバンジェリスト

寺田 佳央

http://blogs.sun.com/yosshi

(2)

Agenda

SPARC Enterprise T シリーズのご紹介

Java Concurrency Utilities のご紹介

Java SE 7 新機能のご紹介

(3)

3

Copyright © 2009 Sun Microsystems K.K.

SPARC Enterprise

T シリーズのご紹介

(4)

Sun Fire T シリーズ

業界最高レベルのスループット性能をより少ない電力で

Sun SPARC Enterprise

T5140/T5240

2008 年 4 月

Sun Fire T1000/T2000

Sun SPARC Enterprise

T1000/T2000

2005 年 12 月

32

Sun SPARC

Enterprise

T5120/T5220

2007 年 10 月

64

128

256

Sun

SPARC

Enterprise

T5440

2008 年 10 月

UltraSPARC T2

UltraSPARC T1

UltraSPARC T2

Plus

UltraSPARC T2

Plus

(5)

5

Copyright © 2009 Sun Microsystems K.K.

今日までの CPU のアプローチ

時間

遅延の向上

時間

C

CPU

M Memory

1スレッドの

処理の高速化

典型的なプロセッサの使用率は

わずか 15‒25%

サイクルの 85% がメモリ待ち時間

(6)

スレッドレベルでの並列化により CPU

リソースをフルに使い切ることが出来る

C

C

M

M

C

C

M

M

C

C

M

M

時間

遅延短縮

C

C

M

M

CPU

Memory

C

C

M

M

C

C

M

M

C

C

M

M

C

C

M

M

C

C

M

M

C

C

M

M

多重化された

スレッドの並列処理

シングルスレッド・プロセッサ

マルチスレッド・プロセッサ

アプローチの転換

- CMT( チップ・マルチ・スレッディング )

(7)

7

Copyright © 2009 Sun Microsystems K.K.

Core 1

Thread 4

Thread 3

Thread 2

Thread 1

Core 2

Thread 4

Thread 3

Thread 2

Thread 1

Core 3

Thread 4

Thread 3

Thread 2

Thread 1

Thread 4

Thread 3

Thread 2

Thread 1

Core 5

Thread 4

Thread 3

Thread 2

Thread 1

Core 6

Thread 4

Thread 3

Thread 2

Thread 1

Core 7

Thread 4

Thread 3

Thread 2

Thread 1

Core 8

Thread 4

Thread 3

Thread 2

Thread 1

CMT on Ultra SPARC T1 プロセッサ

Core 4

(8)

Sun SPARC Enterprise T5440

高さ: 4 RU

CPU

>

4 ソケット (UltraSPARC T2 Plus)

>

最大 32 コア (1.2GHz/1.4Ghz)

>

最大 256 スレッド

メモリ

>

64 FBDIMM slots

>

最大 256GB メモリ (4GB DIMM)

>

(8GB DIMM: 近日発表予定 )

内蔵ディスク

>

4 x2.5 SAS ディスク (RAID 0/1)

電源

>

4 x 電源ユニット (2+2 冗長化 )

8 x PCI-E スロット

>

2 スロットは XAUI 兼用

4 x オンボード GbE

>

1 x 10GbE / 3 x1GbE(XAUI 使用時 )

>

2 x 10GbE / 2 x1GbE(XAUI 使用時 )

4 x USB 2.0

最大 256 スレッド

最大 256GB メモリ (4GB DIMM)

仮想化テクノロジ LDoms 標準実装

仮想化テクノロジ Solaris Containers 標準実装

ミッドレンジ CMT サーバ

(9)

9

Copyright © 2009 Sun Microsystems K.K.

perfbar の実行結果

Sun Fire T5440 の CPU スレッド使用状況

マルチコア /CPU マルチスレッド環境

で CPU リソースを遊ばせてませんか?

(10)

1万 2万 3万 4万 5万 6万 7万 7万 9万 10

0

10

20

30

40

50

60

70

80

90

100

110

120

計算時間の比較

1スレッド 256 スレッド

処理オーダ

Σ=1+2+3+

・・・ n

k=1

n

256 スレッドで計算時間を大幅に短縮

CPU リソースを有効活用可能

Java コンカレンシー・ユーティリティの使用

Java コンカレンシー・ユーティリティを  

使用し全ての CPU スレッドを使い切った例

perfbar

の実行結果

(CPU

スレッドの使用状況 )

(11)

11

Copyright © 2009 Sun Microsystems K.K.

Java Concurrency

Utilities のご紹介

(12)

Java Concurrency Utilities とは

J2SE 1.4 までの並列処理の実装はとても難しかった

>

wait(),notify(),synchronized は機能としては十分

>

アプリケーションに低レベル API での実装を要求

>

正しい実装を記述することは難しい

>

間違った実装を行う事はかんたん

>

間違った実装でパフォーマンスに大きく影響

JSR-166 ができるまで

(13)

13

Copyright © 2009 Sun Microsystems K.K.

Java Concurrency Utilities とは

並列処理の実装をかんたんに

>

Collections フレームワークと同様に並列処理実装の簡略化

>

幅広く再利用可能な並列処理用の API を提供

>

スケーラビリティ、パフォーマンス、メインテナンス性、可読

性の向上、スレッド・セーフ

JSR-166 の目標

(14)

Java Concurrency Utilities とは

• Executors, Thread Pool, Futures

Concurrent Collections: Queues, Blocking

Queues,Concurrent HashMap

Lock,Conditions

Synchronizers:Semaphores,Barriers,etc

Atomic Variables

他の拡張

>

ナノ秒

利用可能なクラスと拡張

(15)

15

Copyright © 2009 Sun Microsystems K.K.

Executor インタフェース

非同期呼び出しの標準化

2種類の実装モデルをサポート

>

手続き型: Runnables

>

関数型: Callables

>

ライフサイクル管理、キャンセル、停止等のサポート

Executors (ファクトリ)クラスによる Executor の生成

非同期処理用のフレームワーク

(16)

Executor と ExecutorService

ExecutorService は Execuor にライフサイクル管理機能を追加

public interface

Executor

{

void execute(Runnable command);

}

public interface

ExecutorService

extends Executor

{

void shutdown();

List<Runnable> shutdownNow();

boolean isShutdown();

boolean isTerminated();

boolean awaitTermination(long timeout,TimeUnit

unit);

(17)

17

Copyright © 2009 Sun Microsystems K.K.

Executors による Executor の生成

Executors のファクトリメソッド

Executors.newCachedThreadPool()

>

必要に応じて新規スレッドを生成、再利用可能なスレッドプールの

生成

Executors.newFixedThreadPool(int nThreads)

>

固定数のスレッドを再利用するスレッドプールを生成

Executors.newScheduledThreadPool(int corePoolSize)

>

スケジュールに応じたタスク実行が可能なスレッドプールの生成

Executors.newSingleThreadExecutor()

>

単一スレッドで動作する Executor を生成

(18)

//使用可能なプロセッサ数を取得

int threadsNum =

Runtime.getRuntime().availableProcessors();

//CPU数分のスレッドプールを生成。

ExecutorService pool =

Executors.newFixedThreadPool(threadsNum);

マルチコアシステムの有効活用

CPU 数を取得してスレッド数を決定

本番環境においては、他への影響も考慮し

CPU リソースを完全に使い切ることは

推奨しないが、システムを有効活用するため

リソース管理できることが重要!!

(19)

19

Copyright © 2009 Sun Microsystems K.K.

class MyWebServer{

public static void main(String argv[]){

ServerSocket socket = new ServerSocket(80);

while(true){

final Socket conn = socket.accept();

Runnable r = new Runnable(){

publiv void run(){

addConnQueue(conn);//接続キューへ追加

}

};

new Thread(r).start();

}

}

}

実装例:マルチスレッド Web Server

コンカレンシー・ユーティリティを使用しない場合

リクエスト毎にスレッドを生成 

( 無制限にスレッドを生成 )

(20)

リクエスト毎にスレッド生成する場合の問題

潜在的なオーバヘッド

>

複数のスレッド起動によるシステム全体に対するオーバヘッド

(スタック確保によるメモリ消費など)

>

コンテキストスイッチが多数発生、スレッドスケジューリング

に関するオーバヘッドの発生

Thread-1

Thread-2

Thread-3

Thread-4

Thread-n

スレッド毎に

-Xss で指定した

スタックサイズを消費

10 万人が接続してきた場合、 10 万スレッドを生成

同時大量アクセスが発生した場合はシステムに影響

(21)

21

Copyright © 2009 Sun Microsystems K.K.

class MyWebServer{

Executor pool = Executors.newFixedThreadPool(256);

public static void main(String argv[]){

ServerSocket socket = new ServerSocket(80);

while(true){

final Socket conn = socket.accept();

Runnable r = new Runnable(){

public void run(){

addConnQueue(conn);//接続キューへ追加

}

};

pool.execute(r);

}

}

}

実装例:マルチスレッド Web Server

コンカレンシー・ユーティリティを使用した場合

スレッドの生成数を管理可能

スレッドの再利用

(22)

処理結果の取得

手続き型の呼び出し

>

従来のスレッド実装では void 型の run() を実装するため処理

結果の取得は別途仕組みを検討しなければならなかった

コンカレンシー・ユーティリティを使用しない場合

Runnable r = new Runnable(){

public void run(){

//何らかの計算;

}

}

外部で処理結果保存用フィールドを用意?

wait(),notify(),synchronizedを利用?

各スレッドの処理結果を取得するのは困難

(23)

23

Copyright © 2009 Sun Microsystems K.K.

関数型の呼び出しが可能

>

Callables

>

結果を取得し例外をスロー可能なタスク

>

run() の変わりに call() を実装

>

start() の変わりに submit(),invokeAny(),invokeAll() で

call() を実行

>

Future

>

get() よりタスクの実行結果の取得が可能

コンカレンシー・ユーティリティを使用した場合

処理結果の取得

Callables と Future を使用し各スレッドにおける

処理結果の取得が容易に

(24)

class MyTask

implements Callable<Long>

{

private int number;

public MyTask(int number) {

        this.number = number;

}

@Override

  public Long call() throws Exception {

long sum = 0;

    for (long i = 1; i < number; i++) {

       sum += i;

}

    return new Long(sum);

}

}

Callables の実装例

(25)

25

Copyright © 2009 Sun Microsystems K.K.

class FutureSample{

Executor service = Executors.newFixedThreadPool(8);

public static void main(String argv[]){

List<MyTask> jobs = new ArrayList<MyTask>();//タスクの用意

    for (int i = 1; i <= 1000000; i++)

     jobs.add(new MyTask(i));//コレクションに実行タスクの追加

try {

//タスクの一斉実行

List<Future<Long>> answers = service.invokeAll(jobs);

for (Future<Long> future : answers)

       System.out.println(

future.get()

);

//タスクの実行結果を表示

} catch (Exception e) {

     e.printStackTrace();

    } finally {

service.shutdown();//スレッドの解放

}

  }

}

Future の実装例

スレッドの計算結果を

future.get() で取得

(26)
(27)

27

Copyright © 2009 Sun Microsystems K.K.

UNIXのfork(), join()と同様の考え

大量の計算が必要な場合、処理を分割し、分割された中で個別に

計算し最後に結果を集計するような場合に有効(再帰計算等)

>

例:マージソート

>

ソート対象の大量のデータを分割

>

分割したデータ内でソートを実施

>

ソートされたデータとデータをマージ

>

計算量は O(n log n) で変わらないが分割したデータ内でのソートを別

スレッドで計算する事で高速化

>

分割単位が少なくなると逐次処理に切り替え計算を実施

分割ー結合

Fork-Join 機能の追加

(28)

マージソートの実装例

Fork-Join を使用しない逐次処理の場合

class MergeSort{

public in[] sort(int[] all){

if (all.length == 1) {

return all;

} else {

int[] left = new int[all.length/2];

System.arraycopy(all,0,left,0,left.length];

int[] right = new int[all.length – left.length];

System.arraycopy(all,left.length,right,0,right.length);

left = sort(left);

right = sort(right);

merge(left,right,all);

return all;

}

}

}

左右の再帰計算を別スレッドで

処理できないか?

(29)

29

Copyright © 2009 Sun Microsystems K.K.

マージソートの実装例

Fork-Join を使用した場合

public class MergeSort{

public int[] sort(int[] all){

int threads = Runtime.getRuntime().availableProcessors();

ForkJoinExecutor pool = newForkJoinPool(threads);

SortImpl sort = new SortImpl(all);

pool.invoke(sort);

return sort.result;

}

private class SortImpl

extends RecursiveAction

{

private int[] all;

private int[] result;

SortImpl(int all){

this.all = all;

}

次ページへ続く

...

ForkJoin プールの作成と

コンカレントスレッドで実行

RecursiveAction:

返り値のない再帰処理向け

RecursiveTask:

返り値が存在する再帰処理向け

(30)

マージソートの実装例

Fork-Join を使用した場合

protected void compute(){

if ((all.length < 10 )) {

result = sequentialSort(all);

}

else {

int[] left = new int[all.length/2];

System.arraycopy(all,0,left,0,left.length);

int[] right = new int[all.length – left.length];

System.arraycopy(all,left.length,right,0,right.length);

SortImpl task1 = new SortImp(left);

SortImpl task2 = new SortImp(right);

invokeAll(task1,task2);

left = task1.result;

right = task2.result;

merge(left,right,all);

result = all;

}

}

スレッド利用の有無の閾値

指定したタスクを Fork して実行

getException() で例外も取得可能

(31)

31

Copyright © 2009 Sun Microsystems K.K.

Sun Fire TシリーズはCPUマルチスレッドを実現し、ハイパ

フォーマンスな製品

マルチコア・CPUマルチスレッドのCPUを有効活用するには

Javaコンカレンシー・ユーティリティがパフォーマンス向上に最

Javaコンカレンシー・ユーティリティで並列処理がかんたんに

Java SE 7 でコンカレンシー・ユーティリティがさらに進化

プラットフォーム(JRuby,Jythonなど)としてのJavaも活躍

まとめ

(32)

SPARC Enterprise T-シリーズで

実力を発揮する

Javaコンカレンシーユーティ リティ

サン・マイクロシステムズ株式会社

Java エバンジェリスト

寺田 佳央

http://blogs.sun.com/yosshi

参照

関連したドキュメント

[r]

企業名 株式会社HAL GREEN 代表者 代表取締役 中島 英利 本社所在地 恵庭市戸磯193番地6 設立 令和2年4月20日 資本金 83,000千円.

直流抵抗 温度上昇 PART

In this diagram, there are the following objects: myFrame of the Frame class, myVal of the Validator class, factory of the VerifierFactory class, out of the PrintStream class,

本資料は Linux サーバー OS 向けプログラム「 ESET Server Security for Linux V8.1 」の機能を紹介した資料です。.. ・ESET File Security

INA新建築研究所( ●● ) : 御紹介にあずかりましたINA新建築研究所、 ●●

「新老人運動」 の趣旨を韓国に紹介し, 日本の 「新老人 の会」 会員と, 韓国の高齢者が協力して活動を進めるこ とは, 日韓両国民の友好親善に寄与するところがきわめ

   がんを体験した人が、京都で共に息し、意 気を持ち、粋(庶民の生活から生まれた美