web-dev-qa-db-ja.com

R:利用可能なコア/ CPU使用量を確認する方法

Rはシングルスレッドです。

  1. Rを使用して、WindowsおよびLinuxでRを実行しているコア/スレッドの数を確認するにはどうすればよいですか? (または実行中のRの数)
  2. Rを使用して、WindowsおよびLinuxでRを実行している各コアの使用状況を確認するにはどうすればよいですか? (または、各Rが使用しているCPUの割合)

たとえば、2つのRを開いて実行中のプロジェクトがあるとします。 Rを実行しているスレッドが2つあり、各スレッドにCPUの%が含まれていると思います。次に、別のRを開きます。3番目のRを使用して、スレッドの数(この場合は2)とRによって使用されているCPUの割合を確認するにはどうすればよいですか?

5
WCMC

Linuxでは、psコマンドをシステムに送信できます。これにより、平均CPU使用率とrsessionというプログラムのメモリ使用量がわかります。

splitted <- strsplit(system("ps -C rsession -o %cpu,%mem,pid,cmd", intern = TRUE), " ")
df <- do.call(rbind, lapply(splitted[-1], 
                            function(x) data.frame(
                                cpu = as.numeric(x[2]),
                                mem = as.numeric(x[4]),
                                pid = as.numeric(x[5]),
                                cmd = paste(x[-c(1:5)], collapse = " "))))
df
#  cpu mem   pid   cmd
#1 0.8 0.7 11001  /usr/lib/rstudio/bin/rsession 
#2 0.0 0.2 12397  /usr/lib/rstudio/bin/rsession
#3 0.1 0.7 14960  /usr/lib/rstudio/bin/rsession
#4 0.4 0.2 26122  /usr/lib/rstudio-server/bin/rsession 
#5 0.3 8.3 35782  /usr/lib/rstudio/bin/rsession

おそらくそれを改善して、psまたはtopに渡される他のオプションを使用して親IDと瞬間的なCPU使用率を取得し、各セッションで使用されるコアの数を推測することができます。

Windowsでは、これを試すことができます。

a <- system("wmic path Win32_PerfFormattedData_PerfProc_Process get Name,PercentProcessorTime", intern = TRUE)
df <- do.call(rbind, lapply(strsplit(a, " "), function(x) {x <- x[x != ""];data.frame(process = x[1], cpu = x[2])}))
df[grepl("Rgui|rstudio", df$process),]
#     process cpu
# 105    Rgui   0
# 108 rstudio   0
11
BenoitLondon

複数のRウィンドウを開くと、各ウィンドウは、使用しているコアの最大数まで、異なるコアで実行されます。これは、WindowsおよびMacコンピューターに自動的に実装されます。コアの数を知りたい場合は、次のコマンドを実行できます。

library(parallel)
detectCores()
8
mikey

Rを使用して、WindowsおよびLinuxでRを実行しているコア/スレッドの数を確認するにはどうすればよいですか? (または実行中のRの数)

ここでまだ読んでいない有効な答えの1つは、関数ps()ps Rパッケージを使用することです。次に、「rsession」という名前のプロセスによって返されるテーブルをサブセット化できます。 :

_ps::ps()[ps::ps()$name == "rsession",]
_

行数は、コンピューター/サーバーに存在するセッションの数を示します。

_nrow(ps::ps()[ps::ps()$name == "rsession",])
_

function ps_num_threads()が何をするのか完全にはわかりませんが、結果が意味をなすかどうかを確認するのも興味深いかもしれません。

_ps::ps_num_threads(ps::ps_handle())
_

残念ながら、ps Rパッケージで%CPU使用率については何も見つかりませんでしたが、他の回答で引用した関数を試してみることができます。Linuxで動作するはずです。

1
Yoann Pageaud

興味のある人のために、友人と私は、Rコンソールからコンピューター/サーバー上の進行中のプロセスをプローブする機能を備えたGithubリポジトリを作成しました。
リンクは次のとおりです: https://github.com/mathosi/cluster_check

質問に答えるには、私が作成した関数ps.to.df()を使用できます。

_devtools::source_url("https://github.com/mathosi/cluster_check/blob/master/ps_to_df.R?raw=TRUE")
ps.to.df() #List All processes sorted by %CPU usage
ps.to.df(bylist.selection = "C rsession") #List All processes named 'rsession' sorted by %CPU usage
_

出力はdata.frameであるため、Rで希望する方法でサブセット化して並べ替え、見たいものを探すことができます。
ps.to.df()がサポートする可能性のあるすべてのクエリをまだ試していませんが、他のクエリをサポートする必要があると思います。
[。興味のある人は誰でも参加して貢献できます。

0
Yoann Pageaud

1)マシンで使用可能であるか、2)現在のRプログラムが実行されているHPCクラスターによって割り当てられているコア/ CPUの数および/またはワーカー/計算ノードの数を知りたい場合は、これを試してください(並列および 将来 パッケージからの関数):

library(parallel) # for using parallel::mclapply() and checking #totalCores on compute nodes / workstation: detectCores()
library(future) # for checking #availble cores / workers on compute nodes / workstation: availableWorkers() / availableCores() 

workers <- availableWorkers()
cat(sprintf("#workders/#availableCores/#totalCores: %d/%d/%d, workers:\n", length(workers), availableCores(), detectCores()))
print( workers )
0
Good Will