Количество потоков и общее использование процессора при запуске dask на локальном компьютере - PullRequest
1 голос
/ 23 мая 2019

Я использую dask со следующими настройками одного / локального компьютера:

ClusterWorkers=8
ThreadPerWorker=1
cluster = LocalCluster(n_workers=ClusterWorkers, threads_per_worker=ThreadPerWorker)
client = Client(cluster)

Как видно на скриншоте, dask обнаружил 8 ядер. Физическая машина - это macbook pro с core i7 и, следовательно, только четырьмя ядрами, но всего 8 гиперпоточностей . python не может различить ядра и гиперпотоки.

enter image description here

Теперь при выполнении операции dask.bag.compute() поведение совершенно иное, чем в случае с запуском. Вместо того, чтобы видеть восемь процессов с одним потоком каждый - посмотрите, что у нас есть:

enter image description here

10–12 потоков на процесс Python ? Почему

Давайте посмотрим на загрузка процессора . Вот загрузка процессора , как сообщает Activity Monitor - которая за долгие годы использования оказалась достаточно надежной: в частности, когда я запускаю пул потоков на основе jvm или standalone spark , он надежно покажет очень близкое к 100% использование всех вычислительных ресурсов (примерно 800% загрузки ЦП). Ниже мы видим больше как 45-55%:

enter image description here

Итак, вопросы:

  • почему столько потоков, а не по одному на процесс
  • что может помешать достижению 100% вычислительных ресурсов пулом процессов dask.
  • существуют ли способы структурировать использование dask.compute() для достижения более высокого использования?

1 Ответ

0 голосов
/ 23 мая 2019

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

что может мешать достижению 100% вычислительных ресурсов

Многое! Обращаясь к рекомендациям , вы должны убедиться, что ваши разделы достаточно велики, чтобы вычисления на них занимали намного больше времени, чем накладные расходы для каждой задачи, но не настолько велики, чтобы они насыщали память. В конце вы делаете .compute(), после чего все оставшиеся данные передаются одному процессу (клиенту), что может стать основным узким местом, если вы не агрегировали по большому коэффициенту. Часто требуется, чтобы такой метод, как .to_textfiles, записывал рабочие, а не накапливал в клиентском процессе.

core i7 имеет только два ядра, но в общей сложности 8 гиперпоточностей

Не четыре ядра ?? Обратите внимание, что ОС обычно не делает различий между логическими ядрами, физическими ядрами и дискретными процессорами. Python просто берет информацию из ОС.

...