Влияет ли выполнение большого количества потоков ввода-вывода на производительность нескольких потоков, интенсивно использующих процессор?

Допустим, у меня есть 6-ядерная машина с 12 МБ кеш-памяти. Я использую его для серверного приложения, у которого есть несколько гигабайт кучи (большая часть из них - кеш Hibernate 2-го уровня).

Я заметил, что большую часть времени у меня есть несколько потоков, активно обслуживающих клиентские запросы (сжигание ЦП и общение с БД), а также еще около 30-50 потоков, которые выполняют только старый хороший синхронный сетевой ввод-вывод с клиентом.

Когда я изучаю модель памяти Java, мне интересно, может ли это повлиять на производительность. Разрушает ли переключение контекста для одного из множества сетевых потоков ввода-вывода кэш потоков / ЦП «активных» потоков? Вреден ли сам по себе этот уровень параллелизма (не считая кеша памяти)?

Имеет ли это значение, учитывая, насколько мал кеш ЦП по отношению ко всей памяти приложения? Как определить границу?


person Konrad Garus    schedule 03.04.2012    source источник
comment
В связи с этим, чтобы свести к минимуму переключение контекста, рассматривали ли вы использование асинхронного ввода-вывода? stackoverflow.com/questions/2794535/   -  person Slugart    schedule 03.04.2012
comment
@Slugart Этот вопрос на самом деле является частью исследования использования асинхронного ввода-вывода. Пытаюсь выяснить, может ли я уже пострадать (и правильно ли я получаю влияние модели памяти) и стоит ли оно того.   -  person Konrad Garus    schedule 03.04.2012
comment
Теоретически это более эффективно, поскольку Питер Лори упомянул, что переключение контекста произойдет. На практике вы сами должны измерить разницу в вашем сценарии.   -  person Slugart    schedule 03.04.2012


Ответы (2)


Разрушает ли переключение контекста для одного из множества сетевых потоков ввода-вывода кэш потоков / ЦП «активных» потоков?

Нет никаких жестких гарантий, но я чувствую, что на практике кеши ЦП обновляются на порядок чаще, чем планировщик переключает потоки. Если это так, то обновление кеша, необходимое для переключения контекста потока, представляет собой чрезвычайно небольшие накладные расходы по сравнению с уже имеющимися обновлениями кеша.

Как определить границу?

Экспериментируя и измеряя (профилирование), как в случае с большинством вопросов, связанных с производительностью. Простые теоретические приближения не работают, потому что реальность того, что на самом деле происходит на современном ПК, сложнее любого разумного приближения.

person Joonas Pulakka    schedule 03.04.2012

Будет влияние, и вы можете получить некоторый джиттер, когда у вас будет больше активных потоков, чем процессор. Однако джиттер обычно считается относительно небольшим, от 10 до 100 микросекунд.

Вы можете заставить поток конкурировать за ресурсы кеша, но вы мало что можете с этим поделать, кроме как уменьшить количество активных данных, используемых каждым потоком. Это может снизить нагрузку на ваш процессор в 2 раза или более, но требует большой работы, возможно, полной перезаписи (включая некоторые JDK и сторонние библиотеки), и это может принести мало пользы. например на сколько вам нужно, чтобы загрузка процессора была ниже.

person Peter Lawrey    schedule 03.04.2012