题外话linux
《邪不压正》这部电影刚上映我就去看了,做为姜文的民国三部曲最后一部,刚上映就把《我不是药神》挤下神坛,但我不关心票房,单纯是冲着他的上部电影《让zidan飞》的精彩剧情和台词,抱着美好的期待去的。windows
走出电影院,我就忘了讲的是啥,只记得彭于晏在老北京的屋檐上处处乱窜,整部剧情就一个少年复仇记的简单故事,台词晦涩难懂、剧情跳跃、人物形象也不完整。远远没有当年观看《让zidan飞》的惊艳体验。后端
还记得《让zidan飞》里姜文饰演的张麻子一出场就密集的打出7枪:centos
六子:没打中?性能优化
张麻子:让zidan再飞一下子
服务器
这句话从张麻子口中说出,透出无比的自信,想表达的意思就是:别急着要结果,好事正在酝酿中。网络
1 背景ide
言归正传,现现在咱们使用云计算产品,不管虚拟机是linux,仍是windows系列的操做系统,云硬盘挂载到云主机,再通过文件系统格式化,是最经常使用的存储使用场景,至关于咱们家用计算机的D盘、E盘,用来存放数据、安装软件等。性能
对硬盘的操做,有一点能够达成共识的是,在Linux系统下,对磁盘分区的处理,一般都是采用fdisk、mkfs的处理方式,固然大于2TB的磁盘另外,不在本次讨论范围内。测试
整篇文章分如下几小章节:
1 、背景
2 、现象回顾
三、 云硬盘挂载后,ceph后端存储实际如何变化
4 、centos不一样内核下的表现
五、 找到根本缘由
六、 总结
2 现象回顾
有几回在格式化云硬盘并mount后,很快执行fio测试发现和历史数据对比性能有所降低,回过头对ceph节点osd io进行监控时,观察到1个现象,即执行格式化、建立文件系统后短期内磁盘会产生数分钟写io。
mount云硬盘以后,写操做持续了5分钟以上,时间有点久,在这个时间内,若是对云硬盘执行大吞吐的读写操做,或多或少影响的实际的性能,甚至是否会影响数据持久化,不得而知,所以不得不花了些时间排查具体是什么缘由触发的。
3 云硬盘挂载后,ceph后端存储实际如何变化
分了几个步骤对云硬盘从建立开始,到写入数据的全部过程作个梳理,看看是哪些环节产生什么样的反映。
(1)新建的volume无任何数据
Cinder建立 100GB的数据盘,卷类型为无qos,此时在rbd 的custmized-hdd池中,出现了刚刚建立的volume,经过rbd diff计算这个volume实际占用容量为0,无数据
(2)云硬盘挂载到云主机,但不分区
将100GB的volume经过nova volume-attach挂载到云主机,但不安装ext4文件系统
此时数据盘无读写io,rbd 的custmized-hdd池中的volume仍然没有数据,4个节点的osd无写io现象
(3)格式化云硬盘并mount
格式化/dev/vdb为ext4,不挂载,此时rbd 的custmized-hdd池中的volume增长大约140MB的数据
再将数据盘挂载到/mnt上,出现写io,osd和云硬盘盘都监控到有写的吞吐,持续大约5分钟中止,平均吞吐在5MB/S-7MB/S,产生的数据总和为=300秒*5MB=1500MB左右
查下存储池该volume是否真增长这么多数据?检查rbd 的custmized-hdd池中的volume,仍然使用rbd diff计算这个volume实际占用容量,发现增长了1.5GB的数据,总容量到1743B,以下图
再和object总数作个核对,Rbd下该卷存在498个object,以4MB一个计算总和不到1.9 GB,考虑到volume刚建立时,前期的object不满4MB,和rbd diff计算得出基本一致,以下图:
看完云硬盘挂载到虚拟机后,ceph底层存储的一系列表现,咱们不妨停下来思考一下,整理思路:
(1)Mount云硬盘以后,写操做持续了5分钟,是实实在在的在存储池下产生数据的,这一点获得证明
(2)由于我使用的centos7.2系统,mount后会产生写操做,是否是linux的特性,须要在centos6.5上再证明一下
4 centos不一样内核下的表现
增长在cenots6.5下执行一样的挂载云硬盘、格式化和mount操做的测试场景,看是否存在一样的数分钟持续写情形。
(1)排查mkfs的差别
cenots6.5的vm格式化100GB云硬盘并mount,前期准确过程略,从mkfs开始,cenots6.5在mkfs过程当中,当执行到Writing superblocks and filesystem accounting information,明显要比cenots7.2要慢不少,cenots7.2执行这个操做是1秒左右,而cenots6.5须要40秒以上。
(2)验证mount后的云硬盘读写
使用cenots6.5建立vm,挂载100GB数据盘并mount后,也存在写io,但时间很短,大约十秒的时间
了解了不一样内核的os在执行格式化文件系统的差别,咱们再次停下来思考一下,整理思路:
(1)从上面的“排查过程二”下的第(2)步骤,初步得出一个是mkfs时一块儿写入io,一个是mount后再写入 ,应该是在Writing superblocks and filesystem accounting information过程当中存在的差别
(2)Centos7.二、Centos6.5在mount云硬盘后存在写io的差别,有点奇怪了,须要排查下是哪一个进程在写
5 根本缘由浮出水面
经过iotop查询vm中进程的读写io实时数据,排查下Centos7.二、Centos6.5的差别到底在哪。
前期准备再也不反复描述,咱们直接观察两个阶段的写状况,一个是mkfs过程,一个是mount后
(1)找到Centos7.2是哪一个进程在写
由于Centos7.2的Mkfs秒级操做,iotop显示mkfs时写实时吞吐为54MB/S,再从云硬盘mount后开始,在vm中执行iotop后发现Centos7.2 上只有ext4lazyinit进程存在io写,实时吞吐为7MB/S,以下图
(2)找到Centos6.5是哪一个进程在写
Centos6.5是在mkfs时有点慢,在vm中执行iotop后发现Centos6.5 上是mkfs进程存在io写,实时吞吐为58MB/S,以下图
很明显,Centos7.二、Centos6.5在mkfs、mount云硬盘过程存在写io的差别
ext4lazyinit,直译为ext4惰性初始化,经过调研在cenots7之后,内核3.10以后,操做系统对格式化分区是经过ext4lazyinit实现,好处就是能迅速的建立文件系统,会把文件系统初始化的工做推迟到挂载后进行。
这样一来对于用户感官来讲,格式化云硬盘速度很是快,体验很棒。但这样的状况,就须要再mount以后,最好是等待数分钟以后再操做硬盘分区。
总结
前文说到在cenots7之后,内核3.10以后,在格式化分区上流程的变动,带来用户体验的优化。
须要注意的是,文件系统惰性初始化时间是根据云环境的网络、磁盘qos综合衡量,并不固定。而且对于操做系统的使用者来讲属于黑箱,你惟一能作的,就是让磁盘冷静会,特别是性能评估,就须要在mount以后等待数分钟后再执行,防止数据的不许确。
值得一提的是,在cenots7更新以后,带来一些新的特性,对应其余性能上也会带来提高,以下表中:
Systemd的做用其实不新鲜了,早在2015年时我在中科院软件研究所从事国产操做系统研发时就实际应用过。
以往在linux各类发行版本中,采用这种方式的并很少,linux各类服务器版本给用户带来的性能提高并不明显,但若是加载到centos桌面版,会有明显的感官,从启动系统到完成桌面加载的时间变快了,谁不但愿打开系统的时间越短越好呢,但也有弊端,增长了xorg崩溃的风险。 更高性能的KVM内核虚拟化支持,减小了云平台上层到底层的io链路,理论上应该能对虚拟化资源的响应带来性能优化,目前尚未对此作过比较,后续再跟踪。