原文为vfio mediated device内核文档[5],我翻译一下。 1. Virtual Function I/O (VFIO) Mediated devices[1] 对没有内置SR-IOV功能的设备进行DMA虚拟化的需求越来越多。以前,为了虚拟化一个这样的设备,开发者需要自己开发管理接口和API,然后把它们集成到用户态应用中。为了简化这种用户空间软件集成,我们找出了这种设备公共需求然后开发了一种统一的接口。 VFIO驱动框架为直接设备访问提供了统一的API。它将设备直接访问安全地(以一种IOMMU保护的环境)暴露给用户,是一种IOMMU/设备无关的框架。此框架用于多种设备,如GPU、网卡和计算加速器等。有了这种直接设备访问,虚拟机或者用户态应用可以直接访问物理设备。Mdeiated devices便是重用了VFIO这种框架。 Mediated core driver为mdiated device提供了一个公共的管理接口,它可以被不同类型的设备驱动所利用。这个模块提供了的通用接口可以进行如下操作: 创建和删除mediated device 把一个mediated deivce加入或移出某个总线驱动 把一个mediated device加入或移出某个IOMMU group Mediated core driver也提供注册总线驱动的接口。比如,一个mediated VFIO mdev驱动就是为mediated devices设计的,并且支持VFIO的API。Mediated bus driver可以将一个mediated device加入或者移出一个VFIO group。 以下的上层图展示了VFIO mediated driver框架的主要组件和接口。这张图展示了NVIDIA、Intel和IBM设备,因为这些设备是首先使用这些模块的。 +—————+ | | | +———–+ | mdev_register_driver() +————–+ | | | +<————————+ | | | mdev | | […]

本文是VFIO内核文档[1]的翻译。 很多现代系统提供DMA和中断重映射工具来帮助保证IO在被指定的界限中进行。包括x86硬件的AMD-Vi和Intel VT-d,POWER系统的Partitionable Endpoints (PEs)和嵌入式的PowerPC系统(如Freescale PAMU)。VFIO driver是IOMMU/设备不可知的一个框架,它只是专门用于将设备在安全的、IOMMU保护的环境下直接暴露给userspace。换句话说,VFIO允许安全且非特权的用户态驱动。 我们为什么需要VFIO?一个原因是虚拟机经常时用直接设备访问(“device assignment”)来获得尽可能高的IO性能。从设备和host的角度,这其实就是把VM变成了一个用户态驱动,VM也因此获得了这个IO设备的低延迟、高带宽和全虚拟化原生(bare-metal)设备驱动的直接应用。 一些应用场景中(特别是这高性能计算领域),也会从低开销的从用户空间的直接设备访问获得好处。例子包括网卡(通常基于非TCP/IP)和计算加速器等IO设备。在VFIO之前,这些驱动必须经过很长的开发周期来成为上游驱动、单独分支维护,或者使用UIO框架(UIO并不支持IOMMU保护,并且对中断支持有限,还需要root权限来访问PCI配置空间等东西)。 VFIO驱动框架用来将所有东西统一起来,代替KVM PCI设备assignment的代码,并提供一个比UIO更安全、功能更丰富的用户态驱动环境。 Groups、Devices和IOMMUs 设备是任何IO驱动的主要目标。设备一般会创建包括IO访问、中断和DMA在内的编程接口。不讨论每个驱动的细节,DMA通常是保证安全环境的最重要的部分,这是由于如果不对设备向物理内存的读写操作不设限制,将会造成对整个系统造成极大威胁。 为了减小这种风险,很多现代IOMMU将隔离特性加入到负责地址转换的接口中,这解决了设备在受限制的地址空间的寻址问题。有了这种介质,设备之间或者设备和某块内存间可以实现有效的隔离,这也允许了设备到虚拟机的安全直接管理。 这种隔离性的粒度并不总是单个设备,即使IOMMU可以做到这点,设备的属性、连接方式和IOMMU拓扑结构都可能会减弱这种隔离性。比如,一个独立的设备可能是一个更大范围设备集合的子集,那么即使IOMMU可以辨识出在这一集合中的不同设备,这个集合中的transactions也不会需要经过IOMMU。例如,从一个functions之间有后门的多function PCI设备,到一个non-PCI-ACS (Access Control Services)bridge的任何东西都允许不经过IOMMU的重定向。拓扑结构也在隐藏设备这件事中扮演着很重要的角色。一个PCIe-to-PCI的bridge隐藏了它之后的所有设备,让transaction看起来就来自bridge本身。显然,IOMMU也承担了主要的任务。 因此,虽然大多数情况下IOMMU可以达到设备级的隔离粒度,系统一般也是容忍这个粒度被放宽的。IOMMU API也因此支持IOMMU group的概念。一个group就是一组设备的集合,这组设备隔离于系统的其他设备。Group因此也是VFIO所用的ownership的单元。 虽然group是保证用户访问安全的最小粒度,它并不一定是最好的粒度。在使用page tables的IOMMU中,多个groups之间共享一组page table是可能的,这减小了硬件平台的开销(减少TLB thrashing、减少重复page table等),也减小了用户的开销(只编写一个set的转换即可)。因此,VFIO使用了一个container的概念,一个class可以包括一个或者多个groups。创建一个container很简单,只要打开/dev/vfio/vfio字符设备即可。 Container自身只提供很少的功能,。。。 用户需要将group加到container中来获得下一级的功能。要这样做,用户首先需要找到所关心设备所属的group,这可以用下边例子中的sysfs链接办到。通过将设备从host驱动解绑并绑定到VFIO驱动上,一个新的VFIO group会出现为/dev/vfio/$GROUP,其中$GROUP是IOMMU的group number,目标的设备是这个group的成员。如果IOMMU group有多个设备,那么这个VFIO group可用前,每个设备都需要绑定到一个VFIO驱动上(只是将所有设备从host驱动解绑也可以,这也会让group可用,但是没有绑定VFIO设备的特定设备不可用)。待定:禁用驱动probing/locking一个设备的接口。 如果group准备好了,可以通过open这个VFIO group字符设备(/dev/vfio/$GROUP)将这个group加入到container中,并用ioctl的VFIO_GROUP_SET_CONTAINER参数将打开的container文件描述符fd传入。如果需要在多个group间分享IOMMU上下文中,过个group可以被设置(set)到一个相同的container。如果一个group无法被set到一个container,那么一个空的container将被使用。 如果一个或多个group被加入到一个container,那么剩下的ioctl参数就可用了,可以访问VFIO IOMMU接口了。而且,现在在VFIO group的fd上用ioctl可以得到每个设备的文件描述符。 VFIO设备的API包括描述设备、描述IO region、描述设备描述符上read/write/mmap偏移量的ioctl参数,也包括描述和注册中断通知的机制。 VFIO使用实例 假如我们想访问PCI设备0000:06:0d.0: $ readlink /sys/bus/pci/devices/0000:06:0d.0/iommu_group ../../../../kernel/iommu_groups/26 因此这个设备在IOMMU group 26。这个设备在pci bus上,所以用户会用vfio-pci管理这个组: # modprobe vfio-pci 绑定这个设备到vfio-pci驱动并为这个group创建VFIO […]

原文是性能优化大神Brendan Gregg的一篇17年的博客”CPU Utilization is Wrong”[1],写的很有参考价值,我翻译一下。Youtube上也有与之对应的一个presentation: 我们大家用的“CPU占用率”这个指标存在很大的误导性,而且这种误导近年来越来越严重。什么是CPU占用率,它是指你的处理器到底多忙吗?不,那并不是它所能反映出的。是的,我正要讨论%CPU这个大家都处都在用的性能指标(包括每一种的性能检测软件,包括top工具)。 你以为90%的CPU占用率是这样时, 其实它有可能是这样的: Stalled指的是处理器不能继续执行指令,这基本是由于CPU在等待内存IO。上边我所画的busy和stalled的比例正是我在真实的生产环境所见的。所以,很有可能你在内存stall时,并没有察觉到。 对我们来说这意味这什么?明白了我们的CPU有多少被stall可以让我们直接将性能优化的努力放到减少不必要的代码和内存IO。能搞清楚CPU占用率中有多少比例的stall成分,任何关注CPU性能的人(尤其当程序运行在是根据CPU来自动扩展的云环境中时)都能获得好处。 到底什么是CPU占用率 CPU占用率这个指标其实就是“非空闲时间”,即CPU没有在跑idle线程。OS内核经常会在上下文切换时进行追踪操作,如果非空闲线程开始跑并在100毫秒后停下来,那么内核认为CPU被全部占用。 这个指标和分时系统一样古老。阿波罗登月舱的指挥计算机(分时系统的先驱)把它的idle线程称为”哑任务(dummy job)”,工程师们通过追踪运行哑任务和其他运行真实任务的cycles来得到这一重要的计算机占用率指标。(就像我以前所写一样。) 那么问题出在哪呢? 当今,CPU比主存更快,因此“等待内存”成为了“CPU占用率”的主要部分。当你在top工具中看到高的%CPU时,你可能会认为处理器(在散热器和风扇下的CPU封装)是瓶颈,不过其实都是那些DRAM内存的问题。 这种情况越来越糟,一直以来,处理器时钟的增速都要大于DRAM访问延迟的增速(“CPU-DRAM鸿沟”,译注:也叫“内存墙”)。这种局面持续到2005年的3 GHz处理器,从那以后,处理器往多核、超线程、多socket发展,这些都提升了对内存子系统的需求。处理器厂商尝试用更智能的CPU cache、更快的内存总线和互联网络来解决这些问题。但是我们仍然经常面临stall问题。 怎么知道CPU正在干什么 通过使用性能监测计数器(Performance Monitoring Counter, PMC) :一种可以用Linux perf或其他工具读取的硬件计数器。比如我们可以这样监测整个系统10秒钟: # perf stat -a — sleep 10 Performance counter stats for ‘system wide’: 641398.723351 task-clock (msec) # 64.116 CPUs utilized (100.00%) 379,651 context-switches # 0.592 K/sec (100.00%) 51,546 cpu-migrations […]

(翻译自qemu 3.0的文档) qemu-img [standard options] command [command options] qemu-img 允许你离线地创建、转换或者修改镜像文件。它可以处理所有QEMU支持的镜像格式。 注意: 千万不要用 qemu-img 修改虚拟机(或者其他程序)正使用着的镜像,因为那可能会破坏镜像;对应的,如果读正在修改的镜像,也可能会有不一致的状态产生。 1. Standard options: ‘-h, –help’ 显示帮助信息。 ‘-V, –version’ 显示版本信息。 ‘-T, –trace [[enable=]pattern][,events=file][,file=file]’ Specify tracing options. 指定tracing选项: ‘[enable=]pattern’ 以parttern来指定启动的events。这个选项仅在编译了simple、log或ftrace等3个tracing后端时才能用。要启用多个events或者patterns,用多个-trace即可,用-trace help可以打印列出trace points名称。 ‘events=file’ 马上开启file中列出了的events名称,file中每行为一项event名称或者patterns (存在于trace-events-all文件中的)。同样,这个选项仅在编译了simple、log或ftrace等3个tracing后端时才能用。 ‘file=file’ 将traces的输出打印到log文件中。同样,这个选项仅在编译了simple、log或ftrace等3个tracing后端时才能用。 2. Command: 以下是被支持的命令: amend [–object objectdef] [–image-opts] [-p] [-q] [-f fmt] [-t cache] -o options filename […]

原文出处:QEMU当前的文档 qemu/docs/devel/tracing.txt 一、介绍 这篇文档描述了QEMU追踪的整体架构和如何使用追踪功能来进行debug、性能分析或者监测运行状况。 二、快速开始 步骤1. 编译QEMU时带上’simple’trace追踪后端: ./configure –enable-trace-backends=simple make 步骤2. 创建一个写有你想追踪的事件(events)的文件 echo memory_region_ops_read >/tmp/events 步骤3. 运行虚拟机来产生一个追踪文件 qemu -trace events=/tmp/events … #加上其他你需要的qemu选项参数 步骤4. 以美观的形式打印出二进制的追踪文件Pretty-print the binary trace file: ./scripts/simpletrace.py trace-events-all trace-* #用QEMU的进程号(pid)来代替”*” 三、Trace events 1. 设置子文件夹 Sub-directory setup 在源码目录的每个文件夹中都可以在trace-events文件中声明一组静态的trace events。所有包含有trace-events文件的子文件夹必须被列在源码根目录Makefile.objs的trace-events-subdirs项中。这样在编译时,被列出的子文件夹的trace-events文件就会被tracetool脚本处理来生成相关的追踪代码。 单独的trace-events文件会被merged到一个trace-events-all文件中,trace-events-all文件也将会被安装到/usr/share/qemu目录中,并改名为trace-events,这个文件最终会被simpletrace.py脚本用作simpletrace数据格式的追踪分析。 在子文件夹中,以下的文件会被自动生成 trace.c – the trace event state declarations trace.h – the trace event enums […]

原文:The technology to make ‘Silicon Valley’s’ decentralized ‘new internet’ already exists( http://mashable.com/2017/04/24/is-silicon-valley-new-internet-possible-or-not/#6cEY_p263PqN ) 作者:RAYMOND WONG 时间:APR 25, 2017 “给你无限的时间和资源,你想用你的压缩算法做出什么都行……什么都行,说出来是什么,3,2,1……说!”美剧《硅谷第四季》中的“变态”亿万富翁Russ Hanneman对主角Richard Hendricks喊道。 “一个全新的互联网”,可爱的程序猿Richard说。 “我们曾用一台掌上电脑的计算能力把一个人放在月球上”,Richard继续说道,“我们现在手机上的计算能力要比那强几十万倍,但这些手机却都只是躺在口袋里什么都不做。所以我想到这个,有数十亿的手机在世界各地拥有相同的计算能力,只是闲在人们的口袋里。“ “然后我想,如果我们使用这些手机来构建一个庞大的网络呢?使用我的压缩算法来使一切数据变得很小,高效,到处传播。如果我们能做到这一点,我们可以建立一个完全去中心化的网络,那将是没有防火墙,没有收费,没有政府监管,没有间谍的互联网。信息因此在各种意义下都将是完全自由的。“ Russ不仅喜欢这个看似疯狂的想法,还答应投资。Russ还分解了Richard的数据压缩初创公司Pied Piper,迫使他退出,以便让他弄清楚如何将“新互联网”变成现实。 “我不知道是否可行”,Richard承认,“我还没有仔细去想过。” 这正是观看剧集的粉丝们一直想知道的, Richard的“新互联网”到底是真的可能呢,还是只是电视上编造的? 当今的互联网是去中心化和中心化的混合体。 任何人都可以创建一个去中心化的点对点(P2P)网络,让设备间直接连接,比如BitTorrent。同时,任何人也可以去创建一个中心式网络,通过服务器传递数据,多数大型在线服务都是如此,如Google,Facebook和Twitter。 加密的、去中心化的网络的好处是显而易见的:安全性和隐私性。 由于数据在分散的网络节点上存储和传递,没有任何在线服务或者政府可以在你不知情的情况下窥探你的数据。 Mesh Network 理论上,可以有几种方式来构建这个“新互联网”。 第一个是Mesh Network(网状网络),它是由任意数量的设备或节点组成,数据在节点之间传递。手机应用Firechat是使用mesh network的完美示例,它通过蓝牙让手机间相互连接。 事实上,一些狂热的reddit用户在《硅谷》下一集的预告视频中Richard的白板涂鸦上发现了一些线索,表明剧中他至少考虑了mesh network。使用mesh network并依赖蓝牙等无线协议的缺点当然是较小的覆盖范围和较慢的传输速度。你的设备与其他设备的连接质量要取决于各个设备的蓝牙规格。虽然你可以通过你和你要连接的设备的路径中间有其他节点“中继”来解决这个问题,但并无法保证每次都有中间节点。 另一方面,蓝牙4.0只有200英尺的范围,蓝牙5.0的新设备也能达到800英尺。此外,蓝牙5.0将带宽从4.0的25Mbps提高到50Mbps。虽然不如千兆的Wi-Fi或LTE,但嘿,隐私和安全更比速度更重要,对吧? 也就是说,剧中Richard的能“使一切都变小,高效”的超级强大的压缩算法,将是使mesh network成为可能的特殊要素。 Maidsafe & Storj Richard实现他宏伟计划的另一种可行方式,是像Maidsafe的SAFE网络或Storj的P2P网络。虽然它们仅用于去中心化的文件存储,但我并不认为像Richard那样的代码狂人无法调整这些结构。SAFE网络自称为“新的去中心化互联网”,很大程度上承诺了Richard的想法,只不过它没有使用闲置的手机计算资源,而是使用的PC。 根据该公司的说明,用户可以无须验证地创建一个帐户,然后决定贡献分配给SAFE网络的空间。 然后,Maidsafe会向贡献存储空间的用户支付“Safecoins”(一种具有真实市场价值的加密虚拟货币)。用户向“vault”贡献越多的存储空间,就会得到越多的Safecoins。Maidsafe以此来进一步激励用户加入SAFE网络。 在文件被上传之前,它被先被加密,然后分解成较小的数据包并分散到网络中去。数据存储是存在冗余的,并且在计算机打开时,文件会在网络上自主移动。简单说,“新互联网”上所有的数据都是分块、加密存储在所有设备上的。在网络上所有设备上的碎片加密件中。 当你需要访问自己的数据时,只需从其他设备下载各部分就可以了,这基本上就和BitTorrent一样了。 SAFE网络现在只是在进行alpha测试,但是更接近公开发布。 虽然它只适用于Windows/Mac/Linux,但公司未来也会考虑移动平台。去年在TechCrunch上,Maidsafe创始人David […]

译者的废话 这是Red Hat RHEL 7文档中关于KVM虚拟机超量分配的说明文档,这里说的KVM,应该就是适用QEMU管理的KVM虚拟机的,因为在启动QEMU虚拟机的时候,只要-smp N和-m N参数分别就可以指定虚拟机的vCPU数和内存数,我实际实验发现,它们是都可以超过实际的物理CPU核数和内存大小的。 硬件资源超量分配,说的好听是节约资源,但是资源的分配超的不切实际,也就是”VPS超售”的万恶之源。。。比如一个4核8G内存的服务器,碰上黑心商家,不知道会被分出多少个1核1G内存的小崽子呢。。。不过这里Red Hat只是给出技术上的建议,没有提及VPS超售问题。嗯,做技术,不可耻。。。 原文: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Virtualization_Deployment_and_Administration_Guide/chap-Overcommitting_with_KVM.html#sect-Overcommitting_with_KVM-Introduction 简介 KVM hypervisor支持CPU和内存的超量分配。超量分配就是划分的虚拟CPU(vCPUs)或者内存比系统的实际物理资源多。通过CPU的超量分配,使用中的虚拟服务器或桌面就可以在更少的服务器上跑了,节省了不少系统资源,同时会减少电源、冷却等硬件方面的投资。 由于大多数进程始终不能访问其分配的内存的100%,因此KVM虚拟机可以利用此行为来分配给客户机虚拟机的多于实际可用的内存空间。 内存的超量分配 注意!

原文: [MySQL 5.7 Reference Manual 15.9.2 InnoDB Page Compression] https://dev.mysql.com/doc/refman/5.7/en/innodb-page-compression.html InnoDB支持file-per-table表空间中的表的页级压缩。 此功能称为透明页压缩。 通过使用CREATE TABLE或ALTER TABLE指定”COMPRESSION”这个表属性来启用页面压缩。 支持的压缩算法包括Zlib和LZ4。 支持的平台 页面压缩需要稀疏文件(sparse file)和打洞(hole punching)支持。 页面压缩在使用NTFS的Windows上被支持,并且在以下MySQL支持的Linux平台发行版的内核级别提供了打孔支持: RHEL 7 and derived distributions that use kernel version 3.10.0-123 or higher OEL 5.10 (UEK2) kernel version 2.6.39 or higher OEL 6.5 (UEK3) kernel version 3.8.13 or higher OEL 7.0 kernel version 3.8.13 or […]