Schrieb ein schnelles Java-Programm, um 10 Threads mit jeder Priorität zu erzeugen und pi (4 * atan (1) -Methode) mit jeweils 500.000 BigDecimals zu berechnen, bei jedem Thread beizutreten und die abgelaufene Zeit für die run-Methode zu melden. Ja, wahrscheinlich nicht das beste Beispiel, aber es einfach zu halten.Implementieren Linux JVMs tatsächlich Thread-Prioritäten?
Ich bin mir dessen bewusst Bug4813310
Es ist nicht trivial in C zu tun, aber wir können davon ausgehen, dass einheimische Prioritäten nie auf Linux JVMs gesetzt werden?
$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
Sieht aus wie nicht viel von einer Abweichung, die man erwarten würde! Das war auf einer kleinen virtuellen Linux-Maschine. Vielleicht nur Suns? Wir werden versuchen, IBM J9 VM:
1:4091
2:4142
3:3957
4:3905
5:3984
6:3985
7:4130
8:4055
9:3752
10:4071
Die Bruttozahlen im Vergleich ziemlich gut, aber es gibt keine Skala auf die Zahlen aus einer Thread-Priorität Perspektive.
der 500k Iterationen auf einem 2.6-Kernel mit einer älteren Sun JVM, ein Lassen Sie versuchen, die ständig mit Last ist selten unter 7 geladen wird:
$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
Lassen Sie uns versuchen IBM J9 auf einer realen Platte nur mit 2.6-Kernel und Seit einem größeren System werde ich Iterationen auf 2.000.000 erhöhen.
Einige großartige Zeiten, aber immer noch keine offensichtlichen Thread/Prozess Prioritäten.
Versuchen wir eine Windows-Box. Ich weiß, dass Windows ein ziemlich aggressives Thread-Prioritätsschema hat. Alles über normal anecdotaly verbraucht viel mehr. Lassen Sie uns als nächstes zu 900.000 Iterationen in jedem Thread übergehen:
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
Sehr, was wir suchen, nein?
Also Linux JVM's haben anscheinend keine Thread-Priorität? Ich verstehe, dass Sie nicht wirklich auf ein niedrigeres nettes Niveau in C zurückkehren können, aber ich würde annehmen, dass die JVM-Ingenieure herausgefunden hätten, wie man einen Dispatcher mit niedrigen Zahlen hält.
Ich dachte das auch. Die Umstellung auf root mit UseThreadPriorities hat nichts bewirkt. jedoch als Wurzel und '-XX: ThreadPriorityPolicy = 1' yeilds: 1: 3809 2: 3587 3: 3679 4: 3223 5: 2796 6: 2686 7: 2233 8: 1895 9: 1759 10: 2311 Sieht gut aus :) – Xailor
geben -XX: ThreadPriorityPolicy Wert = 0 und = 1 werden Sie auch lassen heben ein Gewinde PRIO – Schildmeijer