Что влияет на время создания кластера с использованием параллельного пакета?

Я испытываю медлительность при создании кластеров с использованием пакета parallel.

Вот функция, которая только создает, а затем останавливает кластер PSOCK, с узлами n.

library(parallel)
library(microbenchmark)
f <- function(n)
{
  cl <- makeCluster(n)
  on.exit(stopCluster(cl))
}
microbenchmark(f(2), f(4), times = 10)
## Unit: seconds
##  expr      min       lq   median       uq      max neval
##  f(2) 4.095315 4.103224 4.206586 5.080307 5.991463    10
##  f(4) 8.150088 8.179489 8.391088 8.822470 9.226745    10   

Моя машина (достаточно современная 4-ядерная рабочая станция под управлением Win 7 Pro) занимает около 4 секунд, чтобы создать два кластера node и 8 секунд для создания четырех кластеров node. Это показалось мне слишком медленным, поэтому я попробовал одно и то же профилирование на коллеге, идентично обработанной машиной, и потребовалось одну/две секунды для двух тестов соответственно.

Это предполагает, что у меня может быть некоторая нечетная конфигурация, установленная на моей машине, или что есть еще одна проблема. Я прочитал страницы справки ?makeCluster и socketConnection, но не видел ничего, связанные с улучшением производительности.

Я смотрел в диспетчере задач Windows во время работы кода: не было очевидных помех антивирусному или другому программному обеспечению, а только процесс Rscript, работающий на ~ 17% (менее одного ядра).

Я не знаю, где искать источник проблемы. Существуют ли какие-либо известные причины медленности с созданием кластера PSOCK под Windows?

Является ли 8-секундное создание кластера 4- node на самом деле медленным (по стандартам 2014 года), или мои ожидания слишком высоки?

Ответ 1

Чтобы отслеживать происходящее, я установил и открыл Process Monitor (HT @qethanm). Я также вышел из большинства вещей в моем системном лотке, таком как Dropbox, чтобы генерировать меньше шума. (Хотя, в конце концов, это не имело значения.)

Затем я повторно запустил упрощенную версию кода R в вопросе, непосредственно из R GUI (вместо IDE).

microbenchmark(f(4), times = 5)

После некоторого копания я заметил, что R GUI создает процесс Rscript для каждого создаваемого кластера (см. рисунок).

the process tree shows an Rscript instance for each node in each cluster

После многих тупиков и диких гусей, мне пришло в голову, что, возможно, эти экземпляры Rscript не были ванилью R. Я переименовал свой файл Rprofile.site, чтобы скрыть его и повторил эталон.

На этот раз кластер 4 node был создан, в среднем, всего за секунду.

Для четырех кластеров node файл Rprofile.site (и, предположительно, файл личного запуска, ~/.Rprofile, если он существует) читается четыре раза, что может значительно замедлить работу. Перейдите rscript_args = c("--no-init-file", "--no-site-file", "--no-environ") в makeCluster, чтобы избежать этого.