最近看邮件,有注意到pv ticketlock相关的消息,貌似jeremy 几年前的东东,终于将要被收录到linux 3.12里面。

先说下pv ticketlock这东西,http://blog.xen.org/index.php/2012/05/11/benchmarking-the-new-pv-ticketlock-implementation/ 这里面介绍的非常详细,不想看英文的话,我可以大概解释下。

spinlock在非虚拟化的环境下,它是可以认为cpu不会被抢占的,所以A拿锁干活,B死等A,A干完自己的活,就释放了,中间不会被调度。但是在虚拟化下,cpu对应到vcpu, 每个vcpu跟之前裸机上的进程调度一样,所以A拿锁干活,并不一定不会被抢占,很有可能被调度走了,因为cpu这时候还不知道vcpu在干嘛。B死等A,但是A被调度了,运行了C,C也要死等A, 在一些设计不够好的系统里面,这样就会变得很糟糕。

为了保证spinlock unlock的公平性,有一种队列的spinlock,ticketlock, http://www.ibm.com/developerworks/cn/linux/l-cn-spinlock/这篇文章介绍的非常详细,总之根据next, own,来判断是否到自己了。这样一种机制在裸机上是可以解决公平的问题,但是放到虚拟化环境里,它会使问题变得更糟。C必须等到B完成才可以,如果中间B被调度了,又开始循环了,当然更糟的定义也是相对的,如果vcpu的调度机制能够vcpu正在拿锁的话,会怎样?

jeremy很早就写了一个pv ticketlock,原理大概就是vcpu在拿锁了一段时间,会放弃cpu,并blocked,unlocked的时候会被唤醒,这个针对PV制定的优化,在vcpu拿不到锁的场景下,并没有任何的性能损耗,并且能够解决之前的问题,但是当运行native linux的时候,就会有性能损耗,所以当时在config里面添加了一个编译选项CONFIG_PARAVIRT_SPINLOCK,话说我们的系统里面,这个是没打开的啊,后面要再好好评估下

之后,这个patch进行了改良,在原有native linux的ticketlock的基础,增加了一种模式,通过检测cpu是否spinned一段时间,判断是否要进入slow path,之前的fast path的逻辑和原来保持不变,进入slowpath后,会在ticketlock里面置位,并block vcpu,等unlock的时候,这个位会被clear,因为占用了一个位,所以能用的ticket少了一半。

这个方案在一些硬件(XEON x3450)上进行各种benchmark测试后,结论是不再有任何的性能损耗。

好吧,说了这么多理论性的东西,再来说下,我们实际遇到的问题。 很早以前经常有windows用户的工单投诉,说自己的vm里面cpu没有怎么使用,为什么cpu显示百分之百。

由于是windows系统,加上我是小白,很难给出一些技术细节上的分析,只能通过简单滴一些测试实验进行调查。

最后的结果,就是windows很多核的情况下,比如12、16, 在一个稍微有点load的物理机上面,跑一些cpu压力,就很容易出现cpu百分百的问题,后面降core之后,情况有所缓解。后面大致的分析结果是,windows里面很多操作是用到spinlock的,当一个core拿到锁,事情没有做完,被调度了,这时其他的core也需要拿锁,当core越来越多的时候,情况就越来越糟,最后看上去就大家都很忙,但实际什么事情也没做。

目前来看,已经有一种较为成熟的软件方法来解决类似问题,期待后续是否会有硬件的一些特性来支持,或许已经有了。

pv ticketlock解决虚拟环境下的spinlock问题的更多相关文章

  1. Mac-OSX的Python3.5虚拟环境下安装Opencv

    Mac-OSX的Python3.5虚拟环境下安装Opencv 1   关键词 关键词:Mac,OSX,Python3.5,Virtualenv,Opencv 2   概述 本文是一篇 环境搭建 的基础 ...

  2. windows 虚拟环境下 安装 mysql 引擎一系列错误处理

    报错现象 运行django 报错. 很明显是缺少引擎 下载引擎 django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb m ...

  3. 完美解决 Linux 下 Sublime Text 中文输入

    首先,我参考了好几篇文章,都是蛮不错的,先列出来: sublime-text-imfix:首先推荐这个方法,最简单,但是在我的系统上有些问题.可用这个的强烈推荐用这个 完美解决 Linux 下 Sub ...

  4. [转]解决IIS下UTF-8文件报错乱码的问题

    找了两天才找到解决办法…….晕晕晕...用第二种方法解决了. 网上找到的方法都没有写这一条 If objASPError.ASPDescription > "" Then 后 ...

  5. 解决IE6下png图片透明度不显示的问题

    世界上最遥远的距离,不外乎我在搞前端,你却在用旧IE,现在随着XP要退休了,IE6的市场占有率应该也会逐步下滑.不过基于天朝人民的惰性以及企鹅微软的“扎篱笆”活动,做网站的朋友依旧不能忽视IE6的存在 ...

  6. 解决Windows下运行php Composer出现SSL报错的问题

    解决Windows下运行php Composer出现SSL报错的问题 2015-01-14 20:05   在windows下运行composer却出现SSL报错: E:\www>php -f  ...

  7. 解决Ubuntu 下 vi编辑器不能使用方向键和退格键问题

    转自:http://blog.csdn.net/sky101010ws/article/details/51012103 使用vi命令时,不能正常编辑文件,使用方向键时老是出现很多字母 这个问题主要是 ...

  8. 复制到剪贴板的JS实现--ZeroClipboard (兼解决IE下兼容问题)

    复制到剪贴板的JS实现--ZeroClipboard (兼解决IE下兼容问题) 相信绝大多数人都遇到过这样的功能实现,“复制”或者“复制到剪贴板”这样的功能.但是由于各大浏览器的实现方案不一样,导致几 ...

  9. 解决Ubuntu下Sublime Text 3无法输入中文

    前言 sublime很好用,但是ubuntu下不能输入中文,这是一个很大的问题.不知道为什么开发着一直也不解决,好在还是有高手在,总能找到方法.网上方法很多,但是也很乱,现在我将自己的经验总结一下. ...

随机推荐

  1. Android 数据库ORM框架GreenDao学习心得及使用总结<二>

    转:http://blog.csdn.net/xushuaic/article/details/24496191 第五篇 查询 查询会返回符合某些特定标准的实体.你可以使用原始的SQL定制查询语句,或 ...

  2. js私有化属性

    我们先来看一个例子: var Demo1 = function(val){ this.value = val; this.getValue = function(){ return this.valu ...

  3. struts2笔记02-action和Action类

    1.action      action表示一个struts2的请求! 2.Action类 能够处理struts2请求的类. (1)属性的名字需要与JavaBeans属性保持一致. 属性的类型可以是任 ...

  4. C++设计模式之命令模式

    厨师类: #include "Cooker.h" Cooker::Cooker(void) { } Cooker::~Cooker(void) { } void Cooker::M ...

  5. [虚拟化/云] kvm的架构分析

    预备知识 1. 客户机物理页框到宿主机虚拟地址转换 http://blog.csdn.net/zhuriyuxiao/article/details/8968781 http://www.tuicoo ...

  6. python-聊聊反射

    反射 对于初学python可能较难理解,但反射是非常有用. 试想一下,当别的程序传入给你写的这段代码一个变量(var=“math”),这个变量是一个字符串,这个字符串是一个模块或者一个模块下的某个方法 ...

  7. C++一维数组和指针的关系总结

    对于数组int a[10]; a表示数组的第一个元素的地址,即&a[0]; 如果使指针p,指向数组的首元素,可以进行操作: int * p=a; 或者 int *p=&a[0]; 那么 ...

  8. 一起学习iOS开发专用词汇,每天记3个,助你变大牛

    大家做开发最大的问题是什么?英语的问题应该困扰很多的同学的地方,我们提倡科学学习开发中的常用词汇.我们不要求大家有特别好的听.说.写,只要能够记住,能够认识这些常用词汇你以后的开发也将游刃有余.我们的 ...

  9. .net string format

    转自:http://www.cnblogs.com/jobs2/p/3948049.html 转自:http://jingyan.baidu.com/article/48206aeaf8c52f216 ...

  10. C++_基础_运算符重载2

    内容: (1)只能用成员形式重载的运算符 (2)new/delete操作符的重载 (3)封装和继承的初识 (4)继承的特性 (5)子类及其函数的特性 (6)多重继承和虚继承 1.只能用成员形式重载的运 ...