2009年5月19日星期二

解读比亚迪成长之路

  金融海啸席卷全球,股权投资哀鸿遍野。2008年9月29日,“股神”巴菲特看好比亚迪的新能源汽车业务,逆势出手,以2.25亿美元换购了比亚迪股份有限公司(1211.HK)10%的股份。此举“一石激起千层浪”,全球汽车业界认为巴菲特被中国企业忽悠了,中国企业怎么可能生产连美、日、德企业都生产不了的新能源汽车。
  在收购3个月后,全球首款不依赖专业充电站的新能源汽车——比亚迪F3DM双模电动车在中国上市,售价14.98万元,比全球同类型汽车商用时间表提前了3年甚至更长时间。比亚迪股价应声而涨。以截至今年5月2日的收盘价计算,巴菲特投资比亚迪已经净赚48.15亿港元。
  巴菲特的慧眼,从另一角度诠释了比亚迪的奇迹:
  从1995年创立时的2000万元销售额起步,到2008年底销售额达350亿元,比亚迪销售规模总是以每年翻一番的速度惊人地增长着。
  从毫无电池技术积累,到全球锂电池大王;从简单生产线起步,到全球手机IT电子重要代工厂;从生产电池到生产汽车以及到生产新能源汽车,比亚迪自信心爆棚地实现着业界认为不可能的一件又一件的事情……
  “再贵的汽车也不过一堆钢铁。”在国外技术壁垒面前,比亚迪总是以一种近乎“狂妄”的自信气魄,屡屡叫板国际巨头。这种比亚迪式的创新自强,得到广东省委、省政府和深圳市委、市政府的大力支持。省委书记汪洋、省长黄华华多次到比亚迪调研,为比亚迪的自主创新撑腰;省委副书记、市委书记刘玉浦多次到比亚迪公司现场了解汽车研发进展情况,鼓励比亚迪“扛起中国汽车产业自主创新大旗”。市长许宗衡高度评价比亚迪式自信气魄:“你们是一群说到做到、真正干事的人!你们身上体现了一种拼搏精神、一种创新精神、一种民族精神,令人感动、令人鼓舞、令人震撼!”
  政府的关心、支持和呵护,换来的回报是一个又一个自主创新的成绩。谈到造车事业的未来,比亚迪创始人王传福眼中甚至容不下“世界第二”称号。他严肃地表示,10年前,谁都不相信中国能生产锂电池;5年前,谁都不相信中国能生产高端手机,现在到了改写“中国制造”内涵的时候了——“中国制造”不是“低端制造”代名词,也能像“日本制造”和“德国制造”一样充满含金量!通过全程创新、垂直整合,“‘微笑曲线’含金量最高的两端,已向‘中国制造’伸出了欢迎的双臂!”
  上篇
  围绕国情破解国外技术壁垒
  【核心提示】
  “当时锂电池是很高门槛的行业,第一个发明和制造的都是日本人,一条生产线日企要价一两亿美元。一亿美元对我们来说想都不要想。但是我们又想做,结果只能自己摸索走自己的路。”比亚迪创业和成长历程充满了中国特色。首先是通过劳动密集型方式化解技术壁垒,实现“饭碗创新”,然后在技术学习和流程改良中走上自主创新之路。企业努力加上深圳市委、市政府对自主创新的全方位支持,比亚迪积聚了独特的“无所畏惧”的自强自信资本。
  技术摸索 流程创新掘就技术“第一桶金”
  这是一条充满中国国情的创业之路。
  1987年7月,21岁的王传福从中南工业大学冶金物理化学系毕业进入北京有色金属研究院,从事电池技术研究。5年过去,26岁的王传福被破格提拔为研究院301室副主任,成为当时全国最年轻的处长。1993年,研究院在深圳成立比格电池有限公司,王传福顺理成章成为公司总经理。
  在有了一定的企业经营和电池生产的实际经验后,王传福发现,当时2万-3万元一部的大哥大势必普及,这将开启一个不可估量的充电池市场。作为电池研究方面的专家,王传福坚信充电电池技术不是什么问题。1995年2月,王传福决定单干,注册成立了比亚迪科技有限公司,领着20多个人在深圳莲塘的旧车间里扬帆起航。
  当时日本充电电池一统天下。虽然国内有不少电池厂家,但多为买日本电芯搞组装的小企业。在成立之初,搞技术出身的王传福把目光投向技术含量最高、利润最丰厚的充电电池核心部件——电芯的生产。王传福在一份国际电池行业动态报告中发现,日本宣布本土将不再生产镍镉电池,而这势必会引发镍镉电池生产基地的国际大转移,比亚迪的黄金机遇来了。
  但是摆在比亚迪面前的困难一样不少。
  首先是一条镍镉电池生产线日企要价几千万元人民币,加上日本禁止出口,比亚迪要得到生产线无异于痴人说梦。比亚迪决定自造生产线和装备。根据中国劳动力资源多、成本低的国情,比亚迪拆解整个生产线流程,分解成一个个可以人工完成的工序。最后,比亚迪只花了100多万元人民币,就建成了一条日产4000个镍镉电池的生产线。
  这条生产线建成后,成为同行的另类风景线。日本的镍镉电池生产线,很多工序是机械手完成,整条生产线人员不超过20人,而比亚迪的生产线,俨然是劳动密集型加工场,生产线两端坐上成百上千个工人。比亚迪被当时业界戏称为“劳动密集型”的高新科技公司。
  虽然生产方式和流程不同,但比亚迪还是迈开了宝贵的第一步,并成功控制了产品质量。1996年,比亚迪公司取代三洋成为台湾无绳电话制造商大霸的电池供应商。大霸是电信巨头朗讯的OEM厂商,比亚迪公司因此成为朗讯的间接供应商,1997年比亚迪公司镍镉电池销售量达到1.5亿块,排名上蹿到全球第四位。
  重视研发 流程创新逐步走向自主创新
  流程创新让比亚迪首尝创新的甜头,更是比亚迪自主创新的星星之火。
  1994年10月,从江西铜业“下海”的孙一藻,被比亚迪委以镍电池生产设备开发的重任。这实际上要他一个人兼任材料采购、设备制造和管理的多重任务。起初他觉得很简单,比如做个混料机,无非是把马达、控制电源和变速箱进行组合。但他很快发现,自己必须尽快成为一个电池行家,因为电池的特性决定了各种设备必须加以创新、改进,否则造的设备固然廉价,但毫无用途。这些叫不出名字的特殊设备就是今天比亚迪各个工厂里大批使用的非标准的、半自动化设备的雏形。
  流程创新带动了装备制造的创新,并向材料创新、工艺创新等核心创新领域纵深推进。
  在生产镍镉电池时,比亚迪需要用到大量昂贵的镍片。在整个镍镉电池成本中,镍片成本占据大半份额。如果能找到取代镍片的方法,无疑可以大幅节减成本。为此,比亚迪不断研发和实验,终于找到代替镍片的办法——通过改造电池溶液的化学成分,镀镍片也可以代替镍片使用而不被腐蚀。仅此一项改进,比亚迪就砍掉了单项原料成本的90%。
  2000年,比亚迪决定进入锂电池生产领域。王传福带了200万人民币去日本买设备。结果日方开口就是500万美元。谈到生产线,日方漫天开价1亿美元,并直白相告:“你们中国人是不可能做得出锂电池的。”
这个设备王传福最终还是没有买。但他很快用镍电池生产线“拼凑”出一条锂电池生产线来:能兼容的就用镍电池生产设备,不能兼容的,就用人工和夹具来取代。如锂电池生产线要裁剪一块很大的极片,比亚迪买不起日本分切机,就用中国的裁纸刀,配上一块长宽相等的挡板作为夹具,进行人工剪裁。为取代昂贵的涂布机,比亚迪自产了该装备,第一代产品要分两道工序涂完双面,第二代就可以同时涂两面,到了第三代已经可以控制涂刷的具体位置了。
  比亚迪甚至进行了工艺创新的诸多尝试。如日本锂电池生产线要求拥有无尘真空生产空间,进生产线的工人,都必须穿好净化服,经过淋浴吹风之后走入宽敞明亮的真空车间。但这种“高科技环境”被比亚迪认为浪费成本。经过研究,比亚迪设计出一种无尘厢式生产线,工人只需戴上手套伸入无尘环境中,就可实现各项操作,开创了常温下生产锂电池的先例。
  生产流程和工艺的不断改良,直接提升了比亚迪电池的价格竞争力。有人算过一笔账,比亚迪一条日产10万只锂电池的生产线,需用工人2000名,设备投资5000万元人民币。而日系全自动生产线所需工人200名,设备投资1亿美元。分摊到每块电池上的成本费用比亚迪是1元人民币左右,日系厂商约在5、6元。
  今天,在比亚迪的电池工厂里,60%的生产设备都是自主研制。通过流程的拆解和创新,比亚迪的装备创新,带动了产品研发的全方位创新。到2000年,比亚迪拥有和掌握了自己的锂电池核心技术,成为摩托罗拉的首个中国锂电池供应商。2001年,比亚迪公司锂电池市场份额迅速上升到世界第四位,实现销售额13.65亿元,纯利高达2.56亿元。
  战略藐视 用知识产权破解国外技术壁垒
  虽然在海外市场不断攻城拔寨,在比亚迪眼中,企业发展最大障碍不是技术,而是架在中国企业头上的专利之剑。
  以技术为矛、专利为盾,GE、微软、丰田、索尼、诺基亚、三星等世界级企业在中国做到了不战而屈人之兵。以DVD生产为例,中国企业被迫为每台出口DVD机上交十几美元的专利费,这让不少中国企业有了这样的认知:技术天堑几乎无法逾越,掌握在别人手里的专利犹如一堵打不穿的铜墙和一条要命的绞索。在电池领域更是如此。作为后进者,比亚迪只能在日本企业后面进行学习和改良,而基础专利牢牢握在日本企业手中。
  “技术专利都是纸老虎!”面对貌似强大的技术壁垒,王传福一笑置之。
  比亚迪从来不怕技术封锁,依靠自己力量实现研发创新;比亚迪重视知识产权,从企业开始发展就不断积累专利。虽然战略上藐视敌人,但战术上还是严阵以待。
  自1999年以来,比亚迪在国内外申请的专利数以平均每年195%的速度增长。比亚迪每年在专利维护方面的投入多达5000万元,对于专利发明人的奖励高达平均10000元每人次。面对如此多的专利数量,比亚迪在2001年成立了知识产权与法律部,专门负责公司的专利申请、知识产权保护、知识产权纠纷处理等事务。该部经理黄章辉介绍说,知识产权与法律部拥有一支专业高效的队伍负责比亚迪专利的申请、授权、维护等工作;在知识产权纠纷的维权方面,比亚迪在中国、美国、日本及欧洲均聘请有知识产权领域的专业律师及法律顾问,在必要的时候,比亚迪会整合其在全球的法律顾问资源进行知识产权维权。
  未雨绸缪之下,一场技术壁垒攻防战如期而至。
  2002年9月,三洋公司以侵犯其电池专利为由将比亚迪告上美国圣地亚哥法院。2003年7月,索尼株式会社以侵犯其两项日本锂离子充电电池专利为由,将比亚迪告上日本东京地方法院。当时的比亚迪,镍镉、镍氢产品的市场占有率位居全球第一和第二,在新兴的锂离子电池领域更如日中天,扶摇直上排到了“全球第三”,产品60%出口,直逼三洋和索尼的欧美和日本两大海外市场。三洋和索尼分别在美国和日本先后起诉比亚迪,如此“默契”,旨在联合包抄绞杀比亚迪。
  面对索尼、三洋形成的东西夹击之势,比亚迪表现了一个国际化大企业所特有的冷静和执着。在做了充分的调查和研究之后,2003年10月8日,比亚迪向东京地方裁判所递交答辩书及相关证据38份,否认侵犯索尼的专利权。与此同时,比亚迪向日本专利局提起专利无效宣告请求。比亚迪战术很明确,首先是积极应诉,证实自己并没有侵犯索尼专利;另一方面,从根本上将其专利无效掉,不攻自破,釜底抽薪。
  律师团通过不懈努力,前后共收集到有效的证据材料124份,从产品的发明技术特征来看,索尼的发明专利应属公开技术,因为上世纪九十年代的电池市场上已经有索尼专利的技术特征的产品在广泛使用。经过细致而有利的准备,在圣地亚哥法院的辩诉中,比亚迪律师团提供的24件证据和8篇专利对比文献所构成的证据链作出了令人信服的辩驳,轻易推翻三洋指控,迫使三洋主动请求与比亚迪和解。2005年2月16日,比亚迪与三洋就两项锂离子电池专利的法律诉讼最终达成和解协议。2005年11月7日,针对索尼第2646657号专利上诉案,日本知识产权高等裁判所做出判决,宣告索尼相关专利无效。
  最终,比亚迪在日本这两大锂电池专利官司中完胜,成为打破专利棒杀的经典案例,为中国企业指出一条利用知识产权破解专利壁垒的康庄大道。
  下篇
  新能源战略改写“中国制造”内涵
  【核心提示】
  从电池的流程创新起步,比亚迪实现了每个流程环节产品的自给自足,这种垂直整合,使比亚迪向产业链的上游和下游双路进发。在手机电子领域和汽车制造领域,比亚迪垂直整合成效初现。制造业“微笑曲线”两端的丰厚利润,使比亚迪成为业界人见人怕的“价格屠夫”。在市委、市政府的多方支持下,比亚迪加快源头创新步伐,跻身最尖端的新能源汽车制造领域,实现了电池、IT电子和汽车三大产业的战略会师。
  垂直整合 “中国制造”向“微笑曲线”两端进发
  以手机电池为起点,比亚迪业务渐渐覆盖到手机液晶屏、键盘等除手机芯片之外的所有手机零部件中,整机整合摆上了议事日程。
  手机整机组装,在业界被认为是“血汗行业”。但在王传福的眼中,手机整机组装是个利润丰厚的行业。2006年,比亚迪组建了手机整机组装(EMS)事业部,即第九事业部,开始了垂直整合的探索。比亚迪把手机分为三个生产链,最顶端是设计,中间是组装,最下端是各种零部件的生产制造。
  诺基亚来了,在提出要求后,比亚迪随即提供从方案设计到最终生产的一站式贴牌代工服务。此时的比亚迪,已从一个依靠廉价劳动力的代工企业,变成产品的设计者、生产者、零件提供者,“此代工已非彼代工了。”一位苏姓的员工告诉记者,“我们参与到设计环节中去,与客户有一个互动过程。”比亚迪需要了解手机客户6个月之后要推出的产品,以决定在配件上如何与整机搭配,而且会根据电池的特点给客户提出建议,一跃成为规则制定者。
  在垂直整合中,比亚迪进入了核心的手机研发设计领域,培养出上万名工程师队伍,而卖给诺基亚的产品已经不是有形的手机,还有“无形”的设计的创新、流程的创新和生产工艺的创新。“每接到一份客户的手机代工订单,比亚迪都可以在内部对各种零部件产品的成本进行调整,以保证整机的毛利在一定水平之上。这就是一种垂直整合的能力,我们对利润的控制能力掌握在自己的手中。”比亚迪创始人之一孙一藻说。比亚迪向“微笑曲线”含金量最高的两端不断迈进,从而有充足的利润空间让利给客户。比亚迪的客户曾经进行过这样的比较,同样的一个方案交给比亚迪和单纯的EMS企业相比,比亚迪的成本要低15%-20%,完成的速度要比别人快1/3。
  在手机整机组装(EMS)事业部成立当年,手机零部件业务为比亚迪贡献了51亿元销售额,9亿元利润,占其税前总利润的63%。高盛、花旗分析师们从诺基亚、摩托罗拉、三星这样的大公司收集到的信息是,比亚迪已经成为这些大厂在外包时除富士康外的“第二首选”。
袋鼠模式 三年扭转中国造车企业形象
  在进军手机电子产业的同时,比亚迪更大的战略意图开始显山露水。
  2003年1月23日,比亚迪宣布以2.7亿元的价格收购西安秦川汽车有限责任公司77%的股份。比亚迪成为继吉利之后国内第二家民营轿车生产企业。
  王传福认为,汽车与手机一样都是技术含量较高的组装行业,同样可以进行垂直整合。他把眼光首先放在汽车模具生产上。在日本汽车模具厂参观期间,日本工人们趴在生产线上打磨模具的场景让王传福深感震撼。“原来汽车模具中95%的工作要由人来完成。一辆汽车有一万多个零部件,这需要多少图纸、模具?这些工作在日本、德国要工程师来做,在中国也要工程师来做。所以人就是中国的优势。”王传福说,他算了这样一笔账,一吨模具,在日本要8万元,在中国仅需要2万元。
  在收购秦川汽车之后的几个月里,王传福迅速收购了北汽集团的一家模具厂,成立了北京比亚迪模具有限公司。如今,不仅F3、F6的所有模具来自这家企业,克莱斯勒、通用、福特、丰田的相当一部分模具也从这里采购,并装船运往海外。接着,比亚迪将生产触角伸向整车,在上海布局整车研发中心,在深圳布局发动机研发和生产中心。
  为保证质量,比亚迪又在上海建了一个检测中心,并在上海和西安的基地分别建了一条试车跑道,建设了碰撞实验室、道路模拟、淋雨、高温、综合环境、抗电磁干扰等检测实验室,让新车上市前进行诸多测试。
  3年多时间里,比亚迪环环相扣完成了汽车产业的垂直整合过程,期间无全新车型下线,在亏本中错过了中国车市“最黄金”发展时期。不看好比亚迪进军汽车产业的分析师,也通过各种分析,佐证比亚迪“外行造车”的失败。而当时,“外行造车”正经受“冲动的惩罚”——奥克斯、上海万丰丢下了几千万元的昂贵“车票”,中途“下车”;夏新、波导匆匆闪过,及时刹车。
  戏剧性转折出现在2006年。一直在亏损中挣扎的比亚迪汽车,凭借2005年底才在各地分期上市的一款F3新车,创造了半年总订销量32500辆的成绩,在自主品牌阵营低潮中分外抢眼。至此,比亚迪发展汽车产业的“袋鼠模式”才浮出水面。
  据比亚迪汽车销售总经理夏治冰介绍,袋鼠有三个特征:长腿、育袋和自我奔跑。长腿是指通过电池和手机电子形成的以自主创新为核心的竞争力,在产品的差异化等方面构建起了比亚迪长腿;育袋是比亚迪有充足的供血机能,换言之“亏得起”;自我奔跑是指企业要通过造好车来实现滚动发展,质量不好不能赢利的车型一定不能上市。
  在袋鼠模式哺育下,比亚迪垂直整合进势惊人,自主生产发动机、底盘、模具、整车电子、内饰甚至车漆。比亚迪内部人士开玩笑:“我们造玻璃和轮胎之外的汽车所有东西。”这种整合,给国人带来物美价廉的轿车,深受市场欢迎。
  2008年,随着F3R、F6、F0的上市,比亚迪汽车销量达20万辆,成为自主品牌汽车领头羊。
  高端创新 铁电池领跑新能源汽车市场
  在比亚迪垂直整合汽车制造过程中,有心人发现,比亚迪在全国唯独不见布局生产变速箱。“未来的汽车不需要变速箱!”王传福又语出惊人。在他眼中,汽车迟早是电动汽车的天下,而电动汽车是不需要变速箱的。
  事实上,比亚迪对电动汽车电池的研究最早始于1998年。如果不是相信自己能够拥有电池——这一电动车的核心技术的话,2003年的王传福也许根本不会选择进入汽车领域。现在汽车电池的研发团队从过去的十个人扩张到100多个人,加上制造和测试部门,在上海松江占了一栋楼。
  2006年底,比亚迪成立了e6纯电动车项目组,王传福亲自担任项目总负责人,并从比亚迪的电池、电子部件事业部调集大批人马,要将两大产业群的核心技术进行无缝对接。e6项目组每个月至少开两次会讨论各项进展。一组来自比亚迪的内部数据显示,e6充电一次可以行驶400公里,动力200千瓦,最高时速140-150公里,价格15万元以内,百公里耗电15度,只需要花几块钱的电费。在安全性方面,王传福说,他很快会向公众证明,这是一块用火烧都不会爆炸的电池。
  没有让公众期待得太久,在去年高交会开幕前夕,比亚迪发布了铁电池及F3DM双模电动汽车,并宣布将在2008年下半年实现该类汽车的量产上市。F3DM双模电动汽车采用电动与混合动力相结合的技术,车载电池用完将自动切换到混合动力系统。这款双模电动汽车的核心驱动力是铁电池,这是一种用铁和硅为原料制成的一种高效电池,实现了高容量、高安全、低成本三项指标的完美统一。
  2008年12月,全球首款混合动力汽车F3DM正式上市。这部花了5年、投入500名研发人员和逾10亿元人民币研发出的油电混合动力汽车可以像手机一样,在家用插座上充电,突破了电动车需在专业充电站充电的瓶颈,并可单独使用电驱动,最高时速150公里,续航里程达100公里。相比之下,目前掌握双模技术的另外两家公司——通用汽车和丰田所销售的电动车,一次充电则只能行驶25公里。
  “已上市的F3DM和即将推出的e6,无疑使比亚迪成为全球新能源汽车市场上的领先者之一,”汽车研究机构J.D.Power亚太公司中国区调研总经理梅松林表示,电动车技术从根本上颠覆了传统汽车的燃油动力总成,使并不掌握传统核心技术的新兴厂商得以与雄霸汽车市场的巨头们站在同一起跑线上。
  比亚迪的优势甚至影响了深圳的城市发展战略。新能源、新材料如果加上汽车制造,无疑是创新“核聚变”,能大大提升深圳的自主创新水平。经过十年的培育,比亚迪已今非昔比,深圳市委和市政府的资源,如几平方公里的造车用地、高交会重点项目推荐、针对性的高新政策……源源不断地向比亚迪新能源汽车领域倾斜。今年3月,省委副书记、市委书记刘玉浦在比亚迪调研时,驾驶比亚迪F3DM转了一圈后,笑着为这款“深圳造”的新能源汽车做起了“广告”:“加速快、噪音小、很平稳,而且老百姓买得起!”市长许宗衡则表示,配合比亚迪新能源汽车、储能电站和低成本太阳能电站的长远发展战略,深圳市政府将量身定做一整套政策措施系统来扶持和对接,“不能零敲碎打,要将企业发展战略与城市发展战略结合起来考量,全力支持比亚迪三大战略的实现。”
  政府的支持,加上对新能源汽车市场的研判,王传福喊出了“在乘用车领域2015年做到中国第一;2025年超过丰田汽车做到世界第一”的目标。这听上去又是一个疯狂的口号,但人们已不敢轻易嘲笑王传福。比亚迪式的自信自强,已多次演变成事实。人们更好奇的是,实现这一目标的时刻能否提前到来。

2009年5月18日星期一

Linux Journal宣布2009年度读者选择奖

最喜爱发行版—Ubuntu
最喜爱桌面环境—GNOME
最喜爱浏览器—Firefox
最喜爱电子邮件客户端- Mozilla Thunderbird
最喜欢办公软件- OpenOffice.org
最喜爱音频工具- Audacity
最喜爱音频播放器- Amarok
最喜爱媒体播放器-VLC
最喜爱IM-Pidgin
最喜欢图形/设计工具-GIMP
最喜欢数字照片管理工具-Picasa
最喜欢文本编辑器-vi
最喜欢版本控制系统-Subversion
最喜欢数据库- MySQL
最喜爱Linux监控程序- Nagios
最喜欢编程语言-Python
最喜爱脚本语言-bash
最喜欢远程访问或网络计算图形用户界面-SSH和X
最喜爱Linux IDE - Eclipse
最喜欢富Web应用开发平台- Adobe Air
最喜爱Linux游戏-Frozen Bubble
最喜爱虚拟化方案- VirtualBox
最喜爱备份系统-Amanda
最喜爱备份工具- rsync
最喜爱软件包管理应用-apt
最喜爱内容管理系统- WordPress
最喜爱Web服务器-Apache
最喜爱Linux Web托管服务公司- Contegix
最喜欢基于Linux电子器具-ASUS Eee PC
最喜爱Linux笔记本-ASUS Eee PC
最喜欢Linux桌面工作站-Dell
最喜爱Linux服务器-Dell
最喜爱"绿色" Linux产品或解决方案-虚拟化
最喜爱Linux图书-Linux in a Nutshell
最喜爱Linux Journal杂志专栏-Marcel Gagné的Cooking with Linux和Kyle
Rankin的Hack and /
Linux年度产品-Android平台和T-Mobile G1 Phone

2009年5月17日星期日

非常好的文章——死人不会说话

死人不会说话----很重要的逻辑观念


1941年,第二次世界大战正打得如火如荼。

有一天,美国哥伦比亚大学著名统计学 家沃德 教授(Abraham Wald)
遇到了一个意外的访客, 那是英国皇家空军的作战指挥官。 他说:「
沃德教授,每次飞行员出发去执行轰炸任务,我们最怕听到的回报是:
『呼叫总部,我中弹了!』 请协助我们改善这个攸关飞行员生死的难题吧!」

沃德接下这个紧急研究案,他受委托分析德国地面炮火击中联军轰炸机的资料,并且以统计专业,建议机体装甲应该如何加强,才能降低被炮火击落的机会。但依照当时的航空技术,机体装甲只能局部加强,否则机体过重,会导致起飞困难及操控迟钝。
沃德将联军轰炸机的弹着点资料,描绘成两张比较表,沃德的研究发现,机翼是最容易被击中的部位,
而飞行员的座舱与机尾,则是最少被击中的部位。
沃德详尽的资料分析,令英国皇家空军十分满意。

但在研究成果报告的会议上,却发生一场激辩。

负责该项目的作战指挥官说:「沃德
教授的研究清楚地显示,联军轰炸机的机翼,弹孔密密麻麻,最容易中弹。因此,我们应该加强机翼的装甲。」
沃德客气但坚定地说: 「将军,我尊敬你在飞行上的专业,
但我有完全不同的看法,我建议加强飞行员座舱与机尾发动机部位的装甲,因为那儿
最少发现弹孔。」
在全场错愕怀疑的眼光中,沃德解释说:「我所分析的样本中,只包含顺利返回基地的轰炸机。
从统计的观点来看,我认为被多次击中机翼的轰炸机,
似乎还是能够安全返航,而飞机很少发现弹着点的部位,并非真的不会中弹,而是一旦中弹,根本就无法返航。」指挥官反驳说:
「我很佩服沃德教授没有任何飞行经验,就敢做这么大胆的推论,就我个人而言,过去在执行任务时,也曾多次机翼中弹严重受创,要不是我飞行技术老到,运气也不错,早就机毁人亡了,所以,我依然强烈主张应该加强机翼的装甲。」这两种意见僵持不下,皇家空军部部长陷入苦思。

他到底要相信这个作战经验丰富的飞将军, 还是要相信一个独排众议的统计学家?

由于战况紧急,无法做更进一步的研究,部长决定接受沃德的建议,立刻加强驾驶舱与机尾发动机的防御装甲。不久之后,联军轰炸机被击落的比例,果然显著降低。为了确认这个决策的正确性,一段时间后,英国军方动用了敌后工作人员,搜集了部份坠毁在德国境内的联军飞机残骸,他们中弹的部位,果真如沃德所预料,主要集中在驾驶舱与发动机的位置。

看不见的弹痕最致命

乍看之下,作战指挥官加强机翼装甲的决定十分合理,
但他忽略了一个事实:弹着点的分布,是一种严重偏误的资料。
因为最关键的资料,其实是在被击落的飞机身上,但这些飞机却无法被观察到,因此,布满了弹痕的机翼,反而是飞机最强韧的部位。
空军作战指挥官差点因为太重视「看得见」的弹痕,反而做出错误的决策。

这个案例有两个特别值得警惕的地方。
死掉或被俘的人无法发表意见
第一, 搜集更多资料,并不会改善决策品质。
由于弹痕资料的来源本身就有严重的偏误,努力搜集更多的资料,恐怕只会更加深原有的误解。
第二,召集更多作战经验丰富的飞行员来提供专业意见,也不能改善决策品质,因为这些飞行员,正是产生偏误资料过程中的一环。他们都是安全回航的飞行员,虽然可能有机翼中弹的经验,但都不是驾驶舱或发动机中弹的「烈士」。

简单的说, 当他们愈认真凝视那些「看得到」的弹痕,他们离真相就愈远。

信息界有所谓「Garbage In, Garbage Out」,
前提(或假设)若是错误,再漂亮的统计算式或方法、再多的资料,也不能让后面的推论变得正确。
在管理实务与日常生活中,许多关键的资料,
也像上述轰炸机的个案一样,会因为「失败」而观察不到。

台大 刘顺仁 教授在著作《决胜》一书中, 对「存活者偏差(survivorship
bias)」举例说明,是我读过的书中最生动贴切又清楚的一个。如果有一位70岁的老人在电视上说,他就是靠每天抽一包烟、嚼一包槟榔才能长寿,
请想起「死人没法上电视说话」这件事。
同样的道理,不是那个地方长寿的老人家吃或喝某东西, 某东西就是养生圣品。

再看一个骗钱的例子(这已经进化到E-mail版)
1月2日你接到一封匿名信,
向你表示,这个月市场会上涨,结果市场果然上涨,但你不以为意,因为大家都知道有元月效应这回事(历年来一月间股价涨多跌少)。
到了
2月1日,你又接到另一封信,向你表示,市场将下跌。这一次,又给那封信说中了。
3月1日再接到一封信,情形一样。7月,你对那位匿名人士的先见之明很感兴趣,对方邀你投资某个海外基金。
于是你把全部的储蓄拿出来投资, 两个月以后,那些钱有如肉包子打狗,一去不回。
你伏在邻居的肩膀上嚎啕大哭,他告诉你,他也接过两封这种神秘信,但寄到第二封就停了。
他说,第一封信的预测正确,但第二封不正确。
这是怎么一回事?
那些骗子玩的把戏是,他们从电话簿找出一万个人名,寄出后市看涨的信给其中一半的人,
后市看跌的信给另一半的人。
一个月后,将有五千人接到的信预测正确, 然后再针对这五千人如法炮制。
再一个月后,剩下二千五百人接到的信预测正确,
如此直到名单上剩下五百人,其中会有两百人受骗上当,因此骗子只要花几千美元的邮资,便可赚进数百万美元。
把手法作些改变。
某骗子假装投顾老师招收会员,跟你说你可以先加入一般会员,等你觉得准了再加入VIP会员。这改变更巧妙的地方在于,骗子一开始就能赚到钱,此外VIP会员还会帮骗子
建立口碑,证明骗子有多准:存活者偏差(survivorship bias)。

只要信息不流通, 其它人不知道这假的投顾老师有多么(不)准。


————————————————————————————————————————————
在我们的思维逻辑里,成功企业总有成功的原因的,于是将其归纳总结。
但我们往往不会去关注那些,和成功企业在同一年代成长,最后相继消亡的那些,为什么会消亡。
研究成功者,你能看到美艳的皮肤。
研究失败者,你能看到生死的命门。

无与伦比的100个激情签名

  1.做男人就要做金刚那样的男人——在世界最高的大楼上为心爱的女人打飞机!!!
  2.男人的双手是最好的丰胸良药——终于发现我有一门手艺了……(双手愿为爱人而粗糙!)
  3.JJ掉了不过碗大个疤!
  4.如果三天不做爱,那么你就是处男!
  5.据说从银河系看地球,唯一能看得见的就是我的小JJ了……
  6.我吞下一颗春药,世界立刻变得性感起来~
  7.如果谈恋爱就是谈恋爱的话,那不是耍流氓吗?
  8.爱她,就请为她做无痛人流手术!
  9.她是一个美丽的女孩。她每天刷5次牙!(2006年隐讳签名之绝唱)
  10.NBA历史上的超级淫棍——姚明!
  11."日本人是人"这句话属于:A.比喻;B.夸张;C.借代;D.拟人。
  12.现在中国最大的困境在于——中南海的政策出不了中南海!
  13.一个外国人,不远万里来到中国,毫不利己,专门利人,这是什么精神病?
  
  14.爷爷都是从孙子走过来的~
  签名均创自天涯开心乐园、娱乐八卦、非常男女、舞文弄墨、大学校园。
  15.我是个无神论者,但在夜里却不敢承认这一点!
  
  16.手淫强身,意淫强国。值此国庆之际,我要多意淫,为国家的富强做出自己应有的贡献!
  
  17.一位萎人曾经说过:"像我们这样强烈渴望崛起的民族,更需要时刻用意淫来支持我们脆弱的国防以及民众心理。手淫只能强身健体,意淫方才强国安邦!"
  
  18.其实我是一个天才,可惜天妒英才!
  
  19.在华(南理)工待久了,看母猪都是双眼皮的……
  
  20.真爱会不会成为资本主义社会到社会主义社会的化石呢?
  
  21.都是水何必装醇,都是色狼又何必装羊!
  
  22.我们产生一点小分歧:她希望我把粪土变黄金,我希望她视黄金如粪土!
  
  23.所有刻骨铭心的爱都灵魂游离于床上的瞬间~
  
  24.她心地善良,虽然她的乳沟里至少淹死过三个男人……
  
  25.如果你生在中国,那么请先用爱改变自己,再用恨改变环境!
  
  26.有种就放你妈过来!
  
  27.你看得见我打在屏幕上的字,却看不到我掉在键盘上的泪……
  
  28.我趴着睡就强奸了地球,我躺着睡就强奸了整个宇宙!
  
  29.不要等人人都说你丑时才发现自己真的丑!
  
  30.老板,给我来二斤真爱我拿回家喂狗!!
  31.日一群女人是我的本事,被一群女人日是我的魅力!
  32.男人只分两种:一种是好色,另一种是十分好色!
  33.当白天又一次把黑夜按倒在床上的时候,太阳就出生了……
  34.①师太,你就从了老衲吧……②老衲失礼了,师太该你了~③师太,你就饶了老衲吧!④阿尼陀佛,老衲射不出-_-b
  35.客官请自重,本姑娘是卖身不卖艺的!
  36.给我一口油井,我来给地球制造高潮!
  37.有尿当尿直须尿,莫等无尿空抖鸟!
  38.嫁言承旭,让周渝民为我终身不娶!!!
  39.高价回收二手精液,两块钱一斤,精壮男士发财新路呦~
  40.承诺就像说"操他妈",老说老说但总也实现不了;实现诺言就像真的要去"操他妈",那真是比登天还难!
  41.长个包子样就别怨狗跟着!
  42.生活把我奸了,我把生活阉了……
  43.学海无涯,回头是岸!
  44.不在课堂上沉睡,就在酒桌上埋醉~
  45.漏洞与补丁齐飞,蓝屏共死机一色。
  46.宁愿躲在奔驰车里哭泣,也不要骑着单车微笑!
  47.猪有猪的思想,人有人的思想。如果猪有人的思想,那它就不是猪了——是八戒!
  48.我死了,在烈火中我又站起来了,你猜是涅盘,还是尸变?
  49.别说吃你几个烂西瓜,老子就是在东大食堂喝免费汤都不要钱!
  50.期末考试算什么?pass就不是共产党员!!!
51.我爱你,但以上三行誓言已被精斑覆盖!!!
  
  52.在通往牛逼的路上你能一路勃起吗?
  
  53.美女说:"人为我死,我为鸟亡!"
  
  54.根据荷尔蒙活动的时间规律得出结论:晨练不如早操!
  
  55.老天,你让夏天和冬天同房了吧?生出这鬼天气~
  
  56.用我的粗度测量你的宽度,用我的长度测量你的深度!
  
  57.当肉体得到满足,灵魂重新拾起前进的方向……
  
  58.淫的一手好湿并不难,难的是淫一被子好湿!
  
  59.男人有冲动可能是爱你,也可能是不爱,但没有冲动肯定是不爱!
  
  60.钱财女人皆粪土,甘作苍蝇为粪劳!
  
  61.不要在一棵树上吊死,在附近几棵树上多试试死几次~
  
  62.当头晕的时候我终于明白了什么叫爱情……
  
  63.你笑我和你们不一样,我笑你们大家都一样~
  
  64.偶尔幽生活一默你会觉得很爽,但生活幽你一默就惨了!
  65.女人生来就是不专注的,除了对爱情;男人生来就是专注的,但是,也除了对爱情!
  
  66.心终于可以放下了,原来那100多个是人头不是猴头!不然死了那么多猴猴多可惜啊……
  
  67.帅的惊动地方,地方报告中央,中央紧急磋商,授予最帅勋章!
  
  68.宁做地狱守门人,不当天堂看家狗!
  
  69.神指着天下万国对我说:"臣服于我,这一切都属于你!"我忍痛拒绝了神,因为我已经结婚了……
  
  70.请转告王子,老娘还在披荆斩棘的路上,还有雪山未翻、大河未过、巨龙未杀、帅哥未泡……叫他继续死睡吧!
  
  71.你是疯来他是傻,缠缠绵绵到天涯~
  
  72.马化腾私下说:"学十年语文没有聊半年QQ效果好!"
  
  73.早餐里吃到刷锅的金属丝很正常——这正说明我们后勤做饭前是刷锅的!
  
  74.见了狗官还不快下跪!
  
  75.大便的时候要留一半,免得饿得快~
  
  76.披星戴月上班去,万家灯火回家来。
  77.发工资时,会计对俺说:"你半年领一次工资吧,现在零钱太少了……"
  
  78.收入分四种:狂劳不得,多劳少得,少劳多得,不劳狂得。还好,我是第二种……
  
  79.我的脸洗的很干净,苍蝇趴在上面都得摔死!难过的是,我的口袋比我的脸还干净……
   
  80.本人收入像出纳的帐——日清月结,会计的报表——收支平衡,体育老师的计时器——用完归零,秋风扫剩的落叶——廖廖几张!
  
  81.找不到恐龙,就拿蜥蜴顶!
  
  82.女人拥有无数个QQ号只为调戏一个男人,男人常用的一个QQ号上却加满了各种各样的女人……(六A六B的QQ空间)
  83.此生纵横江湖,无牵无挂,唯有"三个代表"常留心中……
  84.不是爱情不分国界,而是爱情不分性别!
  85.贫僧不好色,法号叫嫖客~
  
  86.我不喜欢只和一个女人上很多次床,我喜欢和很多女人只上一次床……
  
  87.权力和金钱是最烈的春药!
  
  88.让男人珍惜的最好方法就是让他永远得不到,让女人珍惜的最好方法就是不断满足她!(C_chairman/chai2001)
  89.对敌人,要把他从战场拼到坟场里去;对女人,要把她从马路上拼到床上去;对家人,要把他从嘴上拼到心里去!
  
  90.无论男人给女人讲多么多么浪漫的童话故事,里面终不过围绕一个字:床!(C_chairman/chai2001)
  
  91.爷爷说:"周杰伦出家一定是个好和尚,因为他念的经实在是太好听了……"
  
  92.小时候我是个天才,经过二十多年的社会主义教育后,终于被成功地培养成庸才!
  
  93.偶要跟机器猫玩剪刀石头布,非要让它输得倾家荡产!!!
  
  94.中500万,除爹妈不换,其余统统换!
  
  《天涯上无与伦比的100个激情签名》只用于非商业用途,转载请注明天涯社区,否则我们祝您一出门就能幸运地碰见上帝!
  
  95.生活真TMD好玩,因为生活老TMD玩我~
  
  96.读书读到抽筋处,文思方能如尿崩~
  
  97.爱不能联通了,心就在移动了;所以,爱莫轻易移动,心方永远联通!
  
  98.唱着国歌抢银行!
  
  99.钓鱼岛是中国的,你是我的!
  
  100.菜刀在手,问天下谁是英雄!!!

2009年5月15日星期五

巴菲特:我的城堡和我投资的5+12+8+2法则

我只喜欢我看得懂的生意,这个标准排除了90%的企业;我要看清这个企业10年的大方向。
我怎么选股:
重心是"什么"上面,而不是"何时"
可口可乐公司于1919年上市,那时的价格是40美元左右。一年后,股价降了50%,只有19美元。看起来那是一场灾难。瓶装问题,糖料涨价,你总能发现这样那样的原因让你觉得那不是一个合适的买入时机。一些年之后,又发生了大萧条,第二次世界大战,核武器竞赛等。总是有原因(让你不买)。如果你在一开始40块钱买了一股,然后你把派发的红利进行再投资(买入可口可乐的股票),一直到现在,那股可乐股票的价值是5000万。这个事实压倒了一切。如果你看对了生意模式,你就会赚很多钱。
切入点的时机是很难把握的。所以,如果我拥有的是一个绝佳的生意,我丝毫不会为某一个事件的发生,或者它对未来一年的影响等等而担忧。当然,在过去的某些个时间段,政府施加了价格管制政策。企业因而不能涨价,即使最好的企业有时也会受影响,我们的See's
Candy糖果不能在
12月26日涨价。但是,管制该发生的时候就会发生,它绝不会把一个杰出的企业蜕变成一个平庸的企业。政府是不可能永远实施管制政策的。
一个杰出的企业可以预计到将来可能会发生什么,但不一定会准确到何时会发生。重心需要放在"什么"上面,而不是"何时"上。如果对"什么"的判断是正确的,那么对"何时"大可不必过虑。
我凭什么选股:
给我10亿和10年
我只喜欢我看得懂的生意,这个标准排除了90%的企业。我想要的生意外面得有个城墙,居中是价值不菲的城堡,我要负责的、能干的人才来管理。
三十年前,柯达公司的城墙和可口可乐的城墙是一样难以逾越的。柯达向你保证你今天的照片,20年,50年后看起来仍是栩栩如生,这一点对你而言可能恰恰是最重要的。30年前的柯达就有那样的魅力,它占据了每个人的心。在地球上每个人的心里,它的那个小黄盒子都在说,柯达是最好的。那真是无价的。
现在的柯达已经不再独占人们的心。它的城墙变薄了,富士用各种手段缩小了差距。柯达让富士成为奥林匹克运动会的赞助商,一个一直以来由柯达独占的位置。于是在人们的印象里,富士变得和柯达平起平坐起来。
与之相反的是,可口可乐的城墙与30年前比,变得更宽了。你可能看不到城墙一天天的变化。但是,每次你看到可口可乐的工厂扩张到一个目前并不盈利,但20年后一定会的国家,它的城墙就加宽些。企业的城墙每天每年都在变,或厚或窄。10年后,你就会看到不同。
我给那些公司经理人的要求就是,让城墙更厚些,保护好它,拒竞争者于墙外。我寻找的就是这样的企业。那么这样的企业都在做什么生意呢?我要找到他们,就要从最简单的产品里找到那些(杰出的企业)。因为我没法预料到10年以后,甲骨文,莲花,或微软会发展成什么样。比尔?盖茨是我碰到过的最好的生意人。微软现在所处的位置也很好。但是我还是对他们10年后的状况无从知晓。同样我对他们的竞争对手10年后的情形也一无所知。
虽然我不拥有口香糖的公司,但是我知道10年后他们的发展会怎样。互联网是不会改变我们嚼口香糖的方式的,事实上,没什么能改变我们嚼口香糖的方式。会有很多的(口香糖)新产品不断进入试验期,一些以失败告终。这是事物发展的规律。如果你给我10个亿,让我进入口香糖的生意,打开一个缺口,我无法做到。这就是我考量一个生意的基本原则。给我10个亿,我能对竞争对手有多少打击?给我100个亿,我对全世界的可口可乐的损失会有多大?我做不到,因为,他们的生意稳如磐石。给我些钱,让我去占领其他领域,我却总能找出办法把事情做到。
这样,我就能看清这个企业10年的大方向。如果我做不到这一点,我是不会买的。
我的5项投资逻辑:
1.因为我把自己当成是企业的经营者,所以我成为优秀的投资人;因为我把自己当成投资人,所以我成为优秀的企业经营者。
2.好的企业比好的价格更重要。
3.一生追求消费垄断企业。
4.最终决定股价的是实质价值。
5.没有任何时间适合将最优秀的企业脱手。
我的12项投资要点:
1.利用市场的愚蠢有规律的投资。
2.买价决定报酬率的高低,即使是长线投资也是如此。
3.利润的复合增长与交易费用和税负的避免使投资人受益无穷。
4.不在意一家公司来年可赚多少,仅有意未来5至10年能赚多少。
5.只投资未来收益高确定性企业。
6.通货膨胀是投资者的最大敌人。
7.价值型与成长型的投资理念是相通的;价值是一项投资未来现金流量的折现值;而成长只是用来决定价值的预测过程。
8.投资人财务上的成功与他对投资企业的了解程度成正比。
9."安全边际"从两个方面协助你的投资:首先是缓冲可能的价格风险;其次是可获得相对高的权益报酬率。
10.拥有一只股票,期待它下个星期就上涨,是十分愚蠢的。
11.就算联储主席偷偷告诉我未来两年的货币政策,我也不会改变我的任何一个作为。
12.不理会股市的涨跌,不担心经济情势的变化,不相信任何预测,不接受任何内幕消息,只注意两点:A.买什么股票;B.买入价格。
我的8项投资标准:
1.必须是消费垄断企业。
2.产品简单、易了解、前景看好。
3.有稳定的经营史。
4.经营者理性、忠诚,始终以股东利益为先。
5.财务稳键。
6.经营效率高、收益好。
7.资本支出少、自由现金流量充裕。
8.价格合理。
我的2项投资方式
1.卡片打洞、终生持有,每年检查一次以下数字:A.初始的权益报酬率;B.营运毛利;C.负债水准;D.资本支出;E.现金流量。
2.当市场过于高估持有股票的价格时,也可考虑进行短期套利。


我只喜欢我看得懂的生意,这个标准排除了90%的企业;我要看清这个企业10年的大方向。
我怎么选股:
重心是"什么"上面,而不是"何时"
可口可乐公司于1919年上市,那时的价格是40美元左右。一年后,股价降了50%,只有19美元。看起来那是一场灾难。瓶装问题,糖料涨价,你总能发现这样那样的原因让你觉得那不是一个合适的买入时机。一些年之后,又发生了大萧条,第二次世界大战,核武器竞赛等。总是有原因(让你不买)。如果你在一开始40块钱买了一股,然后你把派发的红利进行再投资(买入可口可乐的股票),一直到现在,那股可乐股票的价值是5000万。这个事实压倒了一切。如果你看对了生意模式,你就会赚很多钱。
切入点的时机是很难把握的。所以,如果我拥有的是一个绝佳的生意,我丝毫不会为某一个事件的发生,或者它对未来一年的影响等等而担忧。当然,在过去的某些个时间段,政府施加了价格管制政策。企业因而不能涨价,即使最好的企业有时也会受影响,我们的See's
Candy糖果不能在
12月26日涨价。但是,管制该发生的时候就会发生,它绝不会把一个杰出的企业蜕变成一个平庸的企业。政府是不可能永远实施管制政策的。
一个杰出的企业可以预计到将来可能会发生什么,但不一定会准确到何时会发生。重心需要放在"什么"上面,而不是"何时"上。如果对"什么"的判断是正确的,那么对"何时"大可不必过虑。
我凭什么选股:
给我10亿和10年
我只喜欢我看得懂的生意,这个标准排除了90%的企业。我想要的生意外面得有个城墙,居中是价值不菲的城堡,我要负责的、能干的人才来管理。
三十年前,柯达公司的城墙和可口可乐的城墙是一样难以逾越的。柯达向你保证你今天的照片,20年,50年后看起来仍是栩栩如生,这一点对你而言可能恰恰是最重要的。30年前的柯达就有那样的魅力,它占据了每个人的心。在地球上每个人的心里,它的那个小黄盒子都在说,柯达是最好的。那真是无价的。
现在的柯达已经不再独占人们的心。它的城墙变薄了,富士用各种手段缩小了差距。柯达让富士成为奥林匹克运动会的赞助商,一个一直以来由柯达独占的位置。于是在人们的印象里,富士变得和柯达平起平坐起来。
与之相反的是,可口可乐的城墙与30年前比,变得更宽了。你可能看不到城墙一天天的变化。但是,每次你看到可口可乐的工厂扩张到一个目前并不盈利,但20年后一定会的国家,它的城墙就加宽些。企业的城墙每天每年都在变,或厚或窄。10年后,你就会看到不同。
我给那些公司经理人的要求就是,让城墙更厚些,保护好它,拒竞争者于墙外。我寻找的就是这样的企业。那么这样的企业都在做什么生意呢?我要找到他们,就要从最简单的产品里找到那些(杰出的企业)。因为我没法预料到10年以后,甲骨文,莲花,或微软会发展成什么样。比尔?盖茨是我碰到过的最好的生意人。微软现在所处的位置也很好。但是我还是对他们10年后的状况无从知晓。同样我对他们的竞争对手10年后的情形也一无所知。
虽然我不拥有口香糖的公司,但是我知道10年后他们的发展会怎样。互联网是不会改变我们嚼口香糖的方式的,事实上,没什么能改变我们嚼口香糖的方式。会有很多的(口香糖)新产品不断进入试验期,一些以失败告终。这是事物发展的规律。如果你给我10个亿,让我进入口香糖的生意,打开一个缺口,我无法做到。这就是我考量一个生意的基本原则。给我10个亿,我能对竞争对手有多少打击?给我100个亿,我对全世界的可口可乐的损失会有多大?我做不到,因为,他们的生意稳如磐石。给我些钱,让我去占领其他领域,我却总能找出办法把事情做到。
这样,我就能看清这个企业10年的大方向。如果我做不到这一点,我是不会买的。
我的5项投资逻辑:
1.因为我把自己当成是企业的经营者,所以我成为优秀的投资人;因为我把自己当成投资人,所以我成为优秀的企业经营者。
2.好的企业比好的价格更重要。
3.一生追求消费垄断企业。
4.最终决定股价的是实质价值。
5.没有任何时间适合将最优秀的企业脱手。
我的12项投资要点:
1.利用市场的愚蠢有规律的投资。
2.买价决定报酬率的高低,即使是长线投资也是如此。
3.利润的复合增长与交易费用和税负的避免使投资人受益无穷。
4.不在意一家公司来年可赚多少,仅有意未来5至10年能赚多少。
5.只投资未来收益高确定性企业。
6.通货膨胀是投资者的最大敌人。
7.价值型与成长型的投资理念是相通的;价值是一项投资未来现金流量的折现值;而成长只是用来决定价值的预测过程。
8.投资人财务上的成功与他对投资企业的了解程度成正比。
9."安全边际"从两个方面协助你的投资:首先是缓冲可能的价格风险;其次是可获得相对高的权益报酬率。
10.拥有一只股票,期待它下个星期就上涨,是十分愚蠢的。
11.就算联储主席偷偷告诉我未来两年的货币政策,我也不会改变我的任何一个作为。
12.不理会股市的涨跌,不担心经济情势的变化,不相信任何预测,不接受任何内幕消息,只注意两点:A.买什么股票;B.买入价格。
我的8项投资标准:
1.必须是消费垄断企业。
2.产品简单、易了解、前景看好。
3.有稳定的经营史。
4.经营者理性、忠诚,始终以股东利益为先。
5.财务稳键。
6.经营效率高、收益好。
7.资本支出少、自由现金流量充裕。
8.价格合理。
我的2项投资方式
1.卡片打洞、终生持有,每年检查一次以下数字:A.初始的权益报酬率;B.营运毛利;C.负债水准;D.资本支出;E.现金流量。
2.当市场过于高估持有股票的价格时,也可考虑进行短期套利。

为何美国没有史玉柱 而中国没有乔布斯?——作者:申音 《创业家》杂志前执行主编

时光倒流20年。
  那是1989,柏林墙倒塌的时刻。整个世界都在关心着冷战的终结、民主的胜利、意识形态的巨变。
  但有两个家伙根本不关心政治。
  一个是34岁的史蒂夫。乔布斯,这位"硅谷金童"的人生正处于低谷。在被自己参与缔造的苹果电脑公司赶出来后,他为了复仇创办的Next和低价买下的Pixar都处于入不敷出、岌岌可危的境地。这位昔日全美最富有的人之一(远远超过那时的比尔。盖茨),私人财产只剩下2500万美元。
  而另一个是27岁的史玉柱。刚刚硕士毕业的他瘦得可以被风吹倒。跟那个年代大多数的热血学子们相比,史玉柱没有狂热的政治理想,他一心想的是如何找梯子登上商业舞台。
  20年的跌宕过后,乔布斯和史玉柱已分别成为各自国家商界的标志性人物。而当年关心政治的人们如今只关心经济了。
  不过,还没有人去认真地比较一下乔布斯和史玉柱。更没有人去思考:为什么美国没有史玉柱,中国没有乔布斯?
  这其实是一件很有意思的事情。
  精彩摘录:
  ·两人还是洞悉人性的营销天才。只不过一个靠发掘人性的美好赚钱,而另一个利用人性的弱点来抢金。
  ·两个理想主义的青年,一个变成了真正的商业梦想家,为了创造未来他不惜调动一切资源。而另一个人转变为纯粹而现实的商人,精确地计算着自己的付出与回报,不再做那些费力不讨好的事。
  ·中国并不缺乏伟大的商人,比如胡雪岩、张謇、卢作孚,但他们死了,人们如今只记得一些轶事;而熊彼得定义的企业家过去了,他们还能留下激动人心的产品和伟大的公司。
  ·美国梦的真正含义是什么?是给一个理想主义者提供梦想成真的舞台。那么中国梦呢?是不是逼着一个理想主义者向现实妥协,最终自己成为这个环境的一部分,才能成功?
变脸 Face
Off
  在我看来,乔布斯和史玉柱的人生经历就像是同一个剧本大纲拍出的两部电影,只不过更换了不同的导演和时空场景。
  两人都是本国知识青年里的佼佼者,脑子好使还天不怕地不怕,早早投身高科技领域创业,并在三十岁左右就达到了事业的第一次高峰。
  1983年,年仅28岁的乔布斯登上了《时代》周刊的封面,他被看成是"个人电脑的真正发明者"。1992年,在一个国内十大城市万名青年的问卷调查中,史玉柱名列"最受崇拜的青年人物"第二位,第一名是比尔。盖茨。
  两人都习惯于蔑视陈规、特立独行,带着点邪性的"范",一个永远的黑色套头衫配牛仔裤,而另一个光头红白运动衣。
  他俩都有着与生俱来的商业敏感,是真正的跨界高手。乔布斯在PC、音乐、电影、手机等多个领域都证明了自己的能力,而史玉柱则在软件、房地产、保健品、金融投资、网游等战场纵横驰骋。
  两人都是执着的完美主义者,都能把一个产品做到惊天地泣鬼神。卖了10年的脑白金仍是中国最畅销的保健品,而iPod则占据了数字音乐播放器市场的70%.此外,两人还是洞悉人性的营销天才。只不过一个靠发掘人性的美好赚钱,而另一个利用人性的弱点来抢金。
  或许是因为成功来得太过迅速,他们先后导演过自毁式的高速坠落,幡然醒悟之后,又表现出惊人的自我纠错能力,并重新勾画一条不断向上的弧线。
  曾经有那么一段时间,史玉柱看起来就要成为中国的"乔布斯"。从1989年起,他每一年都要推出一款自主开发的产品,从M-6401桌面排版软件、M-6402文字处理软件到巨人汉卡,再到巨人中文手写电脑、巨人财务软件等等。巨人飞快地成长为一个年产值10亿、利润数千万的高科技集团公司,其年度销售商大会更成为全国规模最大的电脑盛会。
  几乎与此同时,乔布斯只剩下几千万美元的现金,和两个面临着裁员重组的问题公司,他完全可能成为美国版的"史玉柱",比如在加州搞房地产,去拉斯维加斯开赌场,到中东倒腾石油,或者变成一个精明的股权投资人。但他什么都没有干,只是继续掏自己和别人的腰包来支持两个长期赔钱的公司,固执地等着它们出现转机。
  某种程度上,乔布斯是幸运的。在美国,他的理想主义总能找到合适的欣赏者,所以他可以咬牙不向现实妥协。像罗斯。佩罗这样的前辈创业家愿意签出支票,并与其分担风险。迪斯尼这样的大公司也同意投资给小公司Pixar,让其制作动画长片并参与分成。
  而史玉柱之所以蜕变成今天的史玉柱,是因为他发现,做软件公司为他意外地赢得了名声,而在中国,名声就意味着许多新的机会。
  在邓小平南巡讲话之后,史玉柱恰逢其时地被媒体和政府发现。很快,他被评为"中国十大改革风云人物"、"广东省十大优秀科技企业家"等,获得了珠海市第二届科技进步特殊贡献奖,一位总把裤带提到胸下的最高领导视察后题词说"中国就应该做巨人"。
  你可以不关心政治,但政治会来关心你。
  为了支持这个"高科技楷模",当地政府以不到当时市价1/4的价格给了史玉柱一块市中心地皮盖楼(350/平米地价,2007年珠海的平均地价已经是3500/平米)。而在若干位更高层领导的直接鼓励下,他把计划一改再改,从原来的自用变成了商用,从最早的19层变成72层(全中国第一高楼),预算从2亿变成了12亿元。
  单纯软件业务的回报根本不足以支撑这样高的资金投入,于是史玉柱中断了技术创新,开始卖楼花、运作保健品、搞服装,杀入更加暴利的行业。最后因为由于工程拖期、宏观环境的恶化,导致整个公司的资金链断裂,巨人大厦从此沦为中国最著名的"烂尾楼",直到今天。
  有意思的是,1998年,背负着2亿巨债的史玉柱想要东山再起。他又算了一笔账,搞软件虽然利润很高,但市场相对有限,如果要还清2亿元,估计要10年;保健品不仅市场大而且刚起步,做脑白金最多5年(实际上只用了3年)。
  事实证明,他的选择居然又是对的。
超我
Superego
  一个人的性格,会成为他今后命运方向的指针吗?
  乔布斯,一个私生子,在中产阶级养父母的宠爱下长大,自卑与自大的双重人格。他的理想主义是与强烈的领地意识、以及咄咄逼人的攻击性混合在一起的。
  乔布斯早年的密友、曾经一起吸毒、一起去印度朝圣的丹尼尔。科特克说:"史蒂夫心中总是装着他的苹果电脑。从更深层次上分析,他的成功是由于其内心总有一种深切的不安全感,正是这种不安全感使他必须出去闯荡以证明自己存在的价值。另外,由于他从小就知道自己是被收养的孩子,他的行为并不被大多数人理解……"
  就像《星球大战》中安纳金天行者。这种内心深处的"原力",与加州的硅片、晶体管结合起来,苹果公司诞生了。正如伊甸园里蛇诱惑亚当和夏娃吃下的那个苹果,甜美而带有一点"邪恶"。
  事实上,在苹果电脑早期的发展中,沃兹的技术、马库拉的资本运作、斯科特的管理和乔布斯的远见几乎一样重要,但作为公司董事局主席,乔布斯的个人魅力,让他轻易成为了公众关注的中心,并几乎独享了上市成功后的光环。
  随着创业伙伴们因为各种原因一个个隐退,他越来越认为自己才是"点石成金"的超级人物,可以将个人凌驾于公司之上。硅谷最著名的投资人之一、当时苹果的董事会成员阿瑟。洛克回忆说:"那时,乔布斯刚愎自用,满脑子主意,肆意而为,毫不考虑公司的前途。"
  按照佛洛依德的理论分析,乔布斯的自我(ego)逐渐被本我(id)所控制,他被原力的黑暗面所吸引,并一步步走向公司的对立面,终于被董事会放逐。
  而那个来自安徽小镇怀远,独自闯荡大城市的青年同样拥有着强大的内心世界,激励他的是一种英雄主义情结。
  事实上,史玉柱出生的环境里根本连个晶体管都找不到,当乔布斯和沃兹开始组装第一台计算机的时候,他还只能对着《十万个为什么》自制土炸药。更不用说预判到"一人一台电脑"的产业未来呢?
  对于以嬉皮士自居的乔布斯而言,电脑恰好是能帮助他释放旺盛的Libido(欲望)的媒介罢了,但对于史玉柱来说,电脑则是帮助他改变命运的唯一工具。否则他只能像刘震云小说《单位》里的大学生小林一样,过着按部就班的生活。
  1984年,在乔布斯策划的那则著名广告里,苹果的女模特挥锤砸烂了"Big
Brother老大哥"。在PC世界里,谁都知道"老大哥"就是IBM.
1990年,身高1米80、体重不到120斤的史玉柱给自己的新公司起了一个非常响亮的名字——"巨人",他宣布,巨人要成为中国的IBM,东方的巨人。
  这很容易让人联想起2000多年前的刘邦,他在见到秦皇车驾时的感叹,"大丈夫当如是也"。而另一个叛逆者项羽,说的是"彼可取而代之"。
  这种自我赋予又被外界不断强化的使命感贯穿了史玉柱创业的前半程。熟读毛选,青年楷模,大跃进式的增长目标,军事化的企业管理,为自己为城市树立一座固化的丰碑……
  终于有一天,这些使命变成了他再也承受不起的包袱,庞大的"巨人"分崩离析。三年后,在经历了对人性和坏境的彻底反思,一次次自杀的念头和被追杀的恐惧之后,一个完全理性的、成熟的、内心更强大的史玉柱回来了。
  他彻底放弃了珠海时期的企业文化"做中国的IBM","这是非常害人的一个空想,制定了一个很虚的目标。它在鼓励什么,鼓励大家搞大跃进、搞浮夸,让大家心里面很浮躁,对于现实没有什么帮助,现在我就不搞那个宏伟的目标了,我觉得实用最关键。"
  新的文化很直白,"说到做到、只认功劳、严己宽人、敢担责任、艰苦奋斗。"这是在黄山太平湖,柳传志教给他的。
  史玉柱不再把自己当成一个"知识分子",他坦言"胆子越来越小","只做好商人必须做的事情"。在一个只有"锦上添花"没有"雪中送炭"的现实环境里,他找到了正确的生存策略。让企业永远保持充沛的现金流,负债率低于30%;只做高利润率又不跟政府沾边的生意(这样的生意常常处于灰色地带);既然银行不肯借钱,就干脆参股银行;及时把公司变现,玩资本财技(上海健特借壳、巨人上市融资近10亿美金);跟有合法伤害权的媒体保持恰当的距离又给予充分的好处。唯一遗憾地是,他对创新不再有兴趣。
  乔布斯在"荒野"中被放逐的时间更长。尽管他的坏脾气改变有限,但他学会了宽容和谦卑,知道怎么信任和授权给优秀的人,比如Pixar总裁约翰。拉赛特,乔纳森。埃弗。这个设计白色马桶的英国人,后来在苹果公司担当设计副总裁。他学会了合作与开放,让微软入股,用英特尔的芯片,建立了iPhone开放平台。
  人们的第一次成功往往根源于欲望和运气,而第二次乃至更多的成功则需要智慧和自控。
  无论乔布斯还是史玉柱,最终都通过克制本我,实现了自我超越(Superego),这才是他们真正的魅力所在……
  不同在于,两个理想主义的青年,一个变成了真正的商业梦想家,为了创造未来他不惜调动一切资源。而另一个人转变为纯粹而现实的商人,精确地计算着自己的付出与回报,不再做哪些费力不讨好的事。
小王国与大盗
  其实,道德感与一个人的成功并无太大关系。
  在硅谷,与乔布斯的天才同样闻名的是他的傲慢自负、喜怒无常、抠门小气、巧取豪夺、冷漠无情。前时代周刊的记者,日后红杉投资的大佬迈克。莫里茨,曾把在乔布斯威权统治下的苹果称之为"小王国"(Little
Kindom),这是一个非常准确的描述。
  专制带来效率,难得乔布斯的个人品味和商业直觉又皆属一流。不过,如果乔布斯生在中国的话,一个传统意义上的"臣民社会"而非"公民社会"里,他的自大会惯坏他,人们会完全屈服于他的权威,听从他的指令,直到他最终把公司毁灭,就像牟其中、唐万新、孙宏斌这些人一样。
  但他生在美国,民主社会和资本主义机制里有种天生的"对冲"力量。董事会、股东大会、机构投资者像一道道紧箍咒约束着他。默认的游戏规则是,只要你有能力做大公司的价值,就算你是个暴君也无妨;反之,等待你的就是自动下台或者政变逼宫。
  在中国,大多数民营企业和其创始人的命运,缠绕得太紧密了。权力的垄断和资本的垄断密不可分。我们没有发明出一套"防火墙"的制度,能将创始人的个人行为、个人信用与企业分离开。
  于是,考察企业家自身的道德品质,变成了一件无比严肃又异常困难的事情。
  相比大多数国内同行,史玉柱,堪称私德无缺。他信守承诺、有情有义、高度放权、慷慨分利,在公司破产之后,其核心团队成员仍不离不弃,甚至拿自己的钱来补贴公司。而他二次创业成功后,主动还债两亿的壮举,也足以表率。
  在后来的巨人集团内部,史玉柱甚至成功地创造了一个"民主管理"的小环境。他成立了七人执委会,任何决策都必须多数票才能通过。除了核心产品,日常人财物管理全部放手,文秘出身的总裁刘伟,事实上已扮演了CEO的角色。
  在《庄子。外篇》中,大盗盗跖(传说是贤人柳下惠的弟弟)与他的徒弟谈论"盗亦有道"。跖曰:"夫妄意室中之藏,圣也。入先,勇也。出后,义也。知可否,智也。分均,仁也。五者不备而能成大盗者,天下未之有也。"
  五者皆备的史玉柱,在现实的商业世界里扮演一个"Big
Brother"的角色,通过排山倒海的营销攻势,淹没一切反对声音。居高临下地制订规则,利用消费者的无知、贪婪和权力欲,还有既懒惰而又想过瘾的心理,设计出各种圈钱的工具(详见《南方周末》的文章《系统》)。
  史玉柱直言,"商业是什么?商业的本质就是在法律法规许可范围内获取最大利益。我是一个商人,做的事情就是在不危害社会的前提下为企业赚取更多利润。要一个商人又要赚钱又要宣扬道德,那不是商人,而是慈善家。"
  而视道德为无物、几乎从未在慈善事业上捐出一毛钱的乔布斯,从iMac、iPod到iPhone,他所推动的一切都是在迎合"YOU"这个消费者主权的时代。过去唯我独尊、四面树敌的苹果,开始走向一种新的理念:用户要的不是技术,甚至不是电脑,而是利益的最大化和体验的最优化。
  他不再把苹果视作一家电脑公司,归根结底,"我们骨子里就是一家消费品公司,你的生死存亡掌握在消费者的手中。他们才是我们关注的对象。我们觉得自己的工作就是对整个用户体验负责。如果表现不及格,那就是我们的错。错就一个字。"
  这是不是"民主"精神在商业里的最好体现?
羊驼
  1995年,史玉柱名列《福布斯》中国百富榜第8位,当时他是唯一一个搞高科技的企业家。
  2009年,史玉柱仍然是《新财富》500富人榜中,排名最高的与新经济有关的富豪。在他后面的是李彦宏、马化腾、施正荣等。
  看《枪炮、病菌与钢铁——人类社会的命运》一书,美国生物历史学家贾雷德。戴蒙德谈到了一个有趣的问题:为什么14种被驯化的大型哺乳动物有13种来自欧亚大陆,为什么欧亚大陆的牛、马、绵羊、山羊、猪,而不是南美洲的羊驼,成为最终广泛分布于全世界的牲畜?
  他的答案是环境。最主要的原因是,欧亚大陆由于其广大的面积和生态的多样性,拥有最多的可驯化的候补动物。而这些驯化动物又促进了欧亚大陆民族的繁荣,进而帮助后者征服全世界,而这些动物跟随着征服者遍及其它大陆。
  在商业世界里,存在着相似的问题。在过去100年中,为什么以美国为首的少数4-5个国家,而不是剩下的100多个国家,集中产生了几乎所有对社会进步至关重要的创新?几乎定义了这个星球所有成功的商业模式?
  史玉柱和乔布斯,两个同样具有商业天赋,且性格背景相似的创业者,最终一个变成垃圾商品的成功贩卖者,而另一个成为这个星球上最具创造力的企业家。
  当乔布斯在斯坦福的演讲"Stay hungry,Stay
foolish"可以影响全世界青年的时候,史玉柱在《赢在中国》里的语录却只能供本土创业者琢磨。
  每个社会里都可以孕育出潜在的商业天才。而真正的商业天才,在任何环境下都有可能成功的。
  但在某些环境中成长出来的商业,就像南美安第斯高原的羊驼。看着很可爱很善良,经济价值很高,但是却无法大规模的繁衍和推广。
  美国梦的真正含义是什么?是给一个理想主义者提供梦想成真的舞台。那么中国梦呢?是不是逼着一个理想主义者向现实妥协,最终自己成为这个环境的一部分,才能成功?
  "当巨人一步步成长壮大的时候,我最喜欢看的是有关成功者的书,当巨人跌倒之后,我看的全是失败者的书,希望能从中找出站起来的力量。"史玉柱说。
  在2000年CCTV的一次《对话》节目中,史玉柱谈到了所谓"理想的状态,就是说今后市场经济发育到一定时候,法制环境建立,然后就是政企脱钩,我最希望的是一个什么样的环境:就是一个政府包括国家领导人,省级领导人,包括地方领导人,他做他的事,我们企业做我们企业的事。就等于你这个领导人你定游戏规则,然后我们这些人就按你游戏规则做事。最好是不要有什么太多的接触,我就是这个意思。巨人大厦这个问题上,不管哪一级的领导人没有任何的责任,责任全是我的。"
  当一个人把所有的问题都归咎于内因的时候,是因为他意识到自己改变不了外在环境,能改变的只有自己。
  其实近代以来,中国并不缺乏伟大的商人,比如胡雪岩、张謇、卢作孚,但他们死了,人们如今只记得一些轶事;而熊彼得定义的企业家过去了,他们还能留下激动人心的产品和伟大的公司。
  今天,中国可能是唯一一个创业热情甚至比美国更高的国家。各级政府鼓励"以创业带动就业",启动创业板,政府成立风险投资基金。这些都是好事。但必须承认,我们仍然是一个缺少知识产权保护,国家垄断资源和与之相关的分配权,资本更青睐与权力结合而非知识,优秀的年轻人希望跻身公务员之列的社会。
  哪些被乔布斯所激励的创业者们,最终会不会变成为史玉柱的信徒呢?
  这是一个问题。

2009年5月12日星期二

NAPI 技术在 Linux 网络驱动上的应用和完善

NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采用中断的方式读取数据,而代之以 POLL 的方法来轮询数据,类似于底半方式(bottom-half 的处理模式);但是目前在 Linux 的 NAPI 工作效率比较差,本文在分析 NAPI 的同时,提供了一种高效的改善方式供大家参考。

前言:

NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采用中断的方式读取数据,而代之以首先采用中断唤醒数据接收的服务程序,然后 POLL 的方法来轮询数据,(类似于底半(bottom-half)处理模式);从我们在实验中所得到的数据来看,在随着网络的接收速度的增加,NIC 触发的中断能做到不断减少,目前 NAPI 技术已经在网卡驱动层和网络层得到了广泛的应用,驱动层次上已经有 E1000 系列网卡,RTL8139 系列网卡,3c50X 系列等主流的网络适配器都采用了这个技术,而在网络层次上,NAPI 技术已经完全被应用到了著名的 netif_rx 函数中间,并且提供了专门的 POLL 方法--process_backlog 来处理轮询的方法;根据实验数据表明采用NAPI技术可以大大改善短长度数据包接收的效率,减少中断触发的时间;由于 RTL8139CP 是一种应用比较广泛的网络适配器,所以本文以其为例,说明了NAPI技术在网络适配器上的应用和基本原理。

但是 NAPI 存在一些比较严重的缺陷:而对于上层的应用程序而言,系统不能在每个数据包接收到的时候都可以及时地去处理它,而且随着传输速度增加,累计的数据包将会耗费大量的内存,经过实验表明在 Linux 平台上这个问题会比在 FreeBSD 上要严重一些;另外采用 NAPI 所造成的另外一个问题是对于大的数据包处理比较困难,原因是大的数据包传送到网络层上的时候耗费的时间比短数据包长很多(即使是采用 DMA 方式),所以正如前面所说的那样,NAPI 技术适用于对高速率的短长度数据包的处理,在本文的末尾提出了 NAPI 的改善方法,和实验数据。





回页首


使用 NAPI 先决条件:

驱动可以继续使用老的 2.4 内核的网络驱动程序接口,NAPI 的加入并不会导致向前兼容性的丧失,但是 NAPI 的使用至少要得到下面的保证:

A. 要使用 DMA 的环形输入队列(也就是 ring_dma,这个在 2.4 驱动中关于 Ethernet 的部分有详细的介绍),或者是有足够的内存空间缓存驱动获得的包。

B. 在发送/接收数据包产生中断的时候有能力关断 NIC 中断的事件处理,并且在关断 NIC 以后,并不影响数据包接收到网络设备的环形缓冲区(以下简称 rx-ring)处理队列中。

NAPI 对数据包到达的事件的处理采用轮询方法,在数据包达到的时候,NAPI 就会强制执行dev->poll 方法。而和不象以前的驱动那样为了减少包到达时间的处理延迟,通常采用中断的方法来进行。

应当注意的是,经过测试如果 DEC Tulip 系列(DE21x4x芯片)以及 National Semi 的部分网卡芯片,的测试表明如果把从前中断处理的部分都改换用设备的 POLL 方法去执行,那么会造成轻微的延迟,因此在进行 MII(介质无关)的操作上就需要一些小小的诀窍,详见 mii_check_media的函数处理流程,本文不做详细讨论。

在下面显示的例子表示了在 8139 中如何把处理过程放在 dev 的 poll 方法中,把所有的原来中断应该处理的过程放在了 POLL 方法里面,篇幅起见,我们只介绍接收的 POLL 方法。

在下面的 8139CP 驱动程序介绍中表明了可以把在中断程序中所做的任何事情放在 POLL 方法中去做,当然不同的 NIC 在中断中所要处理的状态和事件是不一样的。

对于所有的 NIC 设备,以下两种类型的 NIC 接收事件寄存器响应机制:

  1. COR 机制:当用户程序读状态/事件寄存器,读完成的时候寄存器和NIC的rx-ring中表示的状态队列将被清零,natsemi 和 sunbmac 的 NIC 会这样做,在这种情况下,必须把 NIC 所有以前的中断响应的处理部分都移动到 POLL 方法中去。
  2. COW 机制:用户程序写状态寄存器的时候,必须对要写的位先写 1 清 0,如下面要介绍的 8139CP 就是这样的类型,大多数的 NIC 都属于这种类型,而且这种类型对 NAPI 响应得最好,它只需要把接收的数据包处理部分放置在 POLL 方法中,而接收事件的状态处理部分放在原先的中断控制程序中,我们等下将要介绍的 8139CP 类型网卡就是属于这种类型。

C. 有防止 NIC 队列中排队的数据包冲突的能力。

当关断发送/接收事件中断的时候,NAPI 将在 POLL 中被调用处理,由于 POLL 方法的时候,NIC 中断已经不能通知包到达,那么这个时候在如果在完成轮询,并且中断打开以后,会马上有一个 NIC 中断产生,从而触发一次 POLL 事件,这种在中断关断时刻到达的包我们称为"rotting";这样就会在 POLL 机制和 NIC 中断之间产生一个竞争,解决的方法就是利用网卡的接收状态位,继续接收环形队列缓冲 rx-ring 中的数据,直到没有数据接收以后,才使能中断。





回页首


锁定和防冲突机制:

- 1.SMP 的保证机制:保证同时只有一个处理器调用网络设备的 POLL 方法,因为我们将在下面看到同时只有一个处理器可以对调用 netif_rx_schedule 挂在 POLL 队列中的 NIC 设备调用POLL 方法。

- 2. 网络核心层(net core)调用设备驱动程序使用循环方式发送数据包,在设备驱动层接收数据包的时候完全无锁的接收,而网络核心层则同样要保证每次只有一个处理器可以使用软中断处理接收队列。

- 3. 在多个处理器对 NIC 的 rx-ring 访问的时刻只能发生在对循环队列调用关闭(close)和挂起(suspend)方法的时候(在这个时刻会试图清除接收循环队列)

- 4. 数据同步的问题(对于接收循环队列来说),驱动程序是不需要考虑的网络层上的程序已经把这些事情做完了。

- 5. 如果没有把全部的部分交给 POLL 方法处理,那么 NIC 中断仍然需要使能,接收链路状态发生变化和发送完成中断仍然和以前的处理步骤一样,这样处理的假设是接收中断是设备负载最大的的情况,当然并不能说这样一定正确。

下面的部分将详细介绍在接收事件中调用设备的 POLL 方法。





回页首


NAPI 提供的重要函数和数据结构和函数:

核心数据结构:

struct softnet_data 结构内的字段就是 NIC 和网络层之间处理队列,这个结构是全局的,它从 NIC中断和 POLL 方法之间传递数据信息。其中包含的字段有:

struct softnet_data
{
int throttle; /*为 1 表示当前队列的数据包被禁止*/
int cng_level; /*表示当前处理器的数据包处理拥塞程度*/
int avg_blog; /*某个处理器的平均拥塞度*/
struct sk_buff_head input_pkt_queue; /*接收缓冲区的sk_buff队列*/
struct list_head poll_list; /*POLL设备队列头*/
struct net_device output_queue; /*网络设备发送队列的队列头*/
struct sk_buff completion_queue; /*完成发送的数据包等待释放的队列*/
struct net_device backlog_dev; /*表示当前参与POLL处理的网络设备*/
};


核心 API:

1. netif_rx_schedule(dev)

这个函数被中断服务程序调用,将设备的 POLL 方法添加到网络层次的 POLL 处理队列中去,排队并且准备接收数据包,在使用之前需要调用 netif_rx_reschedule_prep,并且返回的数为 1,并且触发一个 NET_RX_SOFTIRQ 的软中断通知网络层接收数据包。

2. netif_rx_schedule_prep(dev)

确定设备处于运行,而且设备还没有被添加到网络层的 POLL 处理队列中,在调用 netif_rx_schedule之前会调用这个函数。

3. netif_rx_complete(dev)

把当前指定的设备从 POLL 队列中清除,通常被设备的 POLL 方法调用,注意如果在 POLL 队列处于工作状态的时候是不能把指定设备清除的,否则将会出错。


 




回页首


如何在8139CP使用NAPI:


 

从 POLL 方法的本质意义上来说就在于尽量减少中断的数目,特别在于大量的小长度的数据包的时候,减少中断,以达到不要让整个操作系统花费太多的时间在中断现场的保护和恢复上,以便把赢得的时间用来在我网络层上的处理数据的传输,例如在下面介绍的 8139CP 中断的处理过程中,目的就在于尽快把产生中断的设备挂在 poll_list,并且关闭接收中断,最后直接调用设备的POLL方法来处理数据包的接收,直到收到数据包收无可收,或者是达到一个时间片内的调度完成。

RTL8139C+ 的数据接收环形缓冲队列:

RTL8139C+ 的接收方式是一种全新的缓冲方式,能显著的降低CPU接收数据造成的花费,适合大型的服务器使用,适合 IP,TCP,UDP 等多种方式的数据下载,以及连接 IEEE802.1P,802.1Q,VLAN等网络形式;在 8139CP 中分别有 64 个连续的接收/发送描述符单元,对应三个不同的环形缓冲队列--一个是高优先级传输描述符队列,一个是普通优先级传输符描述队列,一个是接收符描述队列,每个环形缓冲队列右 64 个4个双字的连续描述符组成,每个描述符有 4 个连续的双字组成,每个描述符的开始地址在 256 个字节的位置对齐,接收数据之前,软件需要预先分配一个 DMA 缓冲区,一般对于传输而言,缓冲区最大为 8Kbyte 并且把物理地址链接在描述符的 DMA 地址描述单元,另外还有两个双字的单元表示对应的 DMA 缓冲区的接收状态。

在 /driver/net/8139CP.C 中对于环形缓冲队列描述符的数据单元如下表示:

struct cp_desc { u32 opts1;/*缓冲区状态控制符,包含缓冲区大小,缓冲区传输启动位*/ u32 opts2;/*专门用于VLAN部分*/ u64 addr; /*缓冲区的DMA地址*/ };

8139CP 的 NIC 中断:

static irqreturn_t
cp_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
{
struct net_device *dev = dev_instance;
struct cp_private *cp = dev->priv;
u16 status;
/*检查rx-ring中是否有中断到达*/
status = cpr16(IntrStatus);
if (!status || (status == 0xFFFF))
return IRQ_NONE;
if (netif_msg_intr(cp))
printk(KERN_DEBUG "%s: intr, status %04x cmd %02x cpcmd %04x\n",
dev->name, status, cpr8(Cmd), cpr16(CpCmd));
/*清除NIC中断控制器的内容*/
cpw16(IntrStatus, status & ~cp_rx_intr_mask);
spin_lock(&cp->lock);
/*接收状态寄存器表示有数据包到达*/
if (status & (RxOK | RxErr | RxEmpty | RxFIFOOvr)) {
/*把当前的产生中断的NIC设备挂在softnet_data中的POLL队列上,等待网络上层上的应用程序处理*/
if (netif_rx_schedule_prep(dev)) {
/*关闭接收中断使能*/
cpw16_f(IntrMask, cp_norx_intr_mask);
__netif_rx_schedule(dev);
}
}
/*发送中断的处理过程以及8139C+的专门软中断的处理过程,这里我们不关心*/
if (status & (TxOK | TxErr | TxEmpty | SWInt))
cp_tx(cp);
/*如果发生链路变化的情况,需要检查介质无关接口(MII)的载波状态同样也发生变化,
否则就要准备重新启动MII接口*/
if (status & LinkChg)
mii_check_media(&cp->mii_if, netif_msg_link(cp), FALSE);
/*如果PCI总线发生错误,需要对8139C+的设备重新复位*/
if (status & PciErr) {
u16 pci_status;
pci_read_config_word(cp->pdev, PCI_STATUS, &pci_status);
pci_write_config_word(cp->pdev, PCI_STATUS, pci_status);
printk(KERN_ERR "%s: PCI bus error, status=%04x, PCI status=%04x\n",
dev->name, status, pci_status);
/* TODO: reset hardware */
}
spin_unlock(&cp->lock);
return IRQ_HANDLED;
}


把 NIC 挂在 POLL 队列(poll_list)上

在 8139CP 的中断程序可以看到 __netif_rx_schedule 的调用方式,它把 NIC 设备挂在softnet_data 结构中的 poll_list 队列上,以便及时的返回中断,让专门数据包处理 bottom-half部分来进行处理,我们先来看一下 __netif_rx_schedule 的内部工作流程。

static inline void __netif_rx_schedule(struct net_device *dev)
{
unsigned long flags;
local_irq_save(flags);
dev_hold(dev);
/*把当前NIC设备挂在POLL(poll_list)队列中,等待唤醒软中断以后进行轮询*/
list_add_tail(&dev->poll_list, &__get_cpu_var(softnet_data).poll_list);
/*确定当前该设备所要准备接收的包大小*/
if (dev->quota < 0)
dev->quota += dev->weight;
else
dev->quota = dev->weight;
/*启动软中断,在表示所有中断的状态字irq_cpustat_t中关于软中断字段__softirq_pending中,
把关于网络轮循接收软中断位置1,等待调度时机来临时候运行该中断的句柄net_rx_action。*/
__raise_softirq_irqoff(NET_RX_SOFTIRQ);
local_irq_restore(flags);
}

由 __netif_rx_schedule 启动的软中断的处理过程分析

软中断事件触发前已经在此设备子系统初始化时刻调用 subsys_initcall(net_dev_init) 在软中断控制台上被激活,挂在任务队列 tasklet 上准备在任务调度 schedule 的时刻运行它了,这个里面最主要的部分是调用了 8139C+ 网络设备的 POLL 方法(dev->poll),从网络设备的 rx-ring队列中获得数据,本来它应当放在网络设备中断服务程序中执行的,按照我们前面解释的那样,POLL方法以空间换取时间的机制把它放在软中断部分来执行轮循机制(采用类似老的 Bottom-half 机制也可以达到同样效果,而且更加容易理解一些)在每次进行进程调度的时候就会执行网络设备软中断,轮询 rx-ring 对 NIC 进行数据的接收。

软中断的处理过程:

static void net_rx_action(struct softirq_action *h)
{
struct softnet_data *queue = &__get_cpu_var(softnet_data);
unsigned long start_time = jiffies;
int budget = netdev_max_backlog;/*表示队列的最大长度*/
/*锁定当前线程,多处理器的情况之下不能被其他处理器中断处理*/
preempt_disable();
local_irq_disable();
/*检查POLL队列(poll_list)上是否有设备在准备等待轮询取得数据*/
while (!list_empty(&queue->poll_list)) {
struct net_device *dev;
/*这里保证执行当前的 POLL 过程的时间不超过一个时间片,这样不至于被软中断占用太多的时间,
这样在一次调度的时间内执行完毕当前的 POLL 过程,budget 表示一个时间片内最大数据传输的"块数",
块的意思为每个 POLL 所完成 sk_buff数量,每块中间的 sk_buff 数量为 dev->quota 决定,在 8139CP 驱动中,
budget 为 300,而 quota 为 16 表示每给时间片最多可以接收到 4.8K 的 sk_buff 数量*/
if (budget <= 0 || jiffies - start_time > 1)
goto softnet_break;
local_irq_enable();
/*从公共的 softnet_data 数据结构中的轮循队列上获得等待轮循的设备结构*/
dev = list_entry(queue->poll_list.next,
struct net_device, poll_list);
/*调用设备的POLL方法从NIC上的Ring Buffer中读入数据*/
if (dev->quota <= 0 || dev->poll(dev, &budget)) {
/*完成一次POLL过程的数据的接收,重新定义设备接收数据的"配额"
(事实上就是sk_buff缓冲区的数量,每次调用POLL方法的时候可以创建并且最
多可以向上层提交的sk_buff缓冲区数目,这个参数很重要在高速处理的时候有需要慎重优化这个数值,
在有大量数据接收的情况下,需要增加该数值)*/
local_irq_disable();
list_del(&dev->poll_list);
list_add_tail(&dev->poll_list, &queue->poll_list);
if (dev->quota < 0)
dev->quota += dev->weight;
else
dev->quota = dev->weight;
} else {
/*发生了错误的数据接收状况,或者没有完成"规定"配额的数据接收,并且没有新的数据进来,
这个也可能表示已经完成了传输的过程,调用__netif_rx_complete把网络设备从POLL队列上清除
(介绍POLL过程的时候详细介绍)*/
dev_put(dev);
local_irq_disable();
}
}
out:
local_irq_enable();
preempt_enable();
return;
softnet_break:
__get_cpu_var(netdev_rx_stat).time_squeeze++;
__raise_softirq_irqoff(NET_RX_SOFTIRQ);
goto out;
}


8139CP 驱动中的轮询方法

dev->poll 方法:

这个方法通常被网络层在向驱动的接收循环队列获取新的数据包时刻调用,而驱动的接收循环队列中可以向网络层交付的包数量则在 dev->quota 字段中表示,我们来看 8139cp 中 POLL 的原型:

static int cp_rx_poll (struct net_device *dev, int *budget)

参数 budget 的上层任务所需要底层传递的数据包的数量,这个数值不能超过netdev_max_backlog 的值。

总而言之,POLL 方法被网络层调用,只负责按照网络层的要求值("预算"值)提交对应数量的数据包。8139CP 的 POLL 方法注册通常在设备驱动程序模块初始化(调用 probe)的时候进行,如下:

static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
{
… …
dev->poll = cp_rx_poll;
… …
}

设备的 POLL 方法正如前所说的是被网络层上的软中断 net_rx_action 调用,我们现在来看具体的流程:

static int cp_rx_poll (struct net_device *dev, int *budget)
{
struct cp_private *cp = netdev_priv(dev);
unsigned rx_tail = cp->rx_tail;
/*设定每次进行调度的时候从设备发送到网络层次最大的数据包的大小*/
unsigned rx_work = dev->quota;
unsigned rx;
rx_status_loop:
rx = 0;
/*重新打开NIC中断,在 cp_interrupt 中断句柄中中断关闭了,现在 POLl 已经开始处理环行缓冲队列中的数据,
所以中断可以打开,准备接收新的数据包*/
cpw16(IntrStatus, cp_rx_intr_mask);
while (1) {/*POLL循环的开始*/
u32 status, len;
dma_addr_t mapping;
struct sk_buff *skb, *new_skb;
struct cp_desc *desc;
unsigned buflen;
/*从下标为rx_tail的内存中的环行缓冲队列接收队列rx_skb上"摘下"套接字缓冲区*/
skb = cp->rx_skb[rx_tail].skb;
if (!skb)
BUG();
desc = &cp->rx_ring[rx_tail];
/*检查在 NIC 的环形队列(rx_ring)上的最后的数据接收状态,是否有出现接收或者 FIFO 的错误,是否*/
status = le32_to_cpu(desc->opts1);
if (status & DescOwn)
break;
len = (status & 0x1fff) - 4;
mapping = cp->rx_skb[rx_tail].mapping;
if ((status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag)) {
/* we don't support incoming fragmented frames.
* instead, we attempt to ensure that the
* pre-allocated RX skbs are properly sized such
* that RX fragments are never encountered
*/
cp_rx_err_acct(cp, rx_tail, status, len);
cp->net_stats.rx_dropped++;
cp->cp_stats.rx_frags++;
goto rx_next;
}
if (status & (RxError | RxErrFIFO)) {
cp_rx_err_acct(cp, rx_tail, status, len);
goto rx_next;
}
if (netif_msg_rx_status(cp))
printk(KERN_DEBUG "%s: rx slot %d status 0x%x len %d\n",
cp->dev->name, rx_tail, status, len);
buflen = cp->rx_buf_sz + RX_OFFSET;
/*创建新的套接字缓冲区*/
new_skb = dev_alloc_skb (buflen);
if (!new_skb) {
cp->net_stats.rx_dropped++;
goto rx_next;
}
skb_reserve(new_skb, RX_OFFSET);
new_skb->dev = cp->dev;
/*解除原先映射的环行队列上的映射区域*/
pci_unmap_single(cp->pdev, mapping,
buflen, PCI_DMA_FROMDEVICE);
/*检查套接字缓冲区(sk_buff)上得到的数据校验和是否正确*/
/* Handle checksum offloading for incoming packets. */
if (cp_rx_csum_ok(status))
skb->ip_summed = CHECKSUM_UNNECESSARY;
else
skb->ip_summed = CHECKSUM_NONE;
/*按照数据的实际大小重新定义套接字缓冲区的大小*/
skb_put(skb, len);
mapping =
cp->rx_skb[rx_tail].mapping =
/*DMA影射在前面新创建的套接字缓冲区虚拟地址new_buf->tail到实际的物理地址上,
并且把这个物理地址挂在接收缓冲区的队列中*/
pci_map_single(cp->pdev, new_skb->tail,
buflen, PCI_DMA_FROMDEVICE);
/*把新建立的缓冲区的虚拟地址挂在接收缓冲区的队列中,在下一次访问rx_skb数组的这个结构时候,
POLL方法会从这个虚拟地址读出接收到的数据包*/
cp->rx_skb[rx_tail].skb = new_skb;
/*在cp_rx_skb调用netif_rx_skb,填充接收数据包队列,等待网络层在Bottom half队列中调用ip_rcv接收网络数据,
这个函数替代了以前使用的netif_rx*/
cp_rx_skb(cp, skb, desc);
rx++;
rx_next:
/*把前面映射的物理地址挂在NIC设备的环行队列上(也就是rx_ring上,它是在和NIC中物理存储区进行了DMA映射的,
而不是驱动在内存中动态建立的),准备提交给下层(NIC)进行数据传输*/
cp->rx_ring[rx_tail].opts2 = 0;
cp->rx_ring[rx_tail].addr = cpu_to_le64(mapping);
/*在相应的传输寄存器中写入控制字,把rx_ring的控制权从驱动程序交还给NIC硬件*/
if (rx_tail == (CP_RX_RING_SIZE - 1))
desc->opts1 = cpu_to_le32(DescOwn | RingEnd |
cp->rx_buf_sz);
else
desc->opts1 = cpu_to_le32(DescOwn | cp->rx_buf_sz);
/*步进到下一个接收缓冲队列的下一个单元*/
rx_tail = NEXT_RX(rx_tail);
if (!rx_work--)
break;
}
cp->rx_tail = rx_tail;
/*递减配额值quota,一旦quota递减到0表示这次的POLL传输已经完成了使命,
就等待有数据到来的时候再次唤醒软中断执行POLL方法*/
dev->quota -= rx;
*budget -= rx;
/* if we did not reach work limit, then we're done with
* this round of polling
*/
if (rx_work) {
/*如果仍然有数据达到,那么返回POLL方法循环的开始,继续接收数据*/
if (cpr16(IntrStatus) & cp_rx_intr_mask)
goto rx_status_loop;
/*这里表示数据已经接收完毕,而且没有新的接收中断产生了,这个时候使能NIC的接收中断,
并且调用__netif_rx_complete把已经完成POLL的设备从poll_list上摘除,等待下一次中断产生的时候,
再次把设备挂上poll_list队列中。*/
local_irq_disable();
cpw16_f(IntrMask, cp_intr_mask);
__netif_rx_complete(dev);
local_irq_enable();
return 0; /* done */
}
return 1; /* not done */
}


其他的使用 NAPI 的驱动程序和 8139CP 大同小异,只是使用了网络层专门提供的 POLL 方法--proecess_backlog(/net/dev.c),在 NIC 中断接收到了数据包后,调用网络层上的 netif_rx(/net/dev.c)将硬件中断中接收到数据帧存入 sk_buff 结构, 然后检查硬件帧头,识别帧类型, 放入接收队列(softnet_data 结构中的 input_pkt_queue 队列上), 激活接收软中断作进一步处理. 软中断函数(net_rx_action)提取接收包,而 process_backlog(也就是 POLL 方法)向上层提交数据。





回页首


能让接收速度更快一些吗?

我们现在来思考一下如何提高 NAPI 效率的问题,在说到效率这个问题之前我们先看一下在linux 的文档中 NAPI_HOWTO.txt 中提供一个模型用来构造自己 NIC 的 POLL 方法,不过和 8139 有一些不一样,其中 NIC 设备描述中有一个 dirty_rx 字段是在 8139CP 中没有使用到的。

dirty_rx 就是已经开辟了 sk_buff 缓冲区指针和已经提交到 NIC 的 rx_ring 参与接收的缓冲,但是还没有完成传输的缓冲区和已经完成传输的缓冲区的数量总和,与之相类似的是 cur_rx 这个表示的是下一个参与传输的缓冲区指针,我们在 NAPI_HOWTO.txt 的举例中可以看到这个字段的一些具体使用方式:


 
 /*cur_rx为下一个需要参与传输的缓冲区指针,
如果cur_rx指针大于dirty_rx那么表示已经有在rx-ring中开辟的rx-ring中的每个传输缓冲已经被耗尽了,
这个时候需要调用refill_rx_ring 把一些已经向网络层提交了数据的rx-ring接收单元开辟新的缓冲区,
增加dirty_rx的数值,为下一次数据接收做准备,*/
if (tp->cur_rx - tp->dirty_rx > RX_RING_SIZE/2 ||
tp->rx_buffers[tp->dirty_rx % RX_RING_SIZE].skb == NULL)
refill_rx_ring(dev);
/*如果已经当前的cur_rx和dirty_rx之间相差不超过总的rx_ring接收单元的一半,
而且剩下的一半中间有空的传输单元,那么我们不必担心了,因为还有足够的缓冲区可以使用(凭经验推断的),
就可以退出当前的程序,等待下一次软中断调用POLL来处理在这之间收到的数据,
(NAPI_HOWTO.txt中是重新启动时钟计数,这样做是在没有使能NIC中断处理的情况下)*/
if (tp->rx_buffers[tp->dirty_rx % RX_RING_SIZE].skb == NULL)
restart_timer();
/*如果执行到这里了,那表示有几种情况可能发生,第一当前的cur_rx和dirty_rx之间相差不超过总的rx_ring接收单元的一半,
调用refill_rx_ring后dirty_rx并未增加,(也许在rx-ring中大量的单元收到数据没有得到网络层函数的处理),
结果dirty_rx没有增加,而且也没有空闲的单元来接收新到的数据,这样就要重新调用netif_rx_schedule 来唤醒软中断,
调用设备的POLL方法,采集在rx-ring的数据。*/
else netif_rx_schedule(dev); /* we are back on the poll list */

在 RTL-8169 的驱动程序中就使用了 dirty_rx 这个字段,但是在 8139CP 中并未使用,其实这个并非 8139CP 驱动不成熟的表现,大家阅读 NAPI_HOWTO.txt 中可以知道,现在 8139CP 中并未严格按照 NAPI 所提出的要求去做,如果大家有兴趣的话,可以比较一下 8139CP 和 RTL-8169 这两个驱动之间的不同,大家会发现虽然两者都没有在 NIC 中断处理中去完成数据从驱动层向网络层上的转发,而都放在了软中断之中完成,但是在 8139 中利用了自己的一些独特的硬件特性,使 NIC 在利用关断中断接收数据的同时利用数据包到达位(RxOK)通知到达事件,然后采用 POLL 方法把数据从 NIC 直接转发到上层;而 RTL8169 还需要借助 softnet_data 结构中的 input_pkt_queue(套接字缓冲(sk_buff)输入队列)来完成从 NIC 中断到软中断之间的 sk_buff 数据调度;这样对于 8139CP 来说最大的好处就是不要了 dirty_rx 字段和 cur_rx 字段来让 POLL 方法以及 NIC 中断知道当前的传输单元的状况,还包括不需要不时定期的调用 refill_rx_ring 来刷新 rx-ring 获得空闲的传输单元;说到坏处我想就是重写了一个 POLL 方法,完全不能借用 /net/core/dev.c 中的 process_backlog 来作为自己的POLL方法,不过这个代价值得。

说了这么多,似乎都和提高效率没有关系,其实正好相反,通过这些了解我们对 softnet_data中的一些字段的意思应该更加清晰了,下面所叙述的,提高效率的方法就是在 8139CP 的基础上借用了 NAPI_ HOWTO.txt 中的一些方法,从实际上的使用效果来看,在某些应用场合之下比 Linux的 8139CP 的确是有了一定的提高,我们首先看看在 Linux2.6.6 的内核使用 8139CP 在x86(PIII-900Mhz)平台上的数据包接收处理情况:比较表如下:

Psize    Ipps       Tput     Rxint            Done
----------------------------------------------------
60 490000 254560 21 10
128 358750 259946 27 11
256 334454 450034 34 18
512 234550 556670 201239 193455
1024 119061 995645 884526 882300
1440 74568 995645 995645 987154


上表中表示:

"Pszie"表示包的大小 
"Ipps" 每秒钟系统可以接收的包数量 
"Tput" 每次POLL超过 1M 个数据包的总量 
"Rxint" 接收中断数量 
"Done" 载入 rx-ring 内数据所需要的 POLL 次数,这个数值也表示了我们需要清除 rx-ring 的次数。

从上表可以看出,8139CP 中当接收速率达到 490K packets/s 的时候仅仅只有 21 个中断产生,只需要 10 次 POLL 就可以完成数据从 rx_ring 的接收,然而对于大数据包低速率的情况,接收中断就会急剧增加,直到最后每个数据包都需要一次 POLL 的方法来进行处理,最后的结果就是每个中断都需要一次 POLL 的方法,最后造成效率的急剧下降,以至于系统的效率就会大大降低,所以 NAPI 适用于大量的数据包而且尽可能是小的数据包,但是对于大的数据包,而且低速率的,反而会造成系统速度的下降。

如果要改善这种情况,我们可以考虑采用以下的方法,我们在 MIPS,Xsacle 和 SA1100 平台上进行一系列的测试取得了良好的效果:

1. 完全取消 NIC 中断,使用 RXOK 位置控制接收中断,

2. 采用定时器中断 timer_list 的控制句柄,根据硬件平台设定一个合适的间隔周期(间隔周期依据平台不同而异),对 rx-ring 直接进行 POLL 轮询,我们在 MIPS 和 Xscale 上直接使用了中断向量 0--irq0 作为对 rx-ring 进行轮询的 top-half(注意我们在上述两个平台上选择的 HZ 数值是 1000,而通常这个数值是 100,并且重新编写了 Wall-time 的记数程序,让 Wall-Time 的记数还是以 10MS 为间隔),当然也可以根据自己的平台和应用程序的状况选择合适的定时时间。

3. 借助 softnet_data 中的 input_pkt_queue 队列,在时钟中断 bottom-half 中完成 POLL 方法之后,并不直接把数据传输到网络层进行处理,而是把 sk_buff 挂在 input_pkt_queue队列上,唤醒软中断在过后处理,当然可以想象,这样需要付出一定的内存代价,而且实时性能也要差一些。

4. 使用 dirty_rx 字段和 refill_rx_ring 函数,在调用完 POLL 方法以后,而且网络层程序比较空闲的时候为一些 rx-ring 中的单元建立新缓冲挂在环形缓冲队列上,这样可以在新的数据包达到的时候节省时间,操作系统不必要手忙脚乱地开辟新的空间去应付新来的数据。

5. 最后请注意:我们上层的应用程序是以网络数据转发为主的,并没有在应用层面上有很多后台进程的复杂的应用,上述的 1 到 4 点中所做的显而易见是以牺牲系统效率整体效率而单独改善了网络数据的处理。

我们再来看改善的 8139CP 驱动程序使用 8139CP 在 x86(PIII-900Mhz) 平台上的接收情况:

Psize    Ipps       Tput     Rxint       Done
----------------------------------------------------
60 553500 354560 17 7
128 453000 350400 19 10
256 390050 324500 28 13
512 305600 456670 203 455
1024 123440 340020 772951 123005
1440 64568 344567 822394 130000

从上图来看,数据传输的效率和波动性有很明显的改善,在高速率和低速率的时候所需要的POLL 次数的差距以前的 8139CP 驱动程序那么显著了,这样的而且最大的包接收能力也提高到了 553K/s,我们在 MIPS 系列以及 Xscale 系列平台上最大的包接收能力可以提高大约 15%-25%。

最后使用 NAPI 并不是改善网络效率的唯一途径,只能算是权益之策,根本的解决途径还是在于上层应用程序能够独占网络设备,或者是提供大量的缓冲资源,如果这样,根据我们的实验数据表明可以提高 100%-150% 以上的接收效率。