Я профилирую многопоточную программу, работающую с разным количеством разрешенных потоков. Вот результаты производительности трех прогонов одной и той же входной работы.
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
Каковы наиболее вероятные источники (кроме большой четверки), на которые мне следует обратить внимание, чтобы найти это утверждение?
Код, который выполняет каждый поток, примерно:
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 ЦП.