Escribí un rápido programa de Java para generar 10 hilos con cada prioridad y calculo el método pi (4 * atan (1)) con BigDecimals 500,000 veces cada uno, únete a cada hilo e informa el tiempo transcurrido para el método de ejecución. Sí, probablemente no sea el mejor ejemplo, pero mantenerlo básico.¿Las JVM de Linux realmente implementan las prioridades de subprocesos?
Soy consciente de Bug4813310
Es no trivial que hacer en C, pero podemos suponer que las prioridades de cacao nunca se fijan en las JVM Linux?
$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
Parece una desviación no muy esperada. Eso fue en una pequeña máquina virtual de Linux. Tal vez solo Sun's? Trataremos de IBM J9 VM:
1:4091
2:4142
3:3957
4:3905
5:3984
6:3985
7:4130
8:4055
9:3752
10:4071
Los números brutos se ven bastante bien en comparación, pero no existe una escala a los números desde una perspectiva prioridad hilo.
Probemos 500 k iteraciones en un kernel 2.6 con una mayor JVM de Sun, uno que está constantemente cargado con carga media rara vez por debajo de 7:
$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
Probemos J9 de IBM en una losa verdadera simplemente con el kernel 2.6 y dado que un sistema más grande aumentaré las iteraciones a 2,000,000.
$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
Algunos buenos momentos, pero todavía no aparentan determinar el hilo/las prioridades del proceso.
Probemos un cuadro de Windows. Sé que Windows tiene un esquema de prioridades de subprocesos bastante agresivo. Cualquier cosa por encima de normal anecdotario consume mucho más. Como tal, pasemos a 900,000 iteraciones en cada hilo:
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
Mucho de lo que estamos buscando, ¿no?
¿Parece que las JVM de Linux no tienen prioridad de subprocesos? Entiendo que no se puede realmente renice a un nivel más bajo en C, pero supongo que los ingenieros de JVM habrán descubierto cómo mantener a un despachador de poca monta.
Yo también pensé eso. Cambiar a root con UseThreadPriorities no afectó nada. Sin embargo, como la raíz y '-XX: ThreadPriorityPolicy = 1' yeilds: 1: 3809 2: 3587 3: 3679 4: 3223 5: 2796 6: 2686 7: 2233 8: 1895 9: 1759 10: 2311 Verse bien :) – Xailor
dar -XX: ThreadPriorityPolicy un valor = 0 y = 1 también le permitirá levantar una hilos PRIO – Schildmeijer