Ubuntu 20.04下RStudio Server如何限制OpenBLAS线程数?
在RStudio Server中限制OpenBLAS线程数的可行方案(Ubuntu 20.04)
背景
我们运行Ubuntu 20.04系统搭配开源版RStudio Server,采用OpenBLAS处理线性代数运算。由于用户对并行机制不了解导致核心超配,希望将低线程数设为所有用户的默认值,但尝试以下方法均未生效:
- 在
.profile和.bashrc中设置export OPENBLAS_NUM_THREADS=4 - 通过
/etc/environment、/etc/rstudio/env-vars配置环境变量 - 使用
systemctl edit rstudio-server.service修改服务配置
以下是几种未尝试过的有效途径:
方法1:使用专门的R包控制线程数
有一款名为openblasctl的R包,专门用于管理OpenBLAS的线程数量,可在用户R会话启动时自动应用限制:
- 以root身份运行R,系统级安装该包:
install.packages("openblasctl") - 编辑全局R配置文件
/etc/R/Rprofile.site,添加以下代码,默认将线程数设为4:
所有用户启动R会话时,都会自动加载并应用该线程限制。if (requireNamespace("openblasctl", quietly = TRUE)) { openblasctl::openblas_set_num_threads(4) }
方法2:通过PAM会话注入环境变量
RStudio Server通过PAM启动用户会话,可利用PAM机制全局注入OpenBLAS的线程数环境变量:
- 编辑
/etc/pam.d/rstudio配置文件,添加一行:session required pam_env.so envfile=/etc/rstudio/openblas-env - 创建
/etc/rstudio/openblas-env文件,写入:OPENBLAS_NUM_THREADS=4 - 重启RStudio Server使配置生效:
该方式优先级高于用户个人的bash配置,确保每个用户登录时都会加载指定的线程数限制。sudo systemctl restart rstudio-server
方法3:通过LD_PRELOAD强制设置线程数
编写轻量级共享库,在进程启动时自动设置OpenBLAS线程数,再通过LD_PRELOAD强制所有RStudio进程加载:
- 创建C语言代码文件
set_openblas_threads.c:#include <openblas/cblas.h> void __attribute__((constructor)) set_threads() { openblas_set_num_threads(4); } - 编译为共享库:
gcc -shared -fPIC -o /usr/local/lib/libopenblas_threads.so set_openblas_threads.c -lopenblas - 修改RStudio Server的服务配置:
运行systemctl edit rstudio-server.service,在打开的编辑器中添加:[Service] Environment="LD_PRELOAD=/usr/local/lib/libopenblas_threads.so" - 重载服务配置并重启:
这种方式会强制所有由RStudio启动的进程自动应用线程数限制,不受用户个人配置影响。sudo systemctl daemon-reload && sudo systemctl restart rstudio-server
方法4:修改OpenBLAS系统级配置
如果系统通过包管理器安装OpenBLAS,可尝试修改其系统级配置文件:
- 查找OpenBLAS的配置目录(若存在对应命令):
openblas-config --configdir - 在该目录下创建或修改
openblas.conf文件,添加:
若找不到上述目录,可直接尝试创建NUM_THREADS=4/etc/openblas.conf并写入上述内容。
注意:部分版本的OpenBLAS可能不支持该配置方式,需测试验证生效情况。
内容的提问来源于stack exchange,提问作者gdkrmr
相关产品推荐
相关产品推荐

