2012-04-24 6 views
14

В моей программе используется определенное количество потоков, каждая из которых выполняет независимую работу. Я использую i7-2600 CPU, но я отключил модуль гиперпотоков, поэтому он запускает 4 потока на 4 ядра. Когда я запускаю программу с 1 потоком, использование процессора составляет 25%, что отлично, поскольку 1 поток полностью используется, но когда я запускаю 4 или 3 потока, я получаю только 60% процессор, почему?Использование многопоточного процессора в C#

Как я уже говорил, потоки полностью независимы (нет блокировок и нет утверждений), также когда я запускаю программу 4 раза с помощью 1 потока, я получаю 100% использование ЦП (т. Е. Когда 4 процесса из 1 потока для каждого процесс я получаю надлежащее использование ЦП)

Любые идеи?

некоторые подробнее:

  1. Я не использую ввод/вывод при обработке всех необходимых данные загружаются в память, каждый поток загружает свои данные до обработки.
  2. Я загружаю данные из базы данных (используя oleDb), но проблема, которую я описываю, происходит после загрузки, пока все потоки обрабатываются (загрузка не выполняется).
  3. Номера:
    • 2 нити вокруг 40% вместо 50 (85% для каждой нити).
    • 3 нити вокруг 50% вместо 75 (65% для каждой нити).
    • 4 потока вокруг 60% вместо 100 (60% для каждой нити).
  4. Я использую i7 2600 с памятью 16 ГБ, но использование памяти в этом процессе не приближается к этому.
  5. Я запустил монитор производительности Windows, чтобы искать утверждения, которых нет.
+1

вы делаете блокирующие вызовы ввода/вывода? – ChaosPandion

+0

Это зависит от того, что делает каждый поток, и как вы синхронизируете их между собой и количеством IO, которое вы делаете. Кроме того, в .Net вы не всегда получаете каждый поток на новом CPU – IanNorton

+2

Если они полностью независимы, то они, вероятно, конкурируют за необработанную пропускную способность памяти. Это или кэш-память. –

ответ

3

Вы можете попытаться сменить программу с рабочей станции на режим сбора мусора на сервере. В настоящее время вы можете использовать только один поток коллекции мусора.
Настройка объясняется here.
См. Это thread для пояснения/дальнейшие подробности.
Не ожидайте 100% загрузки процессора после изменения, но вы приблизитесь к 100% и увеличьте его.

+0

OP спрашивает * почему * они видят поведение, которое они видят. Это не отвечает на этот вопрос. –

+0

Он не говорит, какой GC он использует, но настройка сборщика мусора, может быть, почему он не видит ожидаемого поведения. – weismat

+0

Я переключился на serverGC и, похоже, сделал трюк, я думаю, что GC взял некоторую силу, пока он работал в фоновом режиме –

1

concurrency visualizer поможет вам здесь. Вы увидите, когда выполняется каждый поток, и если все потоки не выполняются, вы можете точно увидеть, почему ждет определенный поток. Если вы создаете много мусора, GC может блокировать потоки, что приводит к меньшему линейному масштабированию. Но вы только узнаете, сделав реальное расследование.

+0

Я думаю, что у меня нет визуализатора параллелизма, так как я использую VS2010 pro, любой другой инструмент, который вы могли бы порекомендовать? –

+0

Вы можете попробовать предварительный просмотр 2011 dev, я думаю, что он позволяет использовать все функции http://channel9.msdn.com/posts/Visual-Studio-vNext-Concurrency-Visualizer –

1

Я была такая же проблема при работе с .NET Framework версии 2.0, то я изменил целевой проекты рамки для V4.0 он начал с 100% загрузки процессора

Edit: Вы можете наблюдать загрузку процессора за потоками , просто с

Sysinternals Process Explorer

или

Process Hacker

+0

Спасибо за отзыв о "Sysinternals Process Explorer" I посмотрим –

Смежные вопросы