通过shell脚本测试ubuntu20.04播放电影时操作系统的读取速度,并利用pythonmatplotlib工具以折线图表示
任务:测试在虚拟机播放一部电影时不同文件系统的读写速度
环境:macos 11.2.3 parallels7 虚拟机ubuntu20.04 shell vscode1.59.0
思路:下载一部电影到ubuntu中,测试当前文件系统的读取速度。
具体过程:
(1) 下载电影:下载电影没有遇到问题,我是在mac下用迅雷下载到本机后再利用parallels共享文件夹拷贝到了ubuntu中,但在使用系统默认播放器时失败。参考了相关教程,支持rmvb的播放器有MPlayer等,但由于下载时还需要下载相关的解码器之类的问题,于是被我果断舍弃了(老怕麻烦了)。最终下载了SMPlayer播放器,用apt-get install命令下载即可,亲测可用。
(2)查看当前文件系统:既然要做对比,所以磁盘本身的文件系统就先作为对比的对象。使用磁盘命令df -h和fdisk -l可查看挂载的磁盘,再使用parted /dev/磁盘(我的是sda1),然后print list可查看文件系统。
(3)于是想要对比读写性能时遇到了点小问题,首先播放电影应该是偏向于读的操作。那么我查询了如何显示并比较读取的性能指标。有许多工具,我选用了iostat(用了一下感觉好用,刚才说了老怕麻烦了),同样apt-get install命令下载。之后使用iostat -x 1可以打印读和写的性能数据(写偶尔也会有速率的变化,即使在看电影时,但我认为是操作系统的日志写,只是感觉),但任务是导出数据并呈现在图表中,于是继续go
(4)导出数据因为是显示在终端当中,所以既然要显示在图表中,我首先感觉应当先写到一个txt里。但终端的重定向>只能读取一秒(因为我刚刚iostat命令是iostat -x -1)所以要得到动态变化的数据显然不行,于是想到了编写一个简单的shell程序,就以下几行,但我遇到了很多问题,就不细说了
数据就导出到了以上的txt中,这还是过滤了的(grep命令可以设置行过滤),大概5000多行。
(5)画图表:最后一步是将导出的数据再使用python将图表画出来,具体办法也很简单,引入matplotlib库和numpy库,报错的话在下方的terminal终端当中使用pip install命令下载安装一下。之后给出这个的代码
import matplotlib.pyplot as plt
import numpy as np
filename = 'test.txt'
X,Y = [],[]
i=0
plt.xlabel("s")
plt.ylabel("MB/s")
list1=[]
list2=[]
list3=[]
list4=[]
with open(filename,'r') as f:
for line in f:
try:
trr = line.split()
i=i+1
list1.append(trr[1])
list2.append(i)
except:
continue
for i in range(0,100):
list3.append(list1[i])
#list3.append(list1[i])
i=i+1
list4.append(i)
for i in range(0,100):
list3[i]=float(list3[i])
print(list3)
print(len(list3))
print(len(list4))
plt.plot(list4,list3)
plt.show()
这里有个坑,因为我不怎么用python,真的不太习惯这种不声明变量类型的语言,我的想法是5000多行的数据显示到图表中有些冗余,于是我就提取了前100行的数据进行显示。其他都没问题,但遇到的最大的问题就是纵坐标是乱序的,整了半天,最后突然想到数据类型的问题。注意:python中打开文件后split到列表中的元素是字符串类型的,并不是整形或者是浮点型的。所以即使强大的库函数也无法正确的按照字符串正确的比较浮点数的大小,因此必须做一步类型转换。至此,成功的做图了,但并未切换文件系统进行测试,也未对写频繁操作进行测试,打算明天继续。但给出我的文件系统切换的思路,我不想通过更改配置然后编译内核的办法,实在就是因为之前编译内核花的时间太长了,mbp编译内核即使使用 -j4还是慢的一批,给出思路:初始化一个新的磁盘块(打个比方sda6),使用mkfs命令在挂载的时候指定需要做比较的文件系统。然后切换到新挂载的磁盘块进行测试。最后给出今天实验的截图:
我是使用vscode建立和ubuntu的远程ssh连接在主机里搞的,这里大力建议一下,有个ide还是很不戳,你要用了公钥连接的办法遇到一个主机缺失依赖文件的话建议直接放弃选那个简单验证的办法,因为我解决了两天,贼傻逼,愿世界没有bug