下面就自己感兴趣的RedHat 7.0 beta的new features整理了下,并简单的发表了下自己的看法。 1. GRUB 2 redhat 7.0 beta版将之前使用的Boot Loader从GRUB升级到了GRUB2,主要是基于GRUB2以下四个比较显著的特点: (1)GRUB2支持更多的硬件体系结构,比如PowerPC (2)GRUB2支持更多的固件类型,比如BIOS,EFI和OpenFirmware (3)GRUB2除了支持MBR(Master Boot Record)磁盘分区表,还支持GPT(GUID Partition Tables) (4)GRUB2除了支持linux文件系统外,还支持一些非linux文件系统,比如苹果的HFS+和微软的NFS文件系统 2. Storage (1)LIO Kernel Target Subsystem 这里重点强调了RedHat 7.0的iscsi target使用LIO(linux-IO Target)代替了tgtd,与tgtd相比,LIO有以下优点(个人理解): •tgtd是个user space的daemon,而LIO是个kernel driver,LIO的性能更优; •LIO采用了一种统一的方式来对当前的iscisi protocol进行配置和管理,即统一的接口,更强大的配置和管理方式。 (2)Fast Block Devices Caching Slower Block Devices linux内核支持的以一种block-level caching solution,即使用高速的存储设备作为低速存储设备的cache。 目前,比较流行的block-level caching solution有dm-caceh, bcache,flashcache和enhanceio等。 其中dm-cache被merge到linux-3.9内核中,bcache被merge到linux-3.10内核中,后两者是facebook提出的,现在应用也比较广。下面简单介绍下block-level caching(以dm-cache为例)的原理,后续如果有时间会详细分析。
linux kernel通过增加virtual cache devices设备来作为cache设备的抽象,virtual cache device基于三个physical devices来实现: origin device: slower physical device,比如Hard Disk Device,数据最后持久化存储的位置 cache device: fast physical device, 比如SSD,数据暂时存储的位置 metadata device:元数据设备,可以用SSD(即cache device和metadata deivce可以是一块SSD的两个分区),用来配置cache placement policy(cache的块替换策略),dirty block flags(记录cache中被修改过的块,即脏块)以及其他内部数据 简单来讲,当读数据的时候,会查找metadata device看请求块是否在cache device中命令中,如果hit,则直接从cache device获取,如果miss,再从origin device获取,同时将数据读到cache device中。当写数据的时候,根据cache placement policy配置的策略的不同, 执行对应的写操作,当前支持的policy有:writeback和writethrough,默认为writeback,即先写到cache device中,并在metadata device中记录写过的块为dirty,此时写操作就完成了。每个一段时间cache device中的dirty block会被flush到origin device中。 3. File System 通过图形界面安装的redhat 7.0采用XFS作为默认的文件系统,具体XFS相关的内容可参见XFS的相关介绍。 4. Kernel (1)增加硬件支持的APIC虚拟化 APIC相关的操作都是特权操作,当vcpu在接收到APIC interrupt时,就会从Guest Mode切换到Kernel Mode,这极大的降低了系统的性能,通过增加硬件支持的APIC虚拟化,避免了这种切换。 (2)Full DynTick support 这个feature的意思是:当某个cpu上只有一个可运行的进程时,禁用这个cpu的tick(滴答,就是时钟中断),个人认为这是一个非常大的进步。这里先简单介绍下相关背景知识,后续有时间详细分析。 估计大家都听说过HZ,常见的HZ有:100,250,300,1000, 一般桌面版默认设置为250(server版为1000),即每秒产生250个时钟中断(tick,滴答),主要是用来给scheduler来做调度的时间度量。 如果cpu的idle的情况下,每秒仍然会有1000个时钟中断,即cpu即使idle也是在做时钟中断处理的,于是后来出现了NO_HZ,即如果cpu处于idle,就禁用时钟中断,通过CONFIG_NO_HZ来配置(至于此时如何计时,在此不作讨论)。 再后来,如果当钱cpu只有一个任务可运行,那么如果禁用使用中断的话,当前任务仍要被打断250次或1000次,所以也没有必要,就出现了CONFIG_NO_HZ_FULL(就是这里的Full DynTick Support)。 最后,必须承认采用了tickless必然也会带来一些缺点,在此也不做详细分析。 (责任编辑:IT) |