2009-11-02 2 views
24

各優先順位で10個のスレッドを生成し、BigDecimalを50万回使用してpi(4 * atan(1)メソッド)を計算し、各スレッドで結合し、実行メソッドの経過時間を報告するクイックJavaプログラムを作成しました。ええ、prob'ly最良の例ではなく、それを基本的に保つ。LinuxのJVMは実際にスレッド優先順位を実装していますか?

私はBug4813310

の承知しているC言語で行うには非自明ですが、私たちはネイティブの優先順位はLinuxのJVMで設定されることはありませんと仮定することができますか?

$uname -r && grep bogomips /proc/cpuinfo 
2.4.33.3 
bogomips  : 4312.26 
$java -version 2>&1 |head -1 
Java version "1.6.0_01" 
$javac T.java && java -Xmx32m -XX:+UseThreadPriorities T 
1:3112 
2:2636 
3:2662 
4:3118 
5:2870 
6:3319 
7:3412 
8:3304 
9:3299 
10:3069 

逸脱はあまりありません。それは小さな仮想Linuxマシン上にあった。たぶんサンだけ?私たちはIBM J9 VMを試してみます:

1:4091 
2:4142 
3:3957 
4:3905 
5:3984 
6:3985 
7:4130 
8:4055 
9:3752 
10:4071 

グロスの数字はかなりよく見えますが、スレッド優先度の観点からは数字にはスケールがありません。

のは、常にまれ7の下方のロードアベレージがロードされている古い日JVM、1と2.6カーネル上で500K回の反復を試してみましょう:

$uname -r && grep bogomips /proc/cpuinfo 
2.6.9-67.ELsmp 
bogomips  : 3992.93 
bogomips  : 3990.00 
$java -version 2>&1 |head -1 
java version "1.4.2_14" 
$javac T.java && java -Xmx32m -XX:+UseThreadPriorities T 
1:63200 
2:64388 
3:62532 
4:58529 
5:62292 
6:64872 
7:64885 
8:64584 
9:61653 
10:61575 

がちょうど2.6カーネルで、実際のスラブ上のIBMのJ9を試してみましょうより大きいシステムなので、反復回数を200万に増やす予定です。

$uname -r && grep bogomips /proc/cpuinfo 
2.6.9-78.ELsmp 
bogomips  : 5989.03 
bogomips  : 5985.03 
bogomips  : 5985.01 
bogomips  : 5985.02 
bogomips  : 5984.99 
bogomips  : 5985.02 
bogomips  : 5984.99 
bogomips  : 5985.02 
$java -Xmx32m T # this is the IBM J9 
1:1718 
2:1569 
3:1989 
4:1897 
5:1839 
6:1688 
7:1634 
8:1552 
9:2027 
10:1522 

スレッドやプロセスの優先度はまだまだわかりませんが、

Windowsボックスを試してみましょう。私はWindowsがかなり積極的なスレッド優先順位スキームを持っていることを知っています。 以上のものは、通常の逸話ではるかに多く消費します。そのように、各スレッドで900,000回の繰り返しに移行しましょう:

C:\>java -version 
java version "1.6.0_11" 
C:\>java -Xmx32m T 
1:12578 
2:12625 
3:11469 
4:11453 
5:10781 
6:8937 
7:10516 
8:8406 
9:9953 
10:7391 

私たちが探しているものは何ですか?

Linux JVMのスレッド優先度はありません。私は、あなたがCのより低いレベルに本当に手を差し伸べることはできないと理解しますが、私はJVMエンジニアが低種別のディスパッチャーをどのように保つかを考えたと思います。

答えて

20

さて、the sourceを見てみましょう:

行2947:

//////////////////////////////////////////////////////////////////////////////// 
// thread priority support 

// Note: Normal Linux applications are run with SCHED_OTHER policy. SCHED_OTHER 
// only supports dynamic priority, static priority must be zero. For real-time 
// applications, Linux supports SCHED_RR which allows static priority (1-99). 
// However, for large multi-threaded applications, SCHED_RR is not only slower 
// than SCHED_OTHER, but also very unstable (my volano tests hang hard 4 out 
// of 5 runs - Sep 2005). 
// 
// The following code actually changes the niceness of kernel-thread/LWP. It 
// has an assumption that setpriority() only modifies one kernel-thread/LWP, 
// not the entire user process, and user level threads are 1:1 mapped to kernel 
// threads. It has always been the case, but could change in the future. For 
// this reason, the code should not be used as default (ThreadPriorityPolicy=0). 
// It is only used when ThreadPriorityPolicy=1 and requires root privilege. 

...

行2982:

static int prio_init() { 
    if (ThreadPriorityPolicy == 1) { 
    // Only root can raise thread priority. Don't allow ThreadPriorityPolicy=1 
    // if effective uid is not root. Perhaps, a more elegant way of doing 
    // this is to test CAP_SYS_NICE capability, but that will require libcap.so 
    if (geteuid() != 0) { 
     if (!FLAG_IS_DEFAULT(ThreadPriorityPolicy)) { 
     warning("-XX:ThreadPriorityPolicy requires root privilege on Linux"); 
     } 
     ThreadPriorityPolicy = 0; 
    } 
    } 
    return 0; 
} 

...

行2997:だから

OSReturn os::set_native_priority(Thread* thread, int newpri) { 
    if (!UseThreadPriorities || ThreadPriorityPolicy == 0) return OS_OK; 

    int ret = setpriority(PRIO_PROCESS, thread->osthread()->thread_id(), newpri); 
    return (ret == 0) ? OS_OK : OS_ERR; 
} 

!少なくともSun Javaでは、Linux上では、-XX:ThreadPriorityPolicyを実行し、rootを必要とする場合を除き、スレッドの優先順位は表示されません。

+4

私もそれを考えました。 UseThreadPrioritiesでルートに切り替えることは何の影響もありませんでした。 しかしながら、ルートと 'として-XX:ThreadPriorityPolicy = 1 'yeilds:3587 3:3679 4:3223 5:2796 6:2686 7:2233 8:1895 1:3809 9:1759 10:= 0 ThreadPriorityPolicy値をと= 1はまた、あなたが、これは '他のコードスニペットから意味することになっている何 – Xailor

+0

-XXを与える探している2311 SCHED_OTHER //動的優先度のみをサポートする ' – Schildmeijer

0

ここでは暗闇の中でちょうどいいですが、JVMのスレッドを優先させることなく、オペレーティングシステムのスレッドの優先度を調整する必要がありますか?

Linux(および任意のUnixライクなOS)は、プロセスにrootに優先度を与える機能を制限します。私はスレッドに同様の制限があると思います。

+0

本当に、自分自身を傷つけることができます。私はしかし、ディスパッチスレッド/プロセスは、10レベルUPWARDSどこに1つをreniceすることができると思います。たぶんeven(嫌なこと)には、JVMスレッドの優先順位を割り当てる別のルートデーモンがあります。 – Xailor

+0

Javaについてはわかりませんが、.NETでは管理対象スレッドはOSスレッドと同じではありません。つまり、CLRスケジューラはそれ自身でスレッドをスケジュールします。したがって、これはJVMでも可能です。 – OregonGhost

+0

CLRが緑色のスレッドを使用しているとは思わない。私は、スレッドスケジューリングがOSによって行われることはほぼ確実です。 – jassuncao

1

デフォルトのLinuxスレッドスケジューラポリシーSCHED_OTHERは優先順位をサポートしていません。 SCHED_FIFOとSCHED_RRは、より高いプライオリティをサポートしますが、スーパーユーザ権限を持つプロセスでのみ利用できます。

+0

PRIOスレッドを上げるようになる!:良い:) – Xailor

+0

SCHED_OTHERはnicenessのみをサポートします。これはヒントですスレッドとプロセスの優先順位付け方法に関するスケジューラ –

関連する問題