Многопоточное использование ЦП в С#
Моя программа использует предопределенное количество потоков, каждая из которых выполняет независимую работу.
Я использую процессор i7-2600, но я отключил модуль гиперпотоков, поэтому он запускает 4 потока на 4 ядра.
Когда я запускаю программу с 1 потоком, использование процессора составляет 25%, что отлично, поскольку 1 поток полностью используется, но когда я запускаю 4 или 3 потока, я получаю только 60% процессор, почему?
Как я уже упоминал до того, как потоки полностью независимы (нет блокировок и никаких утверждений), также когда я запускаю программу 4 раза с 1 потоком, я получаю 100% использование ЦП (т.е. когда его 4 процесса из 1 потока для каждого процесса Я получаю правильное использование ЦП)
Любые идеи?
Дополнительная информация:
- Я не использую ввод-вывод при обработке всех необходимых данных, загружаемых в память, каждый поток загружает свои данные до обработки.
- Я загружаю данные из базы данных (используя oleDb), но проблема, которую я описываю, происходит после загрузки, пока все потоки обрабатываются (загрузка не выполняется).
- Цифры:
- 2 потока вокруг 40% вместо 50 (85% для каждого потока).
- 3 потока вокруг 50% вместо 75 (65% для каждого потока).
- 4 потока вокруг 60% вместо 100 (60% для каждого потока).
- Я использую i7 2600 с памятью 16 ГБ, но использование памяти в этом процессе не приближается к этому.
- Я запустил монитор производительности Windows, чтобы искать утверждения, которых нет.
Ответы
Ответ 1
Вы можете попытаться переключить свою программу с рабочей станции на режим сбора мусора на сервере. В настоящее время вы можете использовать только один поток коллекции мусора.
Настройка объясняется здесь.
См. Этот поток для объяснения/дальнейшие подробности.
Не ожидайте 100% загрузки процессора после изменения, но вы приблизитесь к 100% и увеличьте его.
Ответ 2
concurrency визуализатор поможет вам здесь. Вы увидите, когда выполняется каждый поток, и если все потоки не выполняются, вы можете точно увидеть, почему ждет определенный поток. Если вы создаете много мусора, GC может блокировать потоки, что приводит к меньшему линейному масштабированию. Но вы только узнаете, сделав реальное расследование.
Ответ 3
У меня была такая же проблема во время работы с .NET Framework v2.0, после чего я изменил целевую структуру проектов на v4.0, она началась с 100% загрузки процессора
Изменить: вы можете смотреть использование ЦП на потоки, просто используя
Sysinternals Process Explorer
или
Process Hacker