这周开始做nvm相关的一个性能测试。nvm是非易失性内存,是一类比较新的存储硬件的总称,其读写速率比DRAM慢,比ssd快。之前看了一些相关的论文,nvm的应用大概分这么几种:
1.用来完全替代DRAM作为主存.(并用DRAM做cache)
2.和DRAM一起构成一个混合的内存模型
3.作为块设备。
4.作为其他块设备的cache(如ssd)
这里把nvm作为块设备。
实验用dram模拟nvm,试验机总共8g内存,前4g仍作为dram使用,后4g作为nvm。
现在存在两种方案来使用它。
一是用新的filesystem来管理,这里使用pmfs这个文件系统.
pmfs项目的github:https://github.com/linux-pmfs/pmfs
二是在现有filesystem的基础上加上一层转换层,使得能够用现有的filesystem,如ext4来管理nvm。
这个中间层在这里是pmbd:https://github.com/linux-pmbd/pmbd
这两种方案下的体系结构图大概如下:
pmbd是作为内核模块启动的,可以按照README进行
pmfs对内核改动比较大,因此github给出的是修改后的整个内核。需要下载后重新编译内核。
注意不要下载zip文件然后解压,会导致文件不全。请用git clone到试验机。
对内核进行编译,请参照:http://zjuedward.blog.51cto.com/1445231/461376
make menuconfig时记得选上File sytems->Miscellaneous filesystems->Persistent and Protected PM file system support
这里声明一点:由于pmfs是基于内核3.11,而pmbd只能运行在3.2.1的内核上,所以我们只能在不同的内核下进行测验,但是内核版本的不同对实验结果影响不大,内存那块的差异非常小。
实验主要测试io带宽。使用的benchmark是fio-2.1.10
由于需要多次测试取平均值,并且生成的结果需要以特定格式导入到excel中生成图表,所以我写了个脚本来进行测试(只列举了针对pmbd的测试,pmfs的测试时类似的),如下:
import commands io_type=["read","write","randread","randwrite"]; blocksize=["1KB","2KB","4KB","8KB"]; job_num=["1","2","4","8"]; result='type-job'; for num in range(1,4): for i in blocksize: result+=" "+i; result+="\n"; for iotype in io_type: for job in job_num: result+=iotype+'-'+job; for bs in blocksize: # commands.getstatusoutput('touch /mnt/1.txt'); cmd='fio -filename=/dev/pma -direct=1 -iodepth 1 -thread -rw='+iotype+' -ioengine=psync -bs='+bs+' -size=8G -numjobs='+job+' -runtime=30 -group_reporting -name=mytest'; print str(iotype)+" "+str(bs)+" "+str(job)+" begin\n"; (status,output)=commands.getstatusoutput(cmd); word=output.split(); bw_val=0.0; for i in word: if i.startswith('bw='): i=i.lstrip('bw='); if i.endswith('KB/s,'): bw_val=float(i.rstrip('KB/s,'))/1024.0; bw_val=float('%0.3f' %bw_val); bw_val=str(bw_val); else:bw_val=i.rstrip('MB/s,'); break; result+=" "+str(bw_val); print str(iotype)+" "+str(bs)+" "+str(job)+"\t"+str(bw_val)+" end\n"; tmp_result=str(iotype)+" "+str(bs)+" "+str(job)+"\t"+str(bw_val)+" end\n"; ret1="echo '"+tmp_result+"' >>tmp_fio_log.txt"; commands.getstatusoutput(ret1); result+="\n"; ret="echo '"+result+"' >>resultlog.txt"; commands.getstatusoutput(ret); result='type-job';
最终得到如下性能:
注意两个图纵坐标的不同,初步的比较可知使用pmfs对nvm进行管理的性能更好。
job=4比job=8性能更好是因为实验机为四核,用8个线程去跑反而增加切换的开销。
顺序读比随机读性能稍好可能是因为预取和cache的原因,我们的nvm实际上是DRAM模拟的,所以cache对其是有影响的
顺序写比随机写性能稍好也可能是cache的原因。
目前进行的是没有虚拟化的情况下的性能比较,后期还要加入kvm,在kvm下进行性能测试,io栈大致如下: