Я профилирую многопоточную программу, работающую с разным количеством разрешенных потоков.Вот результаты производительности трех запусков одной и той же входной работы.
1 thread:
Total thread time: 60 minutes.
Total wall clock time: 60 minutes.
10 threads:
Total thread time: 80 minutes. (Worked 33% longer)
Total wall clock time: 18 minutes. 3.3 times speed up
20 threads
Total thread time: 120 minutes. (Worked 100% longer)
Total wall clock time: 12 minutes. 5 times speed up
Поскольку для выполнения одной и той же работы требуется больше времени потока, я считаю, что потоки должны бороться за ресурсы.
Я уже изучил четыре компонента (процессор, память, diskIO, сеть) как на компьютере приложения, так и на сервере базы данных.Память была исходным спорным ресурсом, но сейчас это исправлено (более 1 ГБ бесплатно).Процессор колеблется между 30% и 70% в тесте с 20 потоками, так что их достаточно.diskIO практически отсутствует на компьютере приложения и минимален на сервере базы данных.Сеть действительно отличная.
Я также профилировал код с помощью redgate и не вижу методов, ожидающих блокировок.Помогает то, что потоки не делятся экземплярами.Теперь я проверяю больше нюансов, таких как установление / пул соединений с базой данных (если 20 потоков пытаются соединиться с одной и той же базой данных, должны ли они ждать друг друга?).
Я пытаюсь идентифицировать и указать адресконфликт ресурсов, так что запуск потока 20 будет выглядеть следующим образом:
20 threads
Total thread time: 60 minutes. (Worked 0% longer)
Total wall clock time: 6 minutes. 10 times speed up
Каковы наиболее вероятные источники (кроме большой 4), на которые я должен обратить внимание, чтобы найти это утверждение?
Код, выполняемый каждым потоком, выглядит примерно следующим образом:
Run ~50 compiled LinqToSql queries
Run ILOG Rules
Call WCF Service which runs ~50 compiled LinqToSql queries, returns some data
Run more ILOG Rules
Call another WCF service which uses devexpress to render a pdf, returns as binary data
Store pdf to network
Use LinqToSql to update/insert. DTC is involved: multiple databases, one server.
Службы WCF работают на одном компьютере и не имеют состояния и могут обрабатывать несколько одновременных запросов..
Машина имеет 8 процессоров.