hb-lee 的博客


  • Home

  • Archives

C语言里面调用matlab程序

Posted on 2018-10-16

命令行调用

matlab -nodesktop -nosplash -r "codename"   

此命令linux下调用matlab程序的命令,因此可以使用 C 语言的系统调用函数system()或者exec()来进行调用

对于matlab软件的安装,如果没有root权限,安装程序需要使用编译安装的方式进行软件的安装;

利用MCR (Matlab Compiler Runtime)来编写可移植的C语言调用matlab的程序

这种方法只需要使用者安装MCR包实现matlab软件想要的功能,可以实现matlab程序在其他未安装的matlab软件上的运行

下载地址: https://www.mathworks.com/products/compiler/matlab-runtime.html  

此处介绍一下通用的软件安装方式 ------ 编译安装

解压:unzip MCR_R2016a_glnxa64_installer.zip
编译:./install -mode silent -agreeToLicense yes -destinationFolder <folder : /home/tools/matlab (matlab目录要存在)>

-agreeToLicense yes这个选项必须有,其他的则根据自己的环境进行选择 (–help可以查看有哪些可用选项)

安装: make && make install

运行示例

首先按照matlab程序的编写方式编写了matlab程序: init.m    
Linux 平台使用MCR编译该程序:  mcc -mv init.m

经过mcc编译之后会产生两个运行文件 init和run_init.sh,这两个程序都可以运行init.m的功能

运行: ./run_init.sh /home/tools/matlab/mcr_2017b/v93

Blktrace 介绍及使用

Posted on 2018-10-10

blktrace 介绍

blktrace 是针对linux内核中块设备I/O层的跟踪工具,是由Linux内核块设备层维护者开发的。下图是一个I/O的流通图:

可见,使用这个工具,我们可以获取I/O请求队列的各种详细情况,包括进行读写的进程名称,进程号,执行时间,读写的物理块号,读写的块大小等等。

2.6.23后的内核版本都会集成bltrace,如果没有,则安装blktrace后采用类似与ftrace相同的方式挂载debugfs即可!

bltrace 使用

blktrace -d /dev/sda -o -

-d 表示device
-o 表示输出
- 表示输出到标准输出(直接显示在屏幕)
产生结果为sda.blktrace.xx ,xx表示cpu 的id,里面的内容需要用blkparse来看

blkparse -i trace -o trace.txt

-i 输入(trace.blktrace.xx…)
-o 输出

输出内容分析

见:http://linuxperf.com/?p=161

Betrfs相关知识点

Posted on 2018-06-28

Betrfs特点

1. 内核文件系统
2. 层次: VFS ---> BetrFS ---> B^e Tree ---> ext4;
3. 底层为TokuDB;

Betrfs安装内核版本

由于代码限制,betrfs目前只能安装在linux-3.11.10这个内核版本之上;[具体限制见官网]

安装前的依赖(准备)

安装的库有:gcc-4.7,g++-4.7,zlib1g-dev,build-essential,cmake,valgrind,cscope

Betrfs安装 (以64 bit Ubuntu Server 13.10版本为例)


1. 内核准备

mkdir betrfs
cd betrfs
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.11.10.tar.gz
tar -xvf linux-3.11.10.tar.gz
cd linux-3.11.10
cp ../pthread_union_check.py ./
patch -p1 < ../linux-3.11.10.diff
make oldconfig
(找到CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS相关的配置项,设置为madvise,并选择为exclude)

make oldconfig:利用原来内核中的/boot目录下的config文件来编译新内核,对于新的特性会在该命令后显示出来;具体操作过程是拷贝/boot目录下的config文件到新内核主目录,然后重命名为.config [或者拷贝后运行make menuconfig, 然后load,然后重命名]

./pthread_union_check.py
make -j4
make modules
make modules_install
make install

2. TokuDB 编译

mkdir build  # in the top-level directory of the betrfs repository
cd build

CC=gcc-4.7 CXX=g++-4.7 cmake \
      -D CMAKE_BUILD_TYPE=$TYPE \
      -D USE_BDB=OFF \
      -D USE_TDB=ON \
      -D BUILD_TESTING=OFF \
      -D CMAKE_INSTALL_PREFIX=../ft-install/ \
      -D BUILD_FOR_LINUX_KERNEL_MODULE=ON \
      ..

cmake --build . --target install

3. 编译Betrfs源码

cd filesystem/
make

4. 挂载文件系统

进入betrfs的源码目录,假设记为 REPO
mkfs.ext4 /dev/sdb
mkdir mnt
mount -t ext4 /dev/sdb mnt
cd mnt
rm -rf *
mkdir db
mkdir dev
touch dev/null
mkdir tmp
chmod 1777 tmp
cd -
umount mnt
cd $REPO/filesystem;make;cd -;
modprobe zlib
insmod $REPO/filesystem/ftfs.ko sb_dev=/dev/sdb sb_fstype=ext4
touch dummy.dev
losetup /dev/loop0 dummy.dev
mount -t ftfs /dev/loop0 mnt

5. remount 文件系统 (加入了清cache过程,单纯的remount或卸载可以去除此步骤)

sync && echo 3 > /proc/sys/vm/drop_caches
sync
umount mnt
rmmod $REPO/filesystem/ftfs.ko
modprobe zlib
insmod $REPO/filesystem/ftfs.ko sb_dev=/dev/sdb sb_fstype=ext4
mount -t ftfs /dev/loop0 mnt

6. FAQ

在安装3.11.10版本的内核时,代码能正常编译成功,但是出现reboot时卡在Loading initial ramdisk…

曾经在grub.cfg对应的内核版本下加入了nomodeset来禁用视频特性仍不起效;

最后分析得出原因:由于在安装Ubuntu 13.10的时候由于更新源有些页面失效,就用国内的源替换了旧的,随后执行了apt-get upgrade;实际上apt-get upgrade会触发update-grub;从而会破坏镜像;
解决方法:将Ubuntu 14.04的源替换旧的源,这样就不会出现失效的链接;随后执行apt-get update操作来更新一下;之后进入正常的编译流程即可;

附件下载

https://github.com/Brayden-Lee/attachment/blob/master/sources.list

Ftrace跟踪open系统调用过程

Posted on 2018-06-27

涉及的ftrace文件说明

available_filter_functions 包含所有可以追踪的系统调用
available_tracers 包含所有的追踪类型 (常用的是function_graph)
current_tracer 当前正在追踪的类型
set_graph_function 设置要进行追踪的系统调用
tracing_on 开启(1)/关闭(0)跟踪过程
trace 保存跟踪过程打印的输出

ftrace for track the open system call

挂载debugfs  
    1. mkdir /mnt/debugfs  
    2. mount -t debugfs nodev /mnt/debugfs  
    3. cd /mnt/debugfs/tracing    
关闭ftrace跟踪 : echo 0 > tracing_on  [最新的ftrace没有tracing_enable文件]  
清空ring buffer : echo nop > current_tracer  
设置跟踪类型 : echo function_graph > current_tracer  
设置跟踪的函数 : echo do_sys_open > set_graph_function  
开启ftrace跟踪 : echo 1 > tracing_on

之后运行涉及到文件的open操作的执行过程,trace文件中就会有跟踪的函数结果。

其他性能追踪工具ltrace, strace

cmake编译参数错误

Posted on 2018-06-13

cmake所需依赖表示

-D 参数
-D XX_INCLUDE_DIR [此处设置所需包的头文件目录]
-D XX_LIBRARY [此处设置所需动态链接库.so文件的路径]

缺何种依赖可以根据所报错误来进行判断

如下是一个完整的cmake编译命令:

cmake编译举例

上图的cmake编译报错:VALGRIND_INCLUDE_DIR variables are used in this project, but they are set to NOTFOUND.
我们此时需要valgrind,若已经安装了valgrind,则可以通过**whereis valgrind** (which valgrind查找命令位置)来查找valgrind的安装目录;
我们的安装目录为:/usr/software/valgrind,所以可设置 VALGRIND_INCLUDE_DIR="/usr/software/valgrind/include/"。所以最终安装命令为:

cmake -D CMAKE_BUILD_TYPE=$TYPE -D USE_BDB=OFF -D USE_TDB=ON -D BUILD_TESTING=OFF \
-D VALGRIND_INCLUDE_DIR="/usr/software/valgrind/include/" -D CMAKE_INSTALL_PREFIX=../ft-install/ \
-D BUILD_FOR_LINUX_KERNEL_MODULE=ON ..

Untitled

Posted on 2018-05-22

char* 字符(串)指针;
string 字符串;
char 字符;
u_char 无符号的char型;
size_t 可看成unsigned int; // int
ssize_t signed size_t;
uint8_t 1字节; // signed char
uint16_t 2字节; // short int
uint32_t 4字节; // int
uint64_t 8字节; // long long int
mode_t 文件操作标志; // O_CREAT | O_RDONLY

void memcpy(void dest, const void src, size_t n); // n个字节内存拷贝
void
memset(void *s, int ch, size_t n); // n个字节用 ch替换

头文件 :memory.h

文件操作

open
lseek
write
read

define likely(x) builtin_expect(!!(x), 1)
define unlikely(x)
builtin_expect(!!(x), 0)

posix_memalign // 对齐操作

Slurm集群管理软件的安装

Posted on 2018-04-08
  • 删除失败的安装;
  • 安装MariaDB(数据库);
  • 创建用户;
  • 安装Munge;
  • 安装Slurm;
  • 配置Slurm;
  • 使用Slurm;

    本文以天河上的64个节点为例进行说明:

节点为cn15872-cn15935, IP段为:10.182.170/171.{1..32}

1、删除失败的安装记录

yum remove mariadb-server mariadb-devel -y
yum remove slurm munge munge-libs munge-devel -y
userdel -r slurm
userdel -r munge
[pkill 可以根据进程名杀死某个进程]

2、安装数据库

yum install mariadb-server mariadb-devel -y

说明:-y选项可以在安装的过程中遇到[Y/n]这种可以自动选Y

3、创建用户

export MUNGEUSER=980
groupadd -g $MUNGEUSER munge
useradd  -m -c "MUNGE Uid 'N' Gid Emporium" -d /var/lib/munge -u $MUNGEUSER -g munge  -s /sbin/nologin munge
export SLURMUSER=981
groupadd -g $SLURMUSER slurm
useradd  -m -c "SLURM workload manager" -d /var/lib/slurm -u $SLURMUSER -g slurm  -s /bin/bash slurm

4、安装munge

yum install epel-release -y
yum install munge munge-libs munge-devel -y

安装rng-tools来产生munge需要的key(key文件可以为任意大于32字节的文件)

[配置munge.key]
yum install rng-tools -y
/usr/sbin/create-munge-key -r
dd if=/dev/urandom bs=1 count=1024 > /etc/munge/munge.key
chown munge: /etc/munge/munge.key
chmod 400 /etc/munge/munge.key

[munge后续配置]
chown -R munge: /etc/munge/ /var/log/munge/
chmod 0700 /etc/munge/ /var/log/munge/
systemctl enable munge
systemctl start munge

5、安装slurm

yum reinstall pam.x86_64 -y
yum install openssl openssl-devel pam-devel numactl numactl-devel hwloc hwloc-devel lua lua-devel readline-devel rrdtool-devel ncurses-devel perl-ExtUtils-MakeMaker man2html libibmad libibumad -y
yum install rpm-build
mkdir /slurm
cd /slurm
wget https://download.schedmd.com/slurm/slurm-17.11.5.tar.bz2
rpmbuild -ta slurm-17.11.5.tar.bz2
cd /root/rpmbuild/RPMS/x86_64
mkdir /slurm/slurm-rpms
cp *.rpm /slurm/slurm-rpms  [*rpm文件为源码包,实际上就是对这些包进行安装]
yum --nogpgcheck localinstall *.rpm -y

6、配置slurm

http://slurm.schedmd.com/configurator.easy.html
此链接可以在线生成slurm.conf的基本配置,后续只要在这上面进行修改即可;1)在/etc/slurm下新建slurm.conf,将上述配置参数写入该文件即可;2)将此slurm.conf文件上传到所有的节点上;3)可以使用scp命令进行传输;接着进行如下步骤:

# 控制节点上的配置
mkdir /var/spool/slurmctld
chown slurm: /var/spool/slurmctld
chmod 755 /var/spool/slurmctld
touch /var/log/slurmctld.log
chown slurm: /var/log/slurmctld.log
touch /var/log/slurm_jobacct.log /var/log/slurm_jobcomp.log
chown slurm: /var/log/slurm_jobacct.log /var/log/slurm_jobcomp.log

# 所有slurmd进程运行节点上的配置
mkdir /var/spool/slurmd
chown slurm: /var/spool/slurmd
chmod 755 /var/spool/slurmd
touch /var/log/slurmd.log
chown slurm: /var/log/slurmd.log

启动slurmd进程

systemctl enable slurmd.service
systemctl start slurmd.service
systemctl status slurmd.service

启动slurmctld进程

systemctl enable slurmctld.service
systemctl start slurmctld.service
systemctl status slurmctld.service

7、使用slurm

scontrol show nodes  # 显示所有节点;
srun -N5 hostname  # 5个节点上运行hostname;
sinfo # 查看节点信息;
……

安装参考: https://www.slothparadise.com/how-to-install-slurm-on-centos-7-cluster/

利用一台PC机搭建一个能互相通信的小型集群

Posted on 2018-04-08

【前言】

Lustre和hadoop的hdfs等文件系统运行在集群上的,熟练掌握这些文件系统的一个好的方法就是自己进行实际的操练。在自己只有一台PC机的前提下,如何搭建一个能运行这样文件系统的集群呢?我们虽然没有足够多的机器,但是利用实验室电脑的良好性能,可以通过VMWare软件来搭建多个虚拟机,从而组成一个小型的集群。本文就来一步一步的介绍如何搭建一个能互相通信的小型集群。

【计算机基本信息】

【软件准备】[PS:软件版本不作限制,操作步骤基本一致]

下载并安装:VMWare 和 CentOS镜像。[下面给出下载地址]
VMWare 12 :http://sw.bos.baidu.com/sw-search-sp/software/a08321b624453/VMware_workstation_full_12.5.2.exe
VMware Workstation 12序列号: 5A02H-AU243-TZJ49-GTC7K-3C61N

CentOS 7 : thunder://QUFodHRwOi8vbGludXgueGl0b25neHoubmV0OjgwOC8yMDE2MDMvQ2VudE9TLTcuMC0xNDA2LXg4Nl82NC1EVkQuaXNvWlo=
(亲测迅雷下载比较快,自己也可以去寻找其他下载链接)

【安装之前提醒】

尽量准备一个空间大的磁盘来安装这些东西,不然也有可能等集群都运行起来时会很卡。如下图我在一个七百多G(已经够大)的磁盘里把VMware和虚拟机文件都安装在一起,为以后集群的运行准备足够大的空间。

##【虚拟机安装】
接下来就是安装虚拟机的过程了,此过程基本都是下一步即可。在其中根据自己的偏好设置磁盘或内存大小、cpu个数等等(一般都默认,因为后面不够可以改)。根据自己想搭建几个节点的集群安装几个虚拟机,建议不要安装太多,因为虚拟机一多,同时运行时就会非常的卡。下面就以创建4个虚拟机来完成后续操作。虚拟机的安装过程在此省略。
以下是我的配置(基本都是持续下一步,因为后面都可以改)

【虚拟机之间的局域网搭建】

为了方便,自己修改了主机名和登录名过程为n0,n1,n2,n3;此过程只需更改 /etc/hostname 和 /etc/passwd文件中相应字段即可,重启后生效。
拿n0机器举例说明: 
    需要依次编辑三个文件来改变机器的ip(固定)  [网络连接方式设置为NAT]
    /etc/sysconfig/network-scripts/ifcfg-网卡名
    /etc/sysconfig/network
    /etc/resolv.conf
    NAT模式需要使用虚拟网卡VMNet8,查看PC机上的对应的IP为192.168.188.1 (DOS 下运行 ipconfig /all)

因为掩码为255.255.255.0,所以ip分配为192.168.188.XXX才可以利用VMnet8虚拟网卡。于是准备给四台虚拟机分配IP,分配策略:

192.168.188.40    n0 
192.168.188.41    n1 
192.168.188.42    n2 
192.168.188.43    n3

以下就进行设置

[root@n0 etc]# vi /etc/sysconfig/network-scripts/ifcfg-eno16777736

[root@n0 etc]# vi /etc/networks

[root@n0 etc]# vi /etc/resolv.conf

之后都要重启电脑才能生效。

局域网中机器相互通信:
n0远程登录到n1 [linux 下 ssh命令]

如果一直这样输入ip会显得非常麻烦,为此需要编辑host文件(类似Windows下的host)
[root@n0 etc]# vi /etc/hosts

机器上都做此配置后就可以直接在任意机器上用[root@n0 etc]# ssh n1进行远程登录了。此时,一个互联的小型集群基本搭建完成。

【设置虚拟机和主机间的文件(夹)共享】

为了方便Windows与虚拟机之间能互传文件,有很多种方法进行配置,如samba等等。以下也介绍一种最简单也最常见的的方法。首先设置Windows上共享文件夹位置(虚拟机设置),然后按照图中来进行配置。

对于CentOS7需要安装VMWare Tools才可以在Linux中的/mnt/hgfs下能找到共享的文件夹。(亲测centos7之前的系统好像可以不用重装VMWare Tools,只要设置共享文件夹,Linux中就能使用)

【VMWare Tools安装】

虚拟机—-》重装VMWare Tools,此时会下载到linux的的一个目录中,不能在这个目录中直接解压,需要拷贝到其他目录进行解压才可以。操作如截图所示。[虚拟机底部会有安装步骤的提示]

然后执行[root@n0 vmware-tools-distrib]# ./vmware-install.pl,一路回车即可安装完成。

MPIRUN命令手册

Posted on 2018-04-08

并行框架用openmpi或者mpich,这里以openmpi为例

【环境安装】

1、下载openmpi-xx-xx包,比如openmpi-1.10.3.tar.gz
2、解压 tar -zxvf openmpi-1.10.3.tar.gz
3、./configure --prefix=/usr/software/openmpi
4、make && make install
5、在.bashrc里加入环境变量
    MPI_HOME=/usr/software/openmpi
    export PATH=$MPI_HOME/bin:$PATH
    export LD_LIBRARY_PATH=$MPI_HOME/lib:$LD_LIBRARY_PATH
6、source ~/.bashrc
安装完成!

【执行mpirun】

单节点多线程模式(以天河上节点为例)
mpirun --allow-run-as-root -np 4 exec.sh

说明:root用户需要加–allow-run-as-root;此处表示单节点上运行4个进程。

多节点多线程模式(比如在N1节点上运行该程序)

mpirun --allow-run-as-root -np 4 --mca btl_tcp_if_include enp8s0f1 --mca orte_base_help_aggregate 0 --map-by node --hostfile host exec.sh

运行流程图

说明:

  • 天河节点上需要加 –mca btl_tcp_if_include enp8s0f1 –mca orte_base_help_aggregate 0这些参数(根据报出的问题知晓的)
  • btl_tcp_if_include表示节点间通信的网卡。
  • 注意:多节点上运行时需要进行linux主机上ssh免密设置,详见多节点免密配置
  • –map-by node 表示按host中设置的主机轮询的分配这 -np个线程。

GUIDELINE

Posted on 2018-04-03

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

123

hb-lee

30 posts
© 2020 hb-lee
Powered by Hexo
|
Theme — NexT.Muse v5.1.4