Влияет ли выполнение множества потоков ввода-вывода на производительность нескольких потоков, интенсивно использующих процессор? - PullRequest
2 голосов
/ 03 апреля 2012

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 03 апреля 2012

Влияет ли переключение контекста для одного из множества сетевых потоков ввода-вывода на поток / кэш процессора "активных" потоков?

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

Как определить, где находится граница?

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

2 голосов
/ 03 апреля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...