Написал быстрый Java proggy, чтобы создать 10 потоков с каждым приоритетом и вычислить метод pi (4 * atan (1)) с BigDecimals 500 000 раз каждый, присоединиться к каждому потоку и сообщить об истекшем времени для запуска метода. Да, наверное, не лучший пример, но сохраняя его базовым.Действительно ли Linux JVM реализуют приоритеты потоков?
Я знаю Bug4813310
Это нетривиально сделать в C, но мы можем предположить, что местные приоритеты никогда не установлены на 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
Похоже, что это не так много отклонений, которых можно было бы ожидать! Это было на небольшой виртуальной машине Linux. Может быть, просто Солнце? Постараемся IBM J9 VM:
1:4091
2:4142
3:3957
4:3905
5:3984
6:3985
7:4130
8:4055
9:3752
10:4071
Грубые цифры выглядят довольно хорошо в сравнении, но нет шкалы с числами от приоритета нити перспективы в.
Давайте попробуем 500K итераций на ядре 2.6 с более старым Sun JVM, тот, который постоянно загружен со средними значениями нагрузки редко ниже 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
Давайте попробуем J9 компании IBM на реальный слябе только с ядром 2.6 и так как большая система увеличит итерации до 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
Некоторые замечательные времена, но все еще нет видимых нитей/приоритетов процесса.
Давайте попробуем коробку Windows. Я знаю, что Windows имеет довольно агрессивную схему приоритетов потоков. Все, что выше нормальное anecdotaly потребляет гораздо больше. Таким образом, давайте переместимся на 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 выяснили бы, как сохранить низкоуровневый диспетчер.
Я тоже думал об этом. Переход на корень с помощью UseThreadPriorities ничего не сказался. Однако, как корень и '-XX: ThreadPriorityPolicy = 1 'yeilds: 1: 3809 2: 3587 3: 3679 4: 3223 5: 2796 6: 2686 7: 2233 8: 1895 9: 1759 10: 2311 Глядя хорошо :) – Xailor
поддавки -XX: ThreadPriorityPolicy значение = 0 и = 1 также позволит вам поднять темы Прио – Schildmeijer