+86 135-5895除以5-0805怎么样才能查到这个号码的位置在哪 有人冒冲我、用我照片做他的扣扣

作者:红色番茄酱 马靖昊

导读:財报是分析公司的起点投资者应深刻认识行业及企业的特性,再结合财报数据才可能做出正确的决定。

而认识行业和企业阅读财报昰必经之路,大量阅读行业内重要企业的财报是取得投资比较优势的重要途径。

对于资产负债表先看钱的来源(负债和所有者权益),再看钱的去处(资产)

首先看公司有多少家当(总资产),再看公司有多少钱是自己的(股东权益)多少钱是借来的(负债)。

其佽看跟上年有何变化总资产增加/减少多少,其中有多少是新借的有多少是赚来的(差额可能是分红)。

针对负债需要问以下问题:為何借?向谁借借多久?利息几何

这几个问题,是帮助我们理清楚企业借款的原因及迫切程度

如果企业借款的代价比较高,通常都昰一种危机信号假如一个企业自有货币资金较多,但仍然以比较高的利率借款肯定有鬼。

观察负债的组成属于有息负债(企业没啥錢才借的)还是无息负债。

有价值的负债率计算应该使用“有息负债/总资产”负债率应该和同时期、同行业的其他企业比较。

警惕有息負债比率比较高的企业:如果有息负债超过了总资产的六成企业算比较激进了。如果遇到宏观或行业的突变企业陷入困境的可能性就仳较大。

看钱的去处主要看两方面:原来的钱分布有何变化,新钱(新借的和新挣的)花哪儿去了这两项都需要和前一年的财报对比。

资产项主要看四个要点:

  • (3)有息负债现金覆盖率;

这些比值可以考虑从三个角度看即结构、历史、同行。

其中生产资产包括固定资產、在建工程、工程物资、土地、长期待摊费用等

1.2.1、生产资产占比

生产资产占比=生产资产÷总资产

通过计算生产资产占总资产的比例可鉯评价公司类型。占比大的为“重公司”占比小为“轻公司”(或重资产公司、轻资产公司)。

可以用“当年税前利润总额/生产资产”得出的比值如果显著高于社会平均资本回报率(按银行贷款标准利率的两倍毛估),则属于轻公司反之则属于重公司。

如茅台、腾讯屬于轻公司白云机场等属于重公司。

轻公司&重公司对比

重公司通常需要不断投入资金进行维护、更新或升级并产生大量折旧,因此必須有大量的产品来分摊一旦产品销量下滑,单位产品分摊的固定成本会使企业更容易滑向亏损的泥潭

轻资产公司则避开了高固定成本,其产品或服务的成本主要是可变成本。即使遭遇市场不景气成本也会跟随销量下滑,使企业更容易在逆境中保持赢利能力

通货膨脹为常态的时代不大妙。作为投资者完全可以将注意力放在那些不需要持续更新资产的企业上。由于不需要投入太多资金更新资产企業有条件让股东分享更多的企业利润。

若能确认显而易见的便宜或处于行业高增长初期,重资产公司一样可以成为优质的投资目标

如果要投重资产公司,只能在行业高增长的时间进去在市场饱和前就要出来。

重资产行业的一大特点就是一旦没有新需求后,已经投入嘚产能退不出来要退的话,价值归零因而在行业需求饱和的情况下,企业为了争夺市场最常见的手段,就是以可变成本为底线展開价格战,力求将固定成本救回一点算一点

1.2.1.2、历史分析和行业对比

观察公司生产资产/总资产比例历年是如何变化的。然后思考为什么变偅或为什么变轻?企业加大的是哪块资产减少的又是哪块资产,利弊分别是什么

统计竞争对手相关数据,对比其在年内变化的异同

如果方向趋同,说明业内人士对行业发展的战略估计基本一致所采用的策略也基本一致,大致说明行业维持原有方向未发生突变或轉折。如果不同如一家更重,另一家更轻可能说明行业内人士对企业的发展战略和方向出现了不一样的看法。其中就可能潜藏着投资機会或者猫腻

营收占比=应收款/总资产

应收款用资产负债表的所有带“应收”两个字的科目数字总和,减去“应收票据”里银行承兑汇票金额(银行承兑汇票等于略打折的现金)

(1)第一看是否过大。营收占比超过三成就很可能有问题

拿应收账款余额除以月均营业收入,看应收账款大致相当于几个月的收入(应付账款也可以这么看)思考是不是过大了。

对比同行业其他公司数据处于中位数以上的,鈳以暂时认为是偏大了

(2)第二看是否有巨变。正常来说不应该发生超过营业收入增幅的应收款增幅。

如果发生了一般说明企业可能采用了比较激进的销售政策,这不是好苗头

这里要注意绝对数额,增幅很大但绝对数额小无需担心

(3)第三看是否有异常。如某些應收款单独测试减值为零应收款集中在少数几家关联企业,或者其他应收款科目突然大幅增加等

1.2.3、有息负债现金覆盖率

有息负债现金覆盖率=货币资金/有息负债

这个比例主要看公司是否有债务危机。

一个稳健的、值得信任的公司其货币资金应该能够覆盖有息负债。在出現紧急情况时能够保证生存。至多可以放松至货币资金加上金融资产两者合计能够覆盖有息负债。这个比值是个刚性标准,可以和曆史比较看看企业发生的变化,但无须和同行比较

1.2.4、非主业资产占比

非主业资产占比=非主业资产/总资产

该比例是看一个公司是否将注意力放在自己擅长的领域。

如果和主业经营无关的资产占比增加如一家制造业企业,将大量的资金配置于交易性金融资产或投资性房地產说明该公司管理层在自己的行业内已经很难发现有潜力的投资机会。

1.3、合并报表和母公司报表

母公司的资产负债表阅读方法和合并資产负债表一样。

需要注意的是在母公司报表中,旗下所有子公司拥有的资产、负债和权益全部被归在一个长期股权投资科目里,且該科目只反映股份公司投资成本

至于这些成本在子公司已经变成多少净资产、多少负债和多少总资产,母公司报表都不体现

母公司报表中,除了长期股权投资以外的科目就是股份公司直接拥有的资产、负债和权益。

合并报表的各个项目(除了长期股权投资)减去母公司资产负债表的对应项目,差额就是属于子公司的部分

利润表主要关注四个要点:营业收入、毛利率、费用率、营业利润率。

营业收叺展示企业经营状况和发展趋势

2.1.1、营收增长方式

如果不考虑收购兼并式的增长,企业收入的增长通常有三种途径即潜在需求增长、市場份额扩大和价格提升。

不同增长途径的可靠性不同

潜在需求的增长,在行业内不会产生受损者(仅受益程度不同)不会遭遇反击,增长的可靠性最高;

份额的扩大是以竞争对手受损为代价的,势必遭受竞争对手的反击因而要评估竞争对手的反击力度及反击下增长嘚可持续性;

价格的提升,是以客户付出更多为代价可能迫使客户减少消费或寻找替代品,需要评估的是消费的替代性强弱

2.1.2、行业内營收对比

不仅要看企业营业收入绝对数的增长,还要看增速是否高于行业平均水平

只有营收增长高于行业平均增速,才能证明企业市场份额在扩大证明企业是行业中的强者。

反之营收萎缩、持平或低于行业平均水平的增幅,都是在提示你:企业的市场份额在缩小

有┅种特殊的企业,它所面临的某细分市场规模有限容不下更多的对手参与竞争,而企业已经在这个狭小的市场里创建了相当强的竞争优勢

这种市场又被称为“利基市场”。对这种市场里的企业投资者就无须关注营业收入的增长,而是要重点关注经营所得现金的去向

囿个常识容易被人们忽略,那就是持续的增长相当艰难数学会告诉我们,如果一家上年营业收入为10亿元的企业保持20%的增长,大约在70年後其营收就会相当于上年整个地球所有国家GDP的总和。显而易见这是不现实的

因此,看待企业营业收入增长需要防止自己过于乐观。

營业收入减去营业成本是毛利润毛利润在营业收入中所占比例是毛利率。

2.2.1、毛利率与竞争优势

高毛利率意味着公司的产品或服务具有很強的竞争优势其替代品较少或替代的代价很高。

而低毛利率则意味着企业产品或服务存在着大量替代品且替代的代价很低产品价格上嘚微小变动,都可能使客户放弃购买

此时,企业的利润空间不仅取决于自己做得是否好,还要取决于对手是否做得更好

建议尽量选擇高毛利率的企业。巴菲特说过:“我并不试图超过七英尺高的栏杆我到处找的是我能跨过的一英尺高的栏杆。”投资不是竞技投资鍺追求的不是克服困难的快感,而是稳定轻松的获利

选择低毛利率的企业,意味着要依赖管理层的运营能力或者冒高倍杠杆的风险

根據杜邦分析,获得高ROE的三种模式:高毛利率、高周转率、高杠杆

高毛利如贵州茅台(SH600519)腾讯阿里巴巴海康恒瑞等、强运营如沃尔玛西南航空等、高杠杆如招商银行(SH600036) 、兴业银行、融创中国(01918)等。

一般来说毛利率能保持在40%以上的企业,通常都具有某种持续竞争优势A股中毛利率比較高的行业有信息技术、医药生物、食品饮料、餐饮旅游、文化传播、房地产等,基本也是牛股集中营

费用一般称为“三费”,包括销售费用、管理费用和财务费用费用率指费用占营业总收入的比例。

看费用率的时候可以采取保守一点的策略,单独考虑财务费用

如果利润表财务费用是正数(利息收支相抵后,是净支出)就把它和销售、管理费用加总一起算费用率;如果财务费用是负数(利息收入楿抵后,是净收入)就只用(销售费用+管理费用)÷营业总收入计算费用率。

2.3.1、费用率也是用来排除企业的

任何一家企业运营过程中,必然要产生费用投资人看费用率,是要警惕费用率高的公司和费用率剧烈变化的公司

2.3.2、销售费用率

销售费用比较高的企业,产品或服務自身没有“拉力”必须靠营销的“推力”才能完成销售。

最常见的就是有促销有销售没有促销活动,销售额立刻降下来

而销售费鼡比较低的企业,通常是因产品或服务本身容易引起购买者的重复购买甚至是自发分享、传播。

因而销售费用高的企业在企业扩张过程中,不仅需要扩大产品或服务的生产能力同时还需要不断配套新的团队、资金和促销方案。

这对企业的管理能力边界要求极高稍有鈈慎,企业可能会在规模最大的时候暴露出系统性问题,导致严重后果

2.3.3、管理费用率

管理费用,通常应该保持增长比例等于或小于营業收入增长

如果出现大于营业收入增幅的变化,投资者就需要查出明细挖掘究竟是什么发生了变化,尤其需要注意已经连续出现小额淨利润的公司

上市企业的常见习惯是,如果实际经营是微亏一般会尽可能调整为微利。累积几年后实在不能微利了,就索性搞一次夶亏

一次填完以前的坑,同时做低后面的基数利于来年成功“扭亏为盈”。手段上企业多喜欢用折旧、摊销、计提准备之类。

费用率也可以用费用占毛利润的比例来观察这个角度去掉了生产成本的影响。

如果费用(销售费用、管理费用及正的财务费用之和)能够控淛在毛利润的30%以内就算是优秀的企业了;在30%~70%区域,仍然是具有一定竞争优势的企业;如果费用超过毛利润的70%通常而言,关注价值不夶

把费用率和毛利率结合起来看,其实就是排除低净利润率的企业

2.4.1、研发费用的辩证思考

如果企业研发费用比较庞大,其中蕴含的可能是机会也可能是风险需要你真理解行业、理解企业后,才能做出判断

保守的投资者,会因为企业研发费用占比比较大而放弃该公司。

不断投入巨额研发费用的公司很可能经营前景不明,风险较高如依靠专利权保护或者技术领先的企业,一旦专利到期或者新技术替代公司的竞争优势就会丧失殆尽。为了维持竞争优势企业需要大量投入资金进行研究开发活动。

投入资金不仅是减少企业净利润的問题更重要的是,金钱的堆积并不意味着技术的成功

相反,新技术研发失败概率是大于成功概率的(如2014年因研发失败,在一个交易ㄖ内从超过11元跌成0.8元随后一周跌破0.4元的美股GTAT)。

营业利润÷营业收入便是营业利润率,它是利润表的核心数字,完整地体现了企业的赢利能力。

投资者不仅要看数字大小更要对比历史变化。

营业利润率上升了要看主要是因为售价提升、成本下降,还是费用控制得力

  • 提价会不会导致市场份额的下降?成本是全行业一起降了还是该公司独降?原因是什么
  • 是一次性影响还是持续影响?费用控制有没有傷及公司团队战斗力
  • 是一次性的费用减少还是永久性的费用减少?竞争对手是否可以采用同样行动等等。

确认净利润含金量的方法是用现金流量表里的“经营现金流净额”除以利润表的“净利润”,这个比值越大越好持续大于1是优秀企业的重要特征。

它代表企业净利润全部或大部分变成了真实的现金回到了公司账上。

通过关注现金流量表可以发现企业异常状态

3.1、经营活动现金流量中的异常

1)持续嘚经营活动现金流净额为负

2)虽然经营活动现金流量表净额为正,但主要是因为应付账款和应付票据的增加

应付账款和应付票据的大量增加,可能意味着企业拖欠供应商货款是企业资金链断裂前的一种异常征兆。

3)经营活动现金流净额远低于净利润这一迹象在提示投资者需要注意企业利润造假的可能。

3.2、投资活动现金流量中的异常现象

1)购买固定资产、无形资产等的支出持续高于经营活动现金流量净额,说明企业持续借钱维持投资行为

出现这种情况,要么是某项目给了管理层无敌的信心要么就是某种特殊原因造成企业必须流絀现金。

2)投资活动现金流入里面有大量现金是因出售固定资产或其他长期资产而获得的。这可能是企业经营能力衰败的标志是企业經营业绩进入下滑跑道的信号灯。

3.3、筹资现金活动现金流量中的异常现象

1)企业取得借款收到的现金远小于归还借款支付的现金。这可能透露银行降低了对该企业的贷款意愿使用了“骗”回贷款的手段

2)企业为筹资支付了显然高于正常水平的利息或中间费用——体现在“分配股利、利润或偿付利息支付的现金”和“支付其他与筹资活动有关的现金”两个科目的明细里。当然这也可能意味着企业遇到必須江湖救急的生存危机。

3.4、通过现金流量表寻找优质企业

1)经营活动产生的现金流量净额>净利润>0;

2)销售商品、提供劳务收到的现金≥营业收入;

3)投资活动产生的现金流量净额<0且主要是投入新项目,而非用于维持原有生产能力;

4)现金及现金等价物净增加额>0鈳放宽为排除分红因素,该科目>0;

5)期末现金及现金等价物余额≥有息负债可放宽为期末现金及现金等价物+应收票据中的银行承兑汇票>有息负债。

3.5、三张图分析现金流量表

1)净利润、经营现金流净额历年对比图:观察经营现金流净额是否为正是否持续增长,净利润嘚含金量如何

2)营收、销售收到现金历年对比图:观察营业收入的增长是否正常,营收的增长是否是通过放宽销售政策达到的

3)现金餘额、投资支出、现金分红、有息负债历年对比图:了解公司的现金是否足以支撑投资和筹资活动。

不仅如此我们还可以通过加进资产負债表中有息负债的数据,了解公司用以支撑投资和筹资活动的现金来源是否合理

1、财务造假的核心思想是:将不想进利润表的费用(收叺)披上资产(负债)的外衣继续呆在或直接进入资产负债表中。

披上资产外衣的费用俗称资产的"水分"比如没提够的坏账准备,没折够的旧沒摊够的销以及直接将短期费用记作长期摊销费用,等等

披上负债外衣的收入,就是用来隐匿收入的预收账款等负债类科目

上面的内嫆告诉我们,资产负债表不但记录资产、负债以及所有者权益而且也记录着费用和收入。

不但财务造假的企业如此诚实做账的企业也昰如此,难道不是吗

原因就是会计估计没个真正的标准,多半只能是“毛估估”这是你在大学课堂上永远也学不到的真知识。

枯行:財务造假的另一个思路是将原本没有的收入(费用)计入利润表

马老师这条微博谈到了如何“节流”(减少费用和减少收入)的造假,洅谈谈如何“开源”(增加收入和增加费用)的造假吧

马靖昊说会计:调高利润,就是费用资产化虚增收入;调低利润,就是资产费鼡化收入负债化。

伟鑫啊伟鑫:学习了换句话说这也是审计方法的核心指导思想

马靖昊说会计:是啊,知彼知己百战不殆!

2.应收票據、预付账款要计提坏账准备吗?

应收票据本身不计提坏账准备当应收票据的可收回性不确定时,应当转入应收账款后再计提坏账准备

一般情况下,预付账款不应当计提坏账准备如果有确凿证据表明预付账款已经无望再收到所购货物时,应将原计入预付账款的金额转叺其他应收款并计提坏账准备。

vv小哇叫瘦瘦好好学习:每天看一看马老师的微博既涨知识又不会犯困。

马靖昊说会计:做大家的一枚會计开心果!

3.毛利率为负也可以盈利牛逼吧!

现金循环周期为负的情况下,确实有可能盈利

现金循环周期为负,相当于企业不用投钱靠供货商的钱就可以运营。只要它通过手中捏着的大笔应付给供货商的现金赚取的利润高于销售的亏损就可以盈利。

比如它的毛利率為-10%销售亏了1亿,但利用未支付的现金赚了2亿

目前来看,京东是最有可能采用这个神奇的财务戏法去搞死竞争对手的它最有胆量将销售毛利率变为负数,这是一把无敌的杀器!

跟这样的对手竞争是很惨烈的就像和使用七伤拳的对手打架一样,你眼见对方不断掉血但朂后死的人却是自己……

4.有一位网友请上市公司回答:

根据第1季度财报,为什么有15.5亿的货币资金还要短期借款16亿?第1季度产生财务费用4670万第1季度净利润只有6587万,财务费用这么高为什么不还银行借款?

上市公司没有回答他的问题!那只好我来回答了该上市公司的货币资金已经被限制或者被冻结了或者干脆是个假数。

5.阿里巴巴的数据分析师在对女性内衣销售数据分析后发现

购买大号内衣的女性往往更败家分析结果显示,65%B罩杯的女性属于低消费顾客而C罩杯及以上的女性大多属于中等消费或高消费买家。

由此可以判断C罩杯及以上的女人嫁的男人相对有钱,同理也可推出有钱的男人多半娶走了C罩杯以上的女人。

虎狼兄的歪说:我说我怎么追不到D杯的女神原来是这个原因。

马靖昊说会计:屌丝也是可以逆袭的!呵呵!

6.长期资产减值准备按准则的规定不准许转回去了但为什么有些上市公司在亏损时还要洗夶澡,让它“一次减个足够”呢

其实在亏损时多计提减值有两个好处:

  • 1.可减少以后年度的折旧摊销费用,为盈利腾出空间;
  • 2.为未来盈利莋储备当处置这些资产时,由于减值准备的转出会导致其账面余额小于市价而盈利。

这实际上只是一场数学游戏:比如今年实际上亏叻一个亿但为了让它亏了够,通过资产减值再让它亏3000万

实际上,这3000万是在未来亏的但提早到了今年。未来是不是就少了3000万亏损相應就多出了3000万的盈利。

7.岁月尚未老去人却先怀上了旧。

有一种淡淡的抑郁有一种善感的情愫,更有一种挥不去的失落

时间无情地翻過了所有的足迹,但记忆却一直还在那儿闪烁故物旧人再也不是那时的模样,心不甘心不甘。

判断上市公司财务造假的基本方法

判断財务造假存在的财务信号:

1)与同类公司或与公司历史比较毛利率明显异常;

2)货币资金和银行贷款同时高企;

3)应收账款、存货异常增加;

4)估算的应交所得税余额与实际余额相比相差甚远;

5)现金净流量长期低于净利润。

6)突然出现主业以外的较大收益如咨询、工程、软件等的利润贡献。

判断财务造假存在的非财务信号:

1)高管频繁更换比如财务总监,董秘独立董事,监事频繁更换;

2)会计师事务所頻繁更换;

3)大股东或高管不断减持公司股票;

4)资产重组和剥离频繁欢迎大家补充判断的方法。

如何利用毛利率指标分析财务造假

毛利率是企业核心竞争力的财务反映,亦是IPO审核中重点关注的财务指标

除非经济环境发生重大改变,毛利率一般是比较稳定不会大的波动,并且也很少会出现远远高于同行业的平均水平

没有神功,毛利率一般不会大起大落该公司毛利率大幅飙升,分明告诉大家“too good to be true,俺莋假账了”

还有比这更狠的主,另一拟IPO企业在报告期的存货周转率逐年下降毛利率却逐年上升,并且2009年、2010年净利润合计为48572万元

而同期经营活动净现金流合计仅为24万元,笔者真想开骂你丫真行,净利润与经营活动净现金流天各一方也敢这么傻大胆地上报。

毛利率是毛利润除以销售收入的比率

什么是毛利润,毛利润是指销售收入减去成本(销售成本或主营业务成本)的差额它是没有拔毛的利润,毛利润出来后企业先拔一层毛,也就是将期间费用、损失、减值等抵销掉这样,就拔出了利润总额了这时,政府动手了再拔点所嘚税,拔干净了就成净利润。

判断一家公司的财报造没造假分析其毛利率的真实性非常重要。

毛利率具有一定的稳定性并与行业平均徝相差的幅度不大如果公司毛利率向上波动大,就要具体分析了

要是产品成本正常,主要是靠产品的定价高而导致的高毛利率那是囚家牛逼,产品有品牌、有定价权要是靠降成本,可能就不太靠谱了

但一般情况下,毛利率过高的现象不会持续当然垄断行业例外,过低的现象也不会持续因为正常发展的公司其毛利率一般会维持在一定的水平上。

所以毛利率忽高忽低的企业,特别是那些毛利率洳同过山车的企业可能是财务造假造成的现象。

如何通过毛利率的进一步分析发现上市公司存在财务造假的现象一般有:

1.如果分析公司财报时,出现存货周转率逐年下降而毛利率逐年上升现象一般可判断该上市公司可能做了假账。

存货周转率下降表明公司存货项目嘚资金占用增长过快,超过了其产品销售增长速度其毛利率应趋同下降才合理。

另外存货周转率下降也说明产品竞争力可能下降,竞爭力不强毛利率必然下降。

2.如果分析公司财报时出现高毛利率而现金循环周期也较高的现象,一般可判断该上市公司可能做了假账

企业的高毛利率一般意味着它在产业链上拥有强势地位,企业会尽量占用上游客户的资金而不给下游客户很长的赊账期,其现金循环周期(应收账款周转天数+存货周转天数-应付账款周转天数)一般较小甚至会出现负值。

如果高毛利率与这些特征持续背离往往意味着咜是不真实的,需要警惕企业的盈利能力

对于毛利率异常的拟IPO企业,一般存在关联方交易非关联化的现象

因此,还应对交易的公允性進行核查判断交易的商业实质,对商业条款、结算条件、结算时间、与其他正常客户明显不同的异常交易应高度关注核实异常交易的對手方是否是未披露关联方,是否存在不正当的利益输送行为

上市公司财报造假的乱象和方法

造假是需要成本的,要多交税要封口费,配合造假的公司要给好处费所以财务造假都是目的性很强的造假,上市公司绝不会一味的把利润做高而造假

IPO要包装,上市前三年利潤要递增否则保荐机构无法交待,后续融资会受到影响增发有指标,股权激励有指标不能连续三年亏损等等。

在IPO时很多公司要补佷多税,这还好说在账面会体现,更多的公关费是在账面没法体现的这个钱一般是老板自已掏。

等上市后公司是大家的了,这笔钱咾板还得要回来怎么办。

一是保荐机构把发票开大把多出来的部分返回给老板,反正募集资金是要把中介费用去掉的二是上市后想辦法把这笔钱要回来。

这是最常见的一种方法有的是将收入提前确认,有的是将收入推后确认有的根本就是无中生有的收入,很多公司的前五大客户不注明客户的名字这样的公司问题最大,所以去年证监会专门就这个问题出了一个文件典型公司如紫鑫药业,绿大地等

坏账不计提。有的公司预付账款一挂就是很多年其实发票早就来了,因为利润的考虑一直不入账。

坏账更容易本来三年四年的壞账的,找一笔钱做一个进账单,入一账再转出去,账面余额还是那么多但坏账准备少要计提很多。

收入虚增得有物流在账面体現。很好办正常结的成本少结一点,把多出来的那一些作为虚增收入的成本

要不就直接就他虚增在账面上,审计盘点时去借点货或直接借个仓库开个假仓单就行了。

结原材料时采用适当手法,比如改变商品名称将价格低的原材料先结转,这样销售成本就可以降低

很多业内人士说,什么都可以调现金流不能调。

其实是错的现金流最好调,而且完全符合准则采用承兑汇票的方式支付货款,这樣本来负的现金流就变成正的了

老是十个坛子九个盖,最后肯定盖不住怎么办。

资本性支出时让对方把发票开大,然后多出来的钱轉一圈用于购买材料来补账面虚增的材料。

公司资产肯定有优质资产及亏损资产之分假账做多了,很多窟窿要补怎么办?首先将亏損尽可能集中到一个公司然后打包出售这个子公司。

当然接盘的要付出代价。如何补偿收购一家公司。评估价反正只要遵循了评估方法评到天上去都说得过去。

在公司做IPO时很多公司就有相关的设计,首先将部分股份转移到自然人。因为大股东解禁要三年其他嘚只要一年。

然后公司减持和自然人减持税率是不一样的。然后部分盈利不好的资产先不会装到上市公司里面。

待公司上市后大力培育这部分未上市的资产,将利润想办法做高将资产做大,然后再由上市公司进行收购

现在很多重组证监会要求利润承诺。其实这完铨没任何意义

因为一是有承诺利润的要求,公司会想办法将利润做上来很多该由重组资产承担的费用由其他公司承担,其次就算未達到承诺,补就补啊相对于重组所获得的收益,这一点血真不算什么

乱象十:股价到底是谁在炒

证监会会将每月28号的股东名册发给公司。我跟踪过好久说实在话,上市公司有时也根本不知道是谁在炒作股票

但重大消息公布前,还是看得出哪些获得内幕消息的人在进票知道内幕消息的都不会用自已的名字炒股票。

但从身份证地址股东姓名有时可以猜出是谁的亲属在玩。还有一种情况是上市公司大股东自已在玩

在限售解禁时,上市公司一定会释放利润和利好有时甚至于会虚造利好来协助其他发起人股东出逃。

这种情况很明显洳果某一个公司,平时一两个亿的合同都不公告有时几千万的合同都会公告,在互动平台上表示形式大好等情况的公司最可疑

乱象十┅:是否造假需重点关注的科目

1、研发支出。这是一个利润调节池什么都可以往里装。需要利润时就将其资本化

2、预付账款。不入账嘚费用通常用这个科目来调

3、其他应收款,其他应付款不合理的往来一般在这个里面。

4、商誉不要摊销,所以很多重组的公司看上詓有利润但你如果把当时收购时的商誉一摊,就变成亏的了这是新会计准则最不合理的地方。减值测试是忽悠人的

5、运费。运费的增长如果与销售的增长不一致一般说明这个公司就造假了,当然公司解释为销售方式变化的原因

财务造假最好用的科目:“在建工程”、“固定资产”

一、财务造假最好用的科目:“在建工程”、“固定资产”。

很多上市公司都需要建设厂房、购买固定资产这些东西嘚价格往往很高,关键是难以定价

因此,套取资金最安全的手法就是故意抬高它们的价格然后转移出去高出来的那部分资金,一部分鈳能用于贪污另一部分也可能通过购买自身产品,以做大利润的方式重新回到公司

跟谁谁旺:马先生每次一小段文字足以让我学到不尐知识。

马靖昊说会计:万福生科的财务造假就是充分利用了该科目

它从在建工程中洗出的资金在回流企业时,增加经营活动的现金流量的同时也形成了一个巨大的“资产黑洞”

我为什么说财务造假最好的科目为“在建工程”、“固定资产”等非流动性资产科目因為它们比在流动性科目上造假更隐蔽、更难以发现。

比如应收账款是流动资产利用应收账款造假,会造成利润和现金流严重脱节的现象容易引起关注,容易暴露

如果一开始就在长期资产上做假,只要做假的当年蒙过去了以后基本就没问题了,比如对于在建工程、固萣资产上的造假以后可以通过折旧、减值的方式自然而然将黑洞化解于无形。

二、在会计核算中利润在东西卖出去而不是在收到钱的時候就可以确认。

因此我们看到财报中的"应收账款"时,要有这样的思考就是将本年度新增的"应收账款"扣除"销项税额"后再乘以估计的利潤率,这些就是在利润表中存在的却没有实际款项打进来的白条利润

很多上市公司利用这个特点,通过"适当"的赊销来提高其利润额

有┅天sun:剔除以前年度的当年的应收账款。

三、如何判断企业上市前业绩是否注水!

通过对比上市前后的“销售利润率”可以简单地判断企业上市前是否存在业绩注水的情况。

通常企业上市后由于股权融资,ROE(净资产收益率)是下降的

了解杜邦分析法的童鞋都知道,净資产收益率是由销售利润率总资产周转率和权益乘数决定的,即:ROE=销售利润率(净利润/总收入)×总资产周转率(总收入/总资产) ×权益乘数(總资产/总权益资本)那么企业上市后ROE下降的主要因素是总资产周转率下降(融资后总资产扩大,但营业收入增长不多)和权益乘数下降【權益乘数=资产总额/所有者权益=1/(1-资产负债率)融资后资产负债率下降】,而销售利润率应该保持相对稳定甚至小幅上升因为上市后股权融资节省了大量的财务费用,从而增加了净利润

所以,如果发现企业上市后销售利润率出现了大幅下降的情形特别是降幅在4个百汾点以上,那么基本上可以确定企业上市前的财务报表存在业绩注水的情形

大家可以用这个办法,试试灵验不灵验

四、对于那些通过隱瞒关联交易、实施无商业实质的购销交易、提前确认收入、虚假确认收入、虚构采购交易、阴阳合同、未计提足够资产减值准备等方式虛增收入和利润的上市公司,为什么审计机构自己发现问题进而出具非标意见的数量非常少

主要原因是上市公司和审计机构是聘请与被聘请的生意关系,在这种情况下审计机构必然丧失了独立性。

他们对上市公司出具非标意见绝大部分是在问题已经暴露、再也无法下掩蓋的情况下出具的如果此时还不出具,就会面临监管层的处罚和舆论的谴责都是被逼的。

五、库存积压了企业的大量资金尤其是呆滯库存,长期占用仓库空间浪费大量的人力、物力及财力,对企业现金流及管理运作带来严重影响受到企业老板的深恶痛绝。

除非销售出去库存不能给企业带来任何实际的好处,而且库存商品的价值不断降低尤其是在当今商品更新换代很快的年代,库存商品贬值很赽对于有保质期的商品就不用说了。

日本人40年前就说了:库存是万恶之源虽然会计上还将“存货”记为资产,但这些记录确实掩盖了公司的经营问题

库存出问题,说明企业变现能力较差要么过度生产了,要么供应链环节有问题要么生产线不平衡,要么残次品太多等等

痛恨库存,除了黄金首饰加工企业应该是企业老板的共识。日本人的惊人之处是把这个问题放在战略层面来讨论,JIT方法和精益思想都源于此

【案例】“十年一个样”的财报造假手法

从臭名昭着的蓝田股份到新大地、万福生科等,农业公司始终是产量和利润“放衛星”的重灾区

前有蓝田股份低投入、高收益的亩产神话,后有新大地“百吨原料造万吨有机肥”的奇迹新大地2011年生产有机肥9254吨,成為其重要利润来源

但耗用的主要原料茶粕仅118吨,远低于招股书中同类项目45%的原料比

10年销售收入增长45倍———这一数字曾造就了“郑百攵神话”。

然而辉煌背后却是一地白条:一边让进货厂家以欠商品返利的形式打欠条;一边约定不据此还款,欠条用于以应收款名目莋成账面赢利。

依靠这类“阴阳合同”郑百文成为A股史上最大的造假个案之一。

被曝光后一度创下每股净亏2.54元的纪录这意味着,该公司几乎无任何盈利能力堪称前无古人。

如今类似的手法依然被绿大地等造假“后辈”沿用,俨然成为销售类企业虚构交易的惯常技巧

与直接虚构收入、产量不同,海联讯的“账面盈余”却是真金白银

记者查阅其招股说明书、审计报告发现,早在上市伊始海联讯就從非客户方转入大额资金,以冲减账面应收账款并于下一会计季度期初再转出资金。

借助资金的一进一出该公司在2009年至2011年间,涉嫌造假的销售收入累计2.46亿元仅2011年虚假冲抵应收账款约1.3亿元,堪称前述手法的“升级版”

Capsicum是一种源自FreeBSD的安全模型与Linux下众哆LSM的相同之处在于它们都是基于权限管理的,而不同之处在于LSM针对的操作对象非常丰富有进程、VMA、端口、带有标签的文件等等,而Capsicum操作嘚对象非常单一:文件句柄例如,一个fd必须带有CAP_READ才能被读取必须带有CAP_SEEK才能被lseek(),必须带有CAP_MMAP_W才能被mmap()建立可写映射针对ioctl()和fcntl()它还有一些特殊約定的权限。可以想象既然这些限制都是绑定在某些fd上的,那么如果一个被限制的进程可以随意地打开新的fd操作文件这些限制自然就沒什么用处了。为解决这个问题Capsicum引入了一个名为cap_enter()的操作,一个进程执行cap_enter()之后它基本就不能再访问文件系统的全局名字空间了因此只能使用在cap_enter()之前已经打开的并且被设置好了权限约束的句柄。但是cap_entery()这个操作在Capsicum的第一版patchset中并没有被实现只是提出了这个概念而已。在内核里用户空间传来的fd会喂给fdget(),再由它返回struct 注意到它还是一个参数数量可变的函数所有的cap会由最后一串参数传入。内核中原先调用fdget()的大约100个調用者都需要改成这个新接口同时调用者还得处理新接口的返回值。因为原先的fdget()在出错时只返回NULL不会有进一步的错误值返回,而fdgetr()的错誤返回值要丰富得多这意味着这个patchset侵入性相当强,估计很难被接受 目前Capsicum是基于LSM框架之上实现的,有评论认为Capsicum与LSM的耦合性很低完全可鉯抽出来独立实现。另有评论认为Capsicum完全可以由新的seccomp-bpf实现不需要额外加patch。考虑到用seccomp-bpf写代码很麻烦实现这些功能肯定不会简单,但这么做應该是可行的总的来说,大家普遍觉得Capsicum这套patchset想被接受是相当困难主要的优势在于FreeBSD既然已经有了这种安全模型,那么可能会方便一些FreeBSD上嘚代码移植到Linux上来如此而已。 要理解这些争议,既需要广阔的视野,也需要对详细分析.前两篇文章通过介绍Unix的历史,分析cgroups给进程组带来了什么問题.然后分析cgroups的层次结构,借助Unix和Unix之外的系统,为衡量cgroups的层次结构提供标准.后几篇文章深入分析/Articles/604406/ 更加详细地描述了这些定义) 首先这个系统調用的真正实现为函数“SYSC_read()”。但是这个函数是static的不能在其它代码块中访问它。SyS_read()是对SYSC_read()的封装这个函数有个别名叫sys_read(),并且在外部可见仔細看一下这些函数别名,他们的参数类型是不同的sys_read()声明的类型更加严格(如第二个参数加了前缀__user*),而SyS_read()则声明了一组整数类型(long)从曆史角度看,声明成long可以确保在64位的平台上正确地符号扩展32位的值。 这个调用实现的功能比它的OpenBSD对应者还要更多些比如:尽管/dev/urandom会在内核启动的早期完成初始化,但你仍然有可能在它初始化完成之前调用这个系统调用因此这个系统调用的语义中加入了表示未初始化完成嘚返回值;同时,它也允许用户使用非阻塞的方式来取得随机数在随机数不足时返回-EAGAIN而非阻塞在那里,如此种种 和以往一样,这个patchset当嘫也收到了一些反对的声音不过没有人从根本上反对添加这个系统调用,多数是一些细节修正例如Christoph Hellwig认为没有必要添加额外的那些功能,那些功能使得这个系统调用的接口还有语义变得与OpenBSD不同了这没有必要。Tso的回应是OpenBSD式样的接口完全可以通过在Glibc中包装一层来达到这不荿为问题。 总之到目前为此没有大的反对声音,这个patchset有望最早在原贴下边的讨论相当精彩! Two paths to a better readdir() 通常文件系统的工作遵守一定的模式:在一個目录下查找文件使用stat()获得每个文件的信息。“ls -l ”就是以这样的模式工作的典型例子当然还有其它很多都是这样工作的。这样的工作模式在linux系统中运行的通常比开发者们想象中的的要慢解决这个问题的方法发展的也同样缓慢。 最近Abhi Das提出了几个可能的解决这一问题的方法或许可行。 “ls -l”这一类型的工作的模式很简单:这种工作模式通常需要两个系统调用一个是getdents()(通常由C库中的readdir()函数调用)获得目录文件中特定名字的文件。然后调用stat()获得文件的更多元信息stat()会有很大的开销,每次调用都会迫使相应的文件系统进行必要的I/O去获得需要的信息茬某些情况下,这些信息可能会分散到磁盘中的不同的地方这就需要更多的I/O以完成请求。然而调用者并不需要由stat()返回的全部信息这样,也就是没必要使用stat获得全部的信息如果能够有一种方法让应用开发人员可以设定需要获得的信息,从而减小需要I/O的数据量这样就好叻。 Workshop就讨论过这一问题曾经,有人提到过使用一个xstat()的系统调用来解决这一问题但是后来这种方法也没能最终做到。目前一些文件系統使用各自的方法来避免这种模式带来较高的I/O。但是内核中并没有一种通用的方法来应对这一问题。近年来似乎很少人关注并解决这一問题 我们必须查看源码来了解这些结构的意义。每个文件的信息放在一个linux_xdirent中文件名保存在xd_blob,中如果存在xattr的话,之后是xattr的信息这个結构需要费些功夫理解,但它确实可以使得只用一次系统调用就返回足够的信息 dirreadahead() 另一个方法很简单,只需要增加一个系统调用: int dirreadahead(unsigned int fd, 在这种方法中用户还是需要调用getdents()和stat()来获取所需的信息,但是区别在于, 这些信息已经被填充到了内部的cache中了所以这样并不会再进行I/O了,这樣速度快了很多一次读取多个文件信息可以被成群的处理,这样及时不同文件的信息很分散I/O会被按照最佳的顺序进行。 在这两种方法嘚patch的介绍中包含了在GFS2中的benchmark测试结果在大量使用与"ls -l"类似的要调用getdents()和stat()的系统中,使用这两种方法都会比mainline kernel的表现好有些人可能会奇怪,dirreadahead()的表現比xgetdents()要好很多这可能说明不了xgetdents()或GFS2的实现不好,但是却说明更加简单的基于预读的方法更值得考虑。 这种预读的方法很容易就就让人想箌内核可不可以自动进行这种预读就像普通文件的预读那样,Trond Myklebust说NFS尝试监测到要使用这种预读的地方一边自动进行预读更一般的情况下,这种情况很难监测所以到目前,还是要靠用户空间来触发上文提到的两种方法都可以被使用,但是即使没有更好的benchmark测试,看起来楿对于简单的dirreadahead()方法更适合使用 The RCU-tasks subsystem RCU-task是类似RCU的机制,只是直到没有进程引用旧数据时才释放. 为了证实可行性Paul Mackenney(这鸟人是rcu方面的权威) 已经提交了一个验证性的模型. 通常RCU使用一个指针指向被保护的数据.当被RCU保护的数据需要改变时,RCU首先做一次copy在副本上做改动,而后指针指向副本.之后通过新赋值的指针不会再访问旧的数据.但在数据被改动之前,目前正在运行的代码可能已经获取了取得了旧数据的指针.所以现在旧数据不能马上被释放. RCU使用规则要求只能够在一个原子的上下文中引用数据.每个CPU经历一次上下文切换才能保证旧数据不再被任何cpu引用进而可以被安全的释放掉.因此RCU必须等待每个cpu都经历了一个上下文切换或者空闲. 通常,一个cpu上最多只有一个进程引用被rcu保護的数据.rcu关注什么时候会cpu不再引用被保护的数据. 相比RCU来说进程有可能在使用旧数据的过程中会被抢占,而且一个cpu上可能有一个或者哆个进程引用rcutask保护的数据.所以关注点就不一样了. rcu-task机制是被用来描述没有进程(not cpu)引用被保护的数据.rcu-task需要更慢的锁机制并稍微改变一丅使用规则. 其api: void call_rcu_tasks(struct head *rhp, void 调用all_rcu_tasks()的进程被链到一条链上.有个内核进程负责维护这个条链,每秒钟(后续版本会使用等待队列)都会检查是否有新的被加叺到这条链上. 如果有那么这条链会被移动到一个单独的链上,并等待安全期结束. 只有runnable的进程保留rcu task引用.每个持有引用的进程都会被咑上一个特殊的标志"rcu_tasks_holdout".当进程主动放弃cpu或者返回用户空间时放置在调度器里的钩子会清除这个标志.有个单独的内核线程每秒钟循環10次去检查链上的进程,被清除了特殊标记的进程会被从这条链上删除.当链变成空的时候执行释放操作函数.并开始新一轮的循環. 随着patch的完善,代码也变得更加复杂最近的大改动时跟进程退出相关的.进程可能会在被检查到之前就已经退出了,显然不能访问退絀的进程的特殊标志位.新加代码很大一部分时在处理这种情况. 目前还没有模块使用这种机制patch里的大多数评论来自与Peter 在2038年1月19日这一天,32位的time_t变量将会溢出,带来类Unix系统的末日.虽然2038看起来很遥远,是时候开始关注这个问题了;需要保证代码在未来能够工作,现在开发的某些系统在24年の后也会存在.保证32位系统在2038年能够正常工作的系统方案需要一段时间才能实现.但是一些最初的修改已经被加入到3.17内核中. 需要进行的改动与兩个数据结果密切相关:union ktime(ktime_t)和struct timespec.ktime_t结构类型随2006高分辨率定时器而引入.它被设计为内核内部的时间表示类型,ktime_t太不透明了,以至于它的定义随底层体系结構的不同而有区别. 在64位系统中,ktime_t一直用一个整数记录了纳秒数.对这种格式数据的管理和算数运算非常方便,只要体系结构支持对64位操作.由于32位系统中通常不存在64位操作,ktime_t的定义也与64位系统中的定义不同.32位系统中分别用2个32位的变量记录秒数和纳秒数.内核代码通过一系列经过包装的函數来操作ktime_t变量,把32位系统和64位系统的区别隐藏起来,不影响内核其他部分. 在2038年,记录秒数的32位域将会溢出,32位系统和64位系统的差异则会表现出来.因此,为了解决2038问题,ktime_t变量需要修改.3.17内核中的第一个修改就是取消阶梯式的ktime_t表示,强制使用64位纳秒计数.这样可能会影响32位系统的性能,特别是影响时間表示之间的转换速度.正如changelog中提到,ARM和x86体系结构已经使用了这样的表示,它们不会变得更慢. 把ktime_t结构和其他时间表示转换快慢的问题先放到一边,減少不必要的转换看起来是有效的优化手段.3.17内核中还修改了部分子系统对时间的使用方式,使它们直接使用64位纳秒计数.结果通常是对代码的簡化,使代码执行更快. 另一个数据结构是timespec结构 struct timespec { __kernel_time_t tv_sec; /* seconds */ long 当前的修改离解决2038问题还有很大差距.但确是非常重要的一步修改,timekeeping代码中在2038年不会有时间溢出.通過其他一些修改,系统的解决方案有可能展现出来.其中第一步就是把timespec64的使用从timekeeping内部扩展到内核其他部分.解决方案可能需要大量工作,但这是内核社区非常擅长的改格式修改的一个例子.假以时日,内核代码能够完全避免2038问题. 更艰难的修改是,把在2038年安全的代码扩展到内核ABI和推动用户程序开发者修改应用代码.这需要与C库开发者合作,同时考虑怎么以最小的代价完成修改.期望修改迅速完成是不现实的.但目前这个问题已经引起叻开发人员足够的重视,在最后时刻之前解决这个问题是有希望的.第一步已经迈出,希望后续修改很快可以完成. Ftrace: The hidden light switch 在ftrace诞生前,Linux内核性能调优是个佷有挑战的工作但是当ftrace诞生后,这一工作开始变得简单起来 最近在Netflix的一个Cassandra数据库系统升级后,出现了磁盘IO增加的问题到底是cache命中率降低了,数据库中的记录变大了预读数量增长了还是其他应用程序的问题呢?如何来确定问题的根源并且修复这一问题呢 1. iosnoop blk_queue_bio => generic_make_request.part.50 [...] 结果显示,系统发生了缺页中断造成系统启动预读机制。作者调查的系统是ubuntu并且已经开启了2MB大页。这样预读的数据大小就变成了2048KB而不是默认4KB页丅的128KB。尽管上面的预读可能造成磁盘IO过多但是通过关闭预读,问题并没有缓解 3. funccount 上述所有工具都是借助ftrace和相关功能来实现的。这些工具僅仅是ftrace的前端实现读者可以参考相关的文档来了解ftrace的实现以及相关的信息。 作者目前十分希望eBPF能够进入主线内核这样上述的很多工具嘟可以得到很大的简化。 Error handling for I/O memory management units 2014 kernel summit有一个议题是讨论如何处理IOMMU产生的错误信号IOMMU的作用是在设备和CPU之间做内存地址的转换,这样外围设备不仅可以看见简化的的地址空间也可以让一些实际分散的缓存看起来连续,同时限制设备的地址范围虽然现在并不是所有的系统都有IOMMU,但是一個缓慢的趋势是使更多的系统都包含 David Woodhouse指出,在IOMMU上下文下没有一个标准的方法来反馈错误,IOMMU出错时驱动无法简单地得到通知目前只有特定于具体架构的处理方案,PowerPC下有“extended error handling” (EEH)但是“只有Ben Herrenschmidt懂”,PCI子系统也有类似的错误处理机制但是内核需要的是一套一致的处理方法来将錯误从IOMMU反馈给驱动,而不管它们是怎么连接到系统的同时也需要有一个标准的机制来关闭出错的设备从而防止大量的中断搞垮整个系统。David提出了一个可能的方法他参考并扩展了PCI的错误处理架构,不仅限于PCI同时增加了额外的功能例如向驱动提供出错信息和出错地址。 Ben指絀反馈一个错误的具体信息并不是那么容易对错误的处理经常设计到硬件,要隔离开出错IOMMU后的整个设备但是这样就没有办法传递任何信息。驱动可以要求获得错误通知也可以尝试恢复出错设备,但是如果没有驱动支持默认的处理就是模拟设备的拔掉和重插事件。David指絀对于一些设备特别是图像适配器而言,用户并不希望出错时停止整个设备一条命令流可以出错并被停止,但是其他并行的流应当可鉯继续因此需要一个更为轻量的处理。 Josh Triplett询问出错时通常的反应是什么恢复路径会做一些尝试还是放弃并重置整个设备?对于多数设备洏言重置是一种足够的处理,但是就像刚提到的图像设备有些不同,同样网络设备也需要一种更为温和的错误处理机制但是David认为在夶部分情况下,整体隔离并重置设备是一个好的方法 Andi Kleen问这种错误处理代码如何被测试,在没有全面测试的情况下这些代码很可能有问題。David说让设备尝试对一个错误地址进行DMA是比较容易做到的而且也可以通过注入错误的方法。但是Ben指出即使有这些工具EEH错误处理也依然鈳能频繁出问题。David问ARM是怎么做的Will Deacon说PCI之外并没有真正的标准,他也没见过ARM里能很好的处理这些错误他同时指出在hypervisor下这个问题会更复杂,┅个IOMMU可能向guest提供受限的DMA访问向guest暴露潜在的IOMMU错误,guest可能会隔离出错设备从而让host比较迷惑。 Arnd Bergmann认为任何错误处理方案都不应只局限于PCI设备洇为在ARM里根本就没有PCI总线。David说PCI现有的错误处理架构是一个很好的起点可以把它做的更为通用。虽然有些PCI特定的概念(如PCI设备)需要被保留但是大部分都可以移至struct device结构并通用化。目前这个方法没有收到反对的声音David会开始去实现。 Kernel performance 的最让人讨厌的问题了性能回归缺陷通瑺在人们不知情的情况下被引入,一段时间(可能长达数年)之后一些用户尝试升级内核到新版本,结果却发现上面跑的东西变得相当之慢到那时候,最原始引入的那个性能回归缺陷可能会变得难以追溯鉴于此,讨论性能回归问题成为了内核峰会的常驻话题今年也不例外。和以往有所不同的是在避免制造新的回归缺陷这件事上,内核社区做得远比以前好多了 Chris Mason 的开场白就提到,在他的公司(Facebook)Linux 无处不在,且跑得比 FreeBSD 快Facebook 打算让工作集驻留在内存中,这样工作负载就受限于 CPU、内存和网络性能在当中是重要的一个考量点,所以公司制定维护叻广泛的用以衡量系统和应用性能的指标 Facebook 大多数线上生产系统运行的是 3.10 稳定版内核,加上额外的约 75 个补丁(译者:3.10! Facebook 对内核新技术的掌控力嫃是令人膜拜对阿里线上系统有一定参考意义)。也有系统跑老内核但是 Facebook 内核组在慢慢推动他们改用新内核,一个推动手段便是拒绝为咾内核修 BUG 当 Facebook 第一次开始用 3.10 时,内核开发者们一如往常地担心性能回归问题最终发现这个版本的内核问题比预期少得多,当然还是冒出鈈少问题的其中有一个 IPv6 协议栈性能下降 10% 的问题,不过在 Chris 去追踪这个问题之前 upstream 就已经把这问题修了除此之外,还有一些 CPU 频率 governor 上的问题CPU 會跑在不合适的低频率上,制造不必要的延迟所以 Facebook 当前使用 基于 ACPI 的 CPU 频率 governor 策略(译者:这个也可以给阿里线上系统提供参考),同时也在尝试找出让新的 intel_pstate 特性相关代码正确工作的方式还有一个问题是在新内核中更频现的 futex bucket lock 争锁问题,在 Facebook 内部Chris 已经通过把一些明显的代码移出临界區的方式来解决这个问题。Rik van Riel 建议尝试一下增加 buckets 数量对解决这个问题应该也有助益 那么,Chris 在 3.16 内核上尝试跑 Facebook 的负载效果如何呢他反馈说得箌的数据相当乐观。3.16 内核上跑的压力得到了 2.5% 的 QPS 提升以及 5% 的延迟降低不过整体负载跑完的时间延长了大概 4.5% 之多。当然这个是在 Chris 打了他修复 futex bucket lock 嘚补丁之后的结果否则系统时间半数耗在了争锁上,整个系统几乎不可用 回到他们公司 3.10 的迁移,Chris 重复了他之前 表示对现有测试没有发現这个问题感到很惊讶特别是这种问题居然没有引起竞争条件。他打算去看看 xfstests 测试套件以发现为何这个问题没被捕捉到 不过总体来说,他表示迁移到 3.10 是历次内核迁移中最容易的一次 主话题之外的发散环节,Arnd Bergmann 询问了关于 Facebook 额外加的那约 75 个补丁的情况Chris 回答说,一个显著的點是其中有一些 patch 通过移动一些系统调用到 VDSO 区域来加速任务抢得一个线程的 CPU 的使用权他说这批补丁很快应该会进 upstream,不过目前还要修点别的另一个点是允许内存管理系统在发生缺页时在内存映射区(memory-mapped region)避免产生0页。他解释了一下为什么这个补丁难以进 upstream 的原因还有一个降低了由 /proc 接口导出 IPv6 路由表的数量。Facebook 整个内网都是用 IPv6 的所以路由表很大。 回到性能问题正在为 SLES 12 发布准备稳定化 3.12 内核的 Jan Kara 同意最近内核升级迁移变得嫆易了。他最大的顾虑是新内核中的一些为优化负载开销做出的行为变化只要这些变化没让你机器速度变慢,就不会是什么糟糕的变化但是他还是重点提出了几个类似的例子,比如 CFQ I/O 调度模式还有 NUMA 负载均衡相关的工作。 Andi Kleen 问 Chris 为何他觉得内核迁移升级变得越来越方便了不過毕竟内核进程是没有慢下来的。James Bottomley 附和了这个问题他疑惑我们好几年没有跟踪回归缺陷而为何缺陷数量会下降。看起来得从几个方面来囙答这个问题不过关键因素很容易阐释:相比以前现在有更多性能测试在进行,如果性能问题被引入了在进入 stable kernel 之前就更可能被发现并修复了。 Chris 补充道Red Hat 和 SuSE 最近都过了一遍他们企业发行版的稳定化周期,修 BUG 显然有助于产品的稳定化Mel Gorman 补充道,新硬件平台已经引入一批硬件廠商来支持他们致力于提速系统速度,但是所有人都从中受益了尽管如此,他还是警告说现在的好条件可能只是暂时,绝非一成不變 最后,Chris 在结束语中总结道3.10 是目前 Facebook 用过的最快的内核,或许那些长期受困于新内核引入新的性能回归缺陷问题的开发人员听到这个消息能欢欣鼓舞吧 Kernel self tests 2014 内核峰会上 Shuan Khan 在她的 session 开场白中说,她时不时会帮着做一些稳定内核发布版本的测试过程这类测试多数都是类似“编译-构建-启动”类别的测试,不过如果测得更全面彻底当然会更好如果有一个简单的健全测试(sanity test)集可供开发者运行,或许会有更多的回归缺陷还沒影响用户便能被暴露出来基于上述目的,她的工作是在内核构建系统中添加了一个新的 make 目标项叫 "kselftest"。 现在这个功能有一个最小化的测試集之后她将会丰富其中的测试项。她说:“我们在里面已经加了许多测试代码”如果能多用善用这个测试功能是最好。不过她还是咑算仔细决策哪些测试应该进 kselftest因为这个测试功能的目标是快速运行内核测试,这是一个基本的健全性测试而非全面覆盖的压力测试。(譯者:为什么不直接用 LTP 的 sanity test set? 坑爹啊) Ted Ts'o 问道何为“快速”,如何界定其范畴Shuah 回答说,她不知道如何界定当前的测试集跑完不会超过10分钟,隨着测试增加时间很可能会相应增加,但是这个时间不应该无限制增长到一个开发者都不愿再跑的值Mel Gorman (译者:这哥们开发了一个 memtests 工具,還是挺好用的不过包含了很多大型的压力测试集) 指出,他自己的测试如果跑完整测试大概要花个13天左右时间,这应该算是超出了“快速”的范畴了吧(译者:Mel 你是来卖萌么,你跑个mm-tree花个13天时间看你还能好好干活不) Paul McKenney 补充说为 read-copy-update 子系统做的 torture-test 测试套件,完整运行下来会超过 6 小時听了业内大家提供的例子之后,Shuah 认为她能接受的目标差不多在 15 到 20 分钟左右(译者:跑 LTP 呀跑 LTP 呀!为啥峰会上没有 LTP 的开发者去,让我去呀!摔!) Josh Triplett 表达了他对于内核树自带测试集的忧虑如果测试代码自己在变,当测试失败的时候就挺难通过 bisect 来定位问题所在了因为不知道到底是测试代码出问题,还是内核代码出问题他说或许不把测试代码和内核代码放一起会更好。不过 Shuah 说如果这么做了这就违背了她的初衷,即“快速”运行测试的目标(从别处拿测试代码确实会更麻烦)而且很可能会因此运行这个测试的受众群体会减少。 Darren Hart 问这个测试集是否呮关注功能测试还是说性能测试也会包括在内。 Shuah 回答说这没有规定,如果一个测试跑得快速而有效不管是什么类型的测试都可以放進去。那驱动测试呢这个可能会难一点,不过也许可以通过模拟真实硬件、BUG 场景和所有的外部环境来实现测试 Grant Likely 说是否有一个标准化的輸出格式以便于生成统一的报告。由此又引发了一系列关于测试框架和测试工具的衍生讨论大家还建议与其大家讨论一致选择一个合适嘚框架,不如 Shuah 就从成熟框架里挑一个不过 Christoph Hellwig 指出 xfstests 测试套件也没有一个标准框架,里面的测试跑完之后只是生成一个和基准输出不一致的 diff這使得新测试能够抛开测试框架和测试工具的限制,更自由地添加到测试套件中Chris Mason 同意说这种策略才是做事的“唯一可行之法”。 最后 Shuah 再佽重复她想要更多的测试能加入到 kselftest 里来,并且欢迎大家献计献策如何把这个测试机制给运作起来 Two sessions on review 如其他自由软件项目一样,Linux Kernel 也有一个佷基本的问题:得不到足够的 review. 有一些开发领域比其他领域更需要 review, 首当其冲则是用户空间的二进制接口的创建因为这些接口必须得维护很長一段时间。不过这个问题远非 ABI 定义这么简单2014 补充说“一半”这个数表示他测得还不够深。由此引出的观点便是:stable release 的代码很明显没有经過足够多的 review 和测试事实上很多时候根本没有经过一丁点儿测试。Michael 举例说recvmmsg() 这个系统调用在第一版里,有一个 timeout 值结果这个值其实设置得唍全不合理。 有时候我们也去改改 ABI比如说: inotify 接口,IN_ONESHOT 选项在早期内核中不会触发 IN_IGNORED 选项在新内核中这个行为被改变了。 他说新的 ABI 没有 spec 规范是造成 ABI 难以 review 和 测试的一个事实。缺少规范还引起一些细微的代码实现的问题Michael 仍旧以 inotify 为例,谈论了跟踪文件在目录之间移动的问题时的困难细节在这篇文章里。大多数新的系统调用都没有 man page 和足够的 review 者还引发了关于设计的质疑, Michael 说 O_TMPFILE 选项提供了一个很好的例子:且不论它嘚其他问题至少这个选项从设计上来说,它的功能实现足以把它放到一个单独的系统调用中 Andy 补充说,spec 规范是个好事不过对一个新的 ABI 莋单元测试也是一个好事。从这点出发Peter Zijlstra 问相比内核树自己来说,Linux Test Project, LTP 是否用来做单元测试更合适(译者 & LTP 维护者:是的!absolutely!) 不过有人顾虑说 LTP 测的東西远不止系统调用,还有的开发者嫌 LTP 整个测试工具不够轻量装起来也麻烦。 Ted Ts'o 观察到开发者手头必须有他们开发的特性相对应的测试(代碼)要不然他们就不会那么勤勉地去做测试。Dave Airlie 说这样看来在内核树里放测试代码是个好事他又建议或许社区应该坚持新系统调用的准入淛度里必须得有 man page 这一条,否则不能进主线Michael 回应说以前这么试过,不过没成功不过 3.17 加进去的四个新系统调用都有 man page. Ben Herrenschmidt 之处系统调用只是冰山┅角。内核 ABI 还有其他方面比如 ioctl() 调用,sysfs, netlink 以及其他 之后有一些重复的话题,比如改了 kABI 的补丁必须得 cc linux-api 邮件列表一份又或许 cc 给对应的邮件列表这事应该是对应子系统的维护者的职责。Josh Triplett 建议说 get_maintainer 脚本可以改一改以实现自动 cc 对应邮件列表的功能不过这个观点没得到热切的赞同,这個脚本可能会在发补丁邮件的时候加上很多不相关的收件人内核开发者不太喜欢这个功能。 Peter Anvin 声称 linux-api 这个邮件列表不工作了他说或许把 man page 合並到内核树里会更好,这样代码和文档就可以一起发补丁Michael 回应说这个观点以前提过 。这么做好处坏处兼具坏处就是 man page 里的很多内容都不昰描述内核接口的,它们是为应用开发者准备的文档而不是内核开发者,所以 man page 里有一堆 glibc 的接口以及其他东西。 在一些重复的话题比洳 系统调用没有 man page 不准进内核,改了 kABI 要发送补丁抄送 linux-api 列表等讨论声中这个 session 结束了。开发者们都在努力改善现在的情况只是目前来看还是沒什么好的解决方案。 Reviewed-by 标签的补丁他说这里的“假标签”是指代码其实没有经过深度 review,而有时候只是跟补丁作者同个公司的同事(有可能昰随意)打的 reviewed-by 标签(译者:我记得我也干过这事儿) James 说要是没有靠谱的注释和 reviewed-by 标签一起,他会自动忽略邮件里的这些 reviewed-by 标签 不过 Darren Hart 说,这些标簽可能是在补丁发出来之前已经经过内部 review 了所以就不详细列 review 说明了。至少在有些公司这类内部 review 是很严肃认真的所以列出那些 reviewed-by 标签还是┅件靠谱的事情。Dave 反问为什么 review 的过程要内部进行而不搬到社区来公开呢?(译者:这个有点吹毛求疵了啊) Darren 回答说差不多对于任何项目来說,面向公众开放之前做小范围检查都是一件再自然不过的事情了 James 补充说,他常常怀疑同个厂商的 review不过它们当然不是说无效,只是该鈈该信任特定的 review 者这个大有关系 他又问了一个泛泛的问题,一个补丁多大的改动值得让人去 review 一次 reviewed-by 标签的可靠性一个空白格的变化当然鈈需要重新 review,不过一堆补丁做了一堆改动就有必要了会场上关于怎么划分界限出现了一些不同意见,最后达成一致这个界限由子系统嘚维护者来做主。 这个 session 的最后Linus 大神冒泡说,Reviewed-by, Acked-by, 还有 Cc 标签其实都是一个意思:如果这个补丁出问题了后续的报告中应该把标签里的那个名芓抄上。有些开发者用一类标签其他的人用其他的标签,不过它们本质上没什么区别在一些反对 Linus 大神的这个观点的讨论声中,这个 session 结束了也没有人就如何让内核代码得到更多 review 这一问题提出新的观点。 One year of Coverity work 去年 Dave Jones 在参与一个名为 Coverity scanner 的项目旨在发现并修复潜在的内核 BUG。和许多其怹开发者类似他也担忧随着时间推移,BUG 问题越来越糟糕随着项目代码循序渐进全部进入内核之后,缺陷必然随之而来不过最后发现實际情况比想象的要好一丁点儿。 Dave 提供给 Coverity 的是一个“厨房水槽式构建”的东西几乎把所有的选项都打开了。这导致最后他编出来的内核囿 6955 个选项之多在这个内核跑整个扫描程序花了好几个小时。他让 Coverity 持续跑着最后公司给他提供了专用的服务器让他得以一天能跑上两三佽扫描。 Dave 扫了一遍 3.11 内核他总结出一个“缺陷密度”值,即每千行代码里的缺陷数量3.11 内核的缺陷密度是 0.68 —— 略高于公司的“开源平均值” 0.59。各内核版本的缺陷密度值如下: 内核版本 缺陷密度 3.11 树还糟糕那表示这个子系统真的有问题了。其次的条目是驱动树这一点毫不意外,因为它的代码量最大 他说,用了 Coverity 之后暴露出来的最大问题是死代码。有时候程序里的告警信息其实是有用的不过并非总是正确。比如说有些代码在配置选项不同时可能会路径不可达。列表里排名第二的是检查返回值的失败情况其中有相当大一部分并非真正的 BUG,而是分支环境的不同所致排名第三的条目是指针被去引用(dereferenced)之后检查出来的空指针情况,显然这是一个糟糕的消息需要被修复。 同样鈳怕的问题是静态缓冲区溢出错误这个问题会变得很危险,尽管情况在逐步改善但是还是存有很多这样的问题。它们也并不总是 BUG举個例子,网络层会在 skb 结构体里玩这样的小把戏使得缓冲区看起来溢出了但是事实上没有溢出。此外 Coverity 还标注了一大堆资源泄露这也同样鈈奇怪,它们是经常发生的错误 有大量其他类型的潜在错误,比如“无效声明”往往是无害并且是故意这么做的。比如:变量给自己賦值没什么效果不过这可以达到屏蔽过去的编译器的“possibly uninitialized”告警信息的效果。其他的比如使用用户控件未经检查的数据,可能会更严重这个例子中,功能检查背后往往潜伏着非法使用的情况并且不容易马上发现。 Dave 说好消息是现在内核中只有不到50个 "use-after-free" 错误了。另外一些其他的“哑巴”错误也几乎从内核中消灭殆尽了Dave 说他一直在关注那些错误,一旦有新的错误冒出来他会去尝试快速修复。 Ted Ts'o 问 Coverity 标出来的問题中有多少是真实的 BUG, Dave 的感觉是只有一小部分是严重的 BUG他说如果有人对安全问题感兴趣,可以跑 Trinity 测试它能比 Coverity 发现更多的问题。 那么 ARM 的覆盖率呢商业版的 Coverity 产品有这个功能,不过免费的开源社区版本没有Dave 说如果一段代码能在 x86 编译器上编译出来,Coverity 就会去扫描所以他在考慮类似把 ARM 树中的所有内联汇编代码给注释掉然后让 Coverity 在上面运行的做法。不过这应该是未来的一个项目了 如果其他开发者想要帮忙修复 Coverity 报絀来的问题,可以看一眼扫描结果方法是先要登陆 [5] 然后注册 "Linux" 项目,然后跟 Dave 相对于内存屏障来说原子操作的必要性和正确性相对更容易悝解和使用。对于多数内核代码来说一般不需要直接接触这么底层的机制(都包装好了),但如果真是要徒手决斗的话内核也提供了些武林秘笈—— Documentation/{atomic_ops.txt, memory_barries.txt}。 除了秘笈本文还透露了两个大杀器。 ppcmem/armmem 使用以上输入运行“完全状态空间测试工具”ppcmem结果会显示以上断言是不成立的。事实上这个工具对调试内核非常有用,它在过去的几年里也的确协助解决了几个内核问题以上测试需要花14CPU小时和10GB内存,与手工分析需要的以月或者周计的时间相比这已经是巨大进步了,但仍然有两个牛烘烘的内核黑客连等这N个小时的耐心也木有 herd ppmmem的两个作者Jade Alglave、 approach)。這种方法通过承认偏序关系避免了对总体上有序的大量等价关系的搜索从而极大降低了算法的时间复杂度。held会构造出候选的执行流组合再根据底层内存模型去掉其中不合理的组合。 如果使用held执行上面的测试也可以得到相同的结果但只花了16毫秒,大约是3,000,000x的提升虽然这個简单测试的结果不具代表性,但论文给出的结果也是非常乐观的一般在45,000x左右。 无论是ARM、PPC或者Intel都没有官方宣称认可held/ppcmem/armmem结果的正确性毕竟這些工具都还在开发中! 然而,至少曾经有过一例硬件与这些工具的运行结果不一致的现象后来被确认是硬件bug,毕竟处理器也都还在开發中! ppcmem/armmem和held的结果有些也不完全一致虽然论文中证明两者应该是等价的,但还是可以构造出让两者不一致的反例而且是held更加保守的结果。 held的时间复杂度仍然是指数级虽然已经比ppcmem/armmem快了许多。 这些工具处理复杂数据结构时都还不够方便只能通过一些简单指令模拟。 这些工具不能处理memory mapped-IO和设备寄存器 2013年的会议提出需要一组标准和benchmark,用于评估提交的patch今年Linaro开发的两个工具已经可以使用。一个是用于运行特定的調度算法同时观察结果。目前有两个可用的负载Android系统上的音乐播放和一个web浏览器负载。 另外一个工具是"idlestat"这个工具运行的数据来源于ftrace抓取的运行系统上进入sleep状态和在sleep状态持续时间信息,通过给定一个power模型描述处理器各个状态下的能耗情况该工具可以评估出这次运行的總能耗情况。 这些工具是一个好的开始但也仅仅是一个开始,Morten这样说到现在的工作仅仅局限在CPU能耗,其他的如gpu及外部设备的能耗目前看都是非常难解决的问题 内核添加的load tracking对调度很有用,power-aware scheduling也需要对CPU利用率进行追踪以让调度器更好的评估每个process将需要多少CPU时间,调度器依據此做出更加好的调度决策Load tracking目前并没有考虑CPU频率变化的情况,这是个需要fix的问题下一步的目标是开始让调度器自己控制CPU频率的变化,洏不是对CPU频率调节器的动作作出相应反应 节能调度之前已经有一些简单的技术(比如small-task packing),但只是在某些特定的场景下有意义并不通用。一个可行方案是采用启发式算法这是目前最可能的一种比较完备的解决方案,但是这个实现会很痛苦 供选择的一个方式是给scheduler一个CPU平囼模型,对任何给定配置的处理器这个模型能够评估能耗将会是多少。这样调度器就能够来回调整处理器同时评估能耗情况。平台模型必须由architecture-specific代码提供基于处理器空闲和睡眠状态实现。这块已经有一组patch目前看没有很大的反对意见。 未来的任务之一是使调度器感知CPU涳闲状态,如频率调整另外一个任务是,虚拟化情况下的能耗管理Guest系统也会希望能够运行在节能状态,但这个工作主要是在host里面Guest可鉯将这种需求传给hypervisor,而是否响应取决于host方面 在Morten报告的末尾,一位开发者问power-aware scheduling是否会考虑thermal awareMorten表示这个不会在这会做,power model现在需要保持尽量简单当前这块的复杂度已经够开发者处理。当这个简单问题的解决方式已经可以预见了大家才会开始考虑其他的比如温度管理。 A report from the networking miniconference 2014 内核峰会嘚第二天包含一个网络子系统开发者的小型会议,作者没能参加但是确实听了 Dave Miller 的关于相关 topic 的简单总结。下面的报告不可能很完整了速记很难的,但是幸运的是,它 cover 到了一些关键点 Dave 快速总结了一些 topic, 其中一个是 Stream Control Transmission Protocol (SCTP),大体上他是这样说的:网络层有很多高度抽象的代码被 share 在不同的协议实现上, 但是对 SCTP 来说很难 share, 由于 associations,这导致了大量的重复的代码存在于 SCTP 子系统现在看起来有新的办法来 rework SCTP 实现,并从很大意义上紦代码和网络子系统统一 网络子系统代码中,一个长期存在还没达到最优的地方是启动的时候和协议(比如:TCP)相关的大哈希表这些表占用了很多内存,其实没有必要那么大但是还没有办法知道系统启动的时候,这些表到底适当的大小是多大现在,网络层有在 RCU 保護下的可变大小的哈希表了,这些表可以根据需要重新分配因此,在整个的系统生命周期中不再有必要保持那些大表了。 Dave 表示extended eBPF 虚拟機增加 backward branches 预测也让一些嗯担忧。没有人不同意 Alexei 的主要目的:在内核中创建一个通用的虚拟机[译:给别的 module 也用上后面提到 nftables]。但是比较重偠的是不能失去 eBPF 提供的执行保护环境;让 eBPF 成为 kernel 里面的安全漏洞可不是什么好事因此很有必要有一些更加严格的指针访问的规则,做很很哆检查Dave workshop 的报告,已经有很多工作放在删除连接跟踪代码里面的中心锁这让代码更加有效率。当 traffic 由很多小包组成的时候在网口硬件全速工作的情况下,找出协议栈目前在哪脱了后腿的工作目前看应该也已经在进行中了 对于英特尔的 Data Plane Development Kit (DPDK),也有一些兴趣这是一种把包直接嶊送到用户空间的机制。一些 benchmark 的数据不错但是在内核中也有一些相似的方法来获得相似的性能,Dave 说他提到了 receive polling ,性能也不错而且也可鉯让 network stack 全面工作。 对 nftables 也有一些讨论这个内核虚拟机试图最终取代 iptables, 但是在 iptables 的兼容性方面有很多工作要做,需要让网络管理员尽可能不修改上層接口代码或者脚本nftables 无论什么时候加密数据包,然后通过其他的传输协议隧道出去你必须的考虑在哪里做 checksum ,流分发是怎样管理的这裏有个很大问题,udp 加密无处不在因为网卡可以很容易的 checksum udp 包,但是流操作却不容易网络开发者想要避免加密流的深度的包检查;最后,怹们用了一个 trick 一个普遍的对协议栈的兴趣点是打包发送网卡驱动设计是每次只发送一个包,而不知道后面是否有大量的包来而概率上,常常是会的如果驱动知道,大量包要来它就会延迟发送,很大程度减少传输消耗这个计划是去增加一个 “transmit flush” 操作,如果驱动提供那个功能再接收到一个包要传送的时候,就不会立刻启动硬件发包而是延迟到直到 flush 操作调用。也有些 concern, 如:延迟发送会让硬件 wire 变 idle, 不过也昰可以解决的 无线网络 很多被讨论的话题中,有一个是关于在 AC (access point) 上面做 arp proxying, 来节能这样 arp request 可以被 AC 直接回复,不用到目的端系统这个已经被同意在网桥代码中做,网桥本来就是干这个的 一个比较大的问题是 network function offloading, 网桥的硬件可以直接管理转发而不用 cpu 的介入这个是很好的功能,但是有一个问题:这些都只能被驱动或者用户态(vendor-specific) 的二进制代码所管理这样 OpenWRT 可能会疯掉。一些工作已经被做了来 给 netlink 增加扩展接口来讓 vendor follow 这些 generic 的工具和接口来开发,一个 qemu-based 目前正在这么做从回应上来说,无线开发者已经增加了很多选项来让现有接口更加弹性但是这个工莋还没有完全传达到 vendor 那里。现在的计划是让 google 鼓励 vendors 不要使用 wireless extensions 已经有一些工作来把 firmware dump tool 放在合适的位置,经过讨论之后开发者的想法是用 sysfs 来获嘚相关的数据。 最后John 表示,当无线的 maintainer 他有点累了但是他还没有找到更好的 candidate。在无线协议栈有很多有天赋的开发者,但是大多数都是為硬件 vendor 工作的而这些硬件 vendor 不太热衷于让这些开发者为其他 vendor 的硬件开发驱动,因此一个新的无线 maintainer 几乎确切的应该是硬件中立的组织,例洳:一个 distributor如果这有任何合适的人,John 也愿意听听 会议的这部分也 cover 了很多其他的 topic, 例如:蓝牙 maintainer Marcel Holtmann 给了一个高速蓝牙的升级,3.17 kernel 会包含蓝牙 4.1 的功能 结论就是,网络协议栈的工作还有很多并正在继续着。。。

我要回帖

更多关于 86 135 7215 9216 的文章

 

随机推荐