- Баллы
- 123
- Имя в Minecraft
- Reality_SC
Все в курсе, что нынче все компы имеют по несколько параллельно работающих ядер.
Чаще всего половина ядер это виртуальные процессоры (Intel Hyper-Threading), которые являются фронт-эндом к совместным логическим устройствам ядра.
Примем в дальнейшем, что у нас всегда процессор с HT.
Если HT отключить, 1 поток на рассматриваемом ядре будет идти со своей обычной скоростью 100%.
Если HT включить, ядро сможет обрабатывать параллельно 2 потока, но при этом их суммарная производительность не будет выше 125% (личный опыт), Википедия пишет, что 115-130%. При этом отдельная задача на одном виртуальном процессоре работает медленнее (125%/2 = 62.5%). Это относится к случаю, когда на втором CPU этого же ядра работает ресурсоёмкая задача. Если её нет, то в общем-то грамотная микросхема переносит все силы на тот первый поток, который работает, и можно считать, что HT не работает для одного выделенного ядра.
Конечно, в целом HT положительно влияет на работу многозадачной системы с кучей потоков.
Серверу Minecraft всегда требовалась максимальная производительность, по крайней мере его основному циклу. С другой стороны, нельзя сказать, что сервера совсем однопоточные — сегодня лишь самый ленивый автор плагинов не использует параллельные потоки для того, чтобы выполнять какие-то вычисления.
Отсюда встаёт задача: как эффективно распределить потоки по ядрам?
Интуитивно, сразу напрашивается такая схема (на примере 2-ядерного/4-поточного CPU):
Для достаточно частого случая 4-ядерного CPU (8 потоков) предлагаю также отдать ядро под серверный цикл, а остальные 3 ядра поделить по 3 потока на ОС и серверные параллельные потоки.
Ко всему RuBukkit-у: имеют ли мои размышления достаточное основание, чтобы написать такой плагин? Или это заблуждение, и планировщик процессов уже всё сделал до меня?
@HoShiMin @alexandrage @Shevchik @fromgate кто ещё? 🙂
@MySt1k
Может быть это уже кто-то делал у себя, тестировал, и может поделиться результатом?
Предлагается накидать плагин, а в конфиге указывать две маски cpu affinity: для основного потока и для остальных потоков текущего процесса Java. OpenHFT в помощь, возможно есть другие библиотеки.
Предположить, что остальные процессы займут остальные ядра. Можно, конечно, заморочиться, и пройтись по всем остальным процессам и выставить им третью маску, но я хз как это сделать под Linux, под Windows вроде как легко, достаточно иметь админские права.
Чаще всего половина ядер это виртуальные процессоры (Intel Hyper-Threading), которые являются фронт-эндом к совместным логическим устройствам ядра.
Примем в дальнейшем, что у нас всегда процессор с HT.
Если HT отключить, 1 поток на рассматриваемом ядре будет идти со своей обычной скоростью 100%.
Если HT включить, ядро сможет обрабатывать параллельно 2 потока, но при этом их суммарная производительность не будет выше 125% (личный опыт), Википедия пишет, что 115-130%. При этом отдельная задача на одном виртуальном процессоре работает медленнее (125%/2 = 62.5%). Это относится к случаю, когда на втором CPU этого же ядра работает ресурсоёмкая задача. Если её нет, то в общем-то грамотная микросхема переносит все силы на тот первый поток, который работает, и можно считать, что HT не работает для одного выделенного ядра.
Конечно, в целом HT положительно влияет на работу многозадачной системы с кучей потоков.
Серверу Minecraft всегда требовалась максимальная производительность, по крайней мере его основному циклу. С другой стороны, нельзя сказать, что сервера совсем однопоточные — сегодня лишь самый ленивый автор плагинов не использует параллельные потоки для того, чтобы выполнять какие-то вычисления.
Отсюда встаёт задача: как эффективно распределить потоки по ядрам?
Интуитивно, сразу напрашивается такая схема (на примере 2-ядерного/4-поточного CPU):
- ЯДРО:
- Для нужд ОС, других программ и параллельных потоков mc-сервера.
- Для нужд ОС, других программ и параллельных потоков mc-сервера.
- ЯДРО:
- Только для главного цикла mc-сервера.
- Никому.
Для достаточно частого случая 4-ядерного CPU (8 потоков) предлагаю также отдать ядро под серверный цикл, а остальные 3 ядра поделить по 3 потока на ОС и серверные параллельные потоки.
Ко всему RuBukkit-у: имеют ли мои размышления достаточное основание, чтобы написать такой плагин? Или это заблуждение, и планировщик процессов уже всё сделал до меня?
@HoShiMin @alexandrage @Shevchik @fromgate кто ещё? 🙂
@MySt1k
Может быть это уже кто-то делал у себя, тестировал, и может поделиться результатом?
Предлагается накидать плагин, а в конфиге указывать две маски cpu affinity: для основного потока и для остальных потоков текущего процесса Java. OpenHFT в помощь, возможно есть другие библиотеки.
Предположить, что остальные процессы займут остальные ядра. Можно, конечно, заморочиться, и пройтись по всем остальным процессам и выставить им третью маску, но я хз как это сделать под Linux, под Windows вроде как легко, достаточно иметь админские права.
Последнее редактирование: