不败而后战,《孙子兵法》里的投资之道

来源 | 整理自《华杉讲透孙子兵法》

比起抓住每一次投资机会,投资中更重要的是避免出现永不可逆的失败。这是所有专业投资人的立根之本,也与《孙子兵法》中“先胜而后战”的思想精髓不谋而合。

近日,电视剧《狂飙》的热播,剧中人物对《孙子兵法》的钻研,也让广大观众对《孙子兵法》燃起了兴趣。当你耐心阅读《孙子兵法》,会发觉大道至简。

《孙子兵法》讲的不仅仅关于胜,更是关于不败;不仅仅是对外界的形、势的认识,更是对自己的认知,“不可胜在己,可胜在敌”。这在投资中,也非常有指导作用。投资的本质是认知的变现,而认知世界必先从认知自己开始。认知自己,才能赚到能力圈内的钱,才能不被波动的市场诱惑,才能避免发生永不可逆的损失。长期如此,方可不败。

作为投资者,如何更好地读懂《孙子兵法》?本文分享《华杉讲透孙子兵法》一书中,最后总结《孙子兵法》的9条思想精要,希望大家开卷有益。

 

01
孙子兵法是讲以强胜弱,不是讲以弱胜强

《孙子兵法》第一篇讲“计”,不是奇谋巧计,是计算的计,是现代的SWOT分析(优劣势分析法):优势、劣势、威胁、机会。庙算,就是在决定是否开战之前,在家里衡量计算双方政治、经济、军事实力对比,“五事七计”,从五个方面,七个科目,进行打分。分多的胜,分少的败。打完分,就能知胜,叫“多算胜,少算不胜”。

知胜,算下来能赢,而后可以兴师动众,打。

算下来自己分数没别人高,就不要战。所以孙子是不相信以弱胜强,那是小概率事件。“兵者,国之大事,死生之地,存亡之道,不可不察也”,孙子不会拿国家民族的命运,去赌小概率事件。

02
打得赢,也要算代价
 
 

行动必有代价,战争代价极大。不要光想着战胜,要算账,值不值得。李克说魏文侯“数胜必亡”,胜仗打多了,国家反而要灭亡。因为数战则民疲,数胜则主骄。以骄傲之主,率领疲惫之民,这国家就要亡了。

汉武大帝,就演绎了主骄民疲的一生,何其霸气!汉武帝一生开疆拓土,武功赫赫,结果呢?中国从政府到民间,全部破产,国家差点都给他搞亡国了,晚年迫于巨大政治压力,下轮台罪己诏,批评自己“朕即位以来,所为狂悖,使天下愁苦,不可追悔”。

03
先胜后战,赢了再打

《孙子兵法》主要是自强之法,首先是修炼自己,而不是惦记打败别人。

孙子说:“善战者,先为不可胜,以待敌之可胜。不可胜在己,可胜在敌”,“胜可知,而不可为”。又说“善战者先胜而后战”,要胜中求战,不要战中求胜。

先修炼自己的筋骨,让自己成为不可战胜的,让自己没漏洞,然后等敌人出漏洞。如果敌人不比我们弱小,或者和我们强弱差不多,而且他没失误,没漏洞,就不能打。“可胜在敌”,就在于他什么时候失误。

敌人不失误,我们就没法赢。

所以胜负可以预知,可以判断,但不能强求。胜机一现,抓住机会就打。不能反过来,冲上去就打,在打的过程中找胜机,那就危险了。

04
要能等待,能忍耐

现在人们常说“不作死,就不会死”。《孙子兵法》讲得最多就是这个。战争这东西,收益和代价极不对等。打赢了,杀敌一千,自伤八百,不一定有多大利益。

打输了,则可能国破家亡,命都没了。所以关键是要能等,不能因为焦虑,就频频动作。

哥舒翰守潼关,知道不能打,他能等,但唐明皇焦虑,不能等,逼他出关作战,就全军覆没了。

秦国王翦伐楚,他就能等,又能安抚秦始皇,让秦始皇也不着急,他就把六十万大军开到楚国境内,扎营练兵,天天开运动会,等得楚国人焦虑了,动作了,露出破绽了,他一举就把楚国灭了。

等待在很多情况下都是最好的战略。但人们往往认为等待是不作为,是不可接受的。

要有这个认识:一辈子“不作为”也是可以接受的。因为“作为”的结果可能是死。

比如日本德川家康,他是最能等待,最能忍耐,也最能妥协。织田信长在,他是小兄弟;丰臣秀吉在,他是大诸侯。他有没有志在必得,一定要得天下呢?没有。

他可以等,等不来,他可以妥协,丰臣家族强,他可以一直做诸侯。结果大哥们都没他命长,都先死了,没人能拦住他了,他还在丰臣秀吉死后,又等了十七年,才稳稳当当夺了天下。

他的家族,就统治了日本两百多年。

05
一战而定,胜而不定,则胜利无意义

胜利是手段,不是目的,目的是平定。

如果打了胜仗,但不能平定,都百战百胜了,还要接着打,那打那一百场胜仗干什么?打胜仗也要死人。就算死的是敌人的人,也不如他不要死,收服他,加入我们,才能胜敌而益强。

孙子有很强的保全思想,保全自己,保全人民,保全城池,保全财产,最好也保全敌人,都收服了归我所有。这才叫平定天下。

战国时赵国李牧守边,防御匈奴,他就紧闭关门,只是练兵,数年不出战,赵王不满,换一个将领去,上任一年多,烽火连天,天天打仗,打得边境地区汉人无法耕种,匈奴无法放牧,双方死伤惨重,冤冤相报,永无宁日。

赵王无奈,再派李牧去,他又挂上免战牌,隔绝接触,边境数年无事,匈奴也抢不到东西,渐渐懈怠了。李牧突然大举进兵,一战灭了匈奴十几万人,平定边关,得十几年安宁。

06
以正合,以奇胜,分战法是基本战术原则

“以正合,以奇胜”。这句《孙子兵法》最为人熟悉的话,前面书中详细用多个战例讲了,那“奇”字,念jī,不念qí,是奇数偶数的奇,又称余奇,就是多出来的部分,就是预备队,就是手里捏着还没打出去的牌,留到关键的时候,打出去,制胜。

这叫分战法,是最基本的战术原则,凡作战,一定要分兵,有一百万人,要分兵。项羽到了最后乌江边,只剩二十八骑,也要分兵,首尾相顾,不能挤成一团打。

韩信背水一战,不是真的把所有部队都布阵在水边背水一战,那就真给敌人撵河里喂鱼了。他先分了奇兵出去埋伏着,关键时候杀出来,这才获胜。

人们老相信奇袭得胜,以少胜多,还是侥幸心理,老想使巧劲。孙子告诉你,兵法没有侥幸,弄巧必成拙,必须要按军事规律,按兵法套路来。

07
诡道不重要
 

“兵者,诡道也。”《孙子兵法》里这句话,误了好多人,以为《孙子兵法》就是三十六计,就是诡诈取胜。

诡诈归诡诈,但人家不上套,你再诡诈也没用。诡诈在兵法里,不是主要部分。现在好多出版社把《孙子兵法与三十六计》合成一本书,似乎兵法就是奇谋巧计,这是误区。

08
知己知彼,关键是知己

“知己知彼,百战不殆”。人们念着这句话,就老想去知彼,以为知己不是问题。我自己,我还不知道吗?

其实知己知彼,关键在于知己。因为不可胜在己,自己强大了,自己不失误,别人就无奈你何。千方百计去知彼,可能还正着了别人的诡道。

《孙子兵法》,讲来讲去,都是练基本功,抓基本面,就是管好你自己,自己强了,再等待胜机出现,等最有把握的时候动手。先胜后战,一战而定。

自己不强,那就不要逞强。

09
孙子兵法不是教你打赢,首先是教你认输
 

为什么人们都喜欢听“永不服输”,因为人们不爱听坏消息,不愿意听到对自己不利的真相。“认输才会赢!”额,这句话人们还勉强可以接受,因为结果还是赢嘛。

假如结果也没有赢,还是输呢?

你能不能接受失败呢?

在你真正去学习《孙子兵法》之前,你可能以为那是一部胜战秘笈。它当然也是,胜战秘笈,全在这里,不过如此。

但是,如果你在这兵法中,学会了接受失败,你才真正进入了智慧之门。

-全文完-

转自:https://mp.weixin.qq.com/s/ouHt9IgWBA6X1TZLtmlRpg

如何系统地学习股票投资?

简要提示:

前半部分是渔(1-6),主要讲怎么建立起正确的投资理念。
后半部分是鱼(7-8),主要讲A股各行业都有哪些值得长期投资的好公司。
如何系统地学习股票投资?

1. 长线投资,本质是投资国运。

① 诚实是做投资最优良的品格

我写的文章,除非有系统风险,否则从来不删,无论对错都会放在这里。
菜头不是一个喜欢做马后炮的人,敢于诚实面对自己,是一个通往优秀投资人的必经之路。
这也是菜头特别希望大家做投资能做到的一个点,价值投资的鼻祖格雷厄姆先生在《聪明的投资者》开篇就说到——
要想一生中获得投资成功,并不需要顶级的智商、超凡的商业头脑或内幕消息,而是需要一个稳妥的知识体系作为决策基础,并且有能力控制自己的情绪,使其不会对这种体系造成侵蚀。
在菜头看来,能够控制自己情绪最关键的点,就是必须对自己诚实,敢于承认自身的局限和无知,是建立稳定的知识体系的必要素质。
同时,要想稳定获利,还需要一个稳定向上的社会环境,比如一个人要是生活在伊拉克或者叙利亚,想要靠股市投资长期赚钱,无异于异想天开。
巴菲特滚雪球的关键,不仅有自身的勤奋和智慧,更重要的是,经过1929年大萧条之后,从1954年往后的70多年里,美国大部分时间处于低通胀高增长的国运鼎盛期。
无论是彼得林奇还是巴菲特,亦或是其他投资大佬的成功,都是建立在这个基础上的。
这既是时代的机会,也是时代的局限性,只有搞明白了这个前提,才能读懂后面的内容。

② 中国国运

我们生活在(中国)一个伟大的时代,这个时代有太多高速成长的公司,这些公司就好比一辆辆高速奔跑的列车,任何一个时间点你踏上车,都会带你走得很远。
这就是菜头经常说的,生在一个经济持续保持稳定增长的国家,做投资只要你不去瞎折腾,是想亏钱都难的。
中国的百年复兴,才刚刚开始!
大概率,我们这一代人,是可以不用下车了。多么幸福而美好的时代啊!就让我们共同成长,一起享受这美好(投资)生活吧!
下面,开始正式讲股市,当然,在讲知识之前,首先跟大家推荐几本值得大家长期反复阅读的书籍,这个可能大家比较关心。

③ 投资书籍

有很多人经常留言问菜头,有没有什么值得看的投资(炒股)方面的书籍,说实话,菜头累计看过的关于投资方面的书,不算少,但是值得反复阅读的书,也就那么几本。
我们在市场上看到的大多数投资类图书,甚至包括一部分畅销书,多数时候,仅仅是把这些大佬的经典著作用废话再说一遍而已。
下面就先推荐几本菜头认为比较经典的书吧,就不放链接了,喜欢看书的伙伴可以自行购买,也可以到菜头公号【菜头日记】的首页发送【大礼包】三个字免费领取电子版。
《股票大作手回忆录》,讲述了天才投资人利弗莫尔一生的投资故事,看完之后会发现,我们当前面临的风浪,比起利弗莫尔一生大起大落所经历的事情,啥也不是。更重要的是,就这么一位大神,最后一把却赌输了。心灰意冷之下,这哥们一枪把自己蹦了,敬畏市场,是一辈子的事情。
❷ 格雷厄姆的《聪明的投资者》《证券分析》,价值投资界的圣经,值得反复阅读,再过50年都不会过时。
❸ 芒格的《穷查理宝典》,理论、技术和心理分析都有,尤其是投资行为学方面的研究,鼻祖级别的。
《彼得林奇三部曲》,详细地阐述了低卖高卖的原则(PEG估值法)。
《一本书读懂财务报表》,清华大学美女教授肖星的大作,适合新人阅读
不过呢,在讲技术之前,我再给大家讲个故事,百年股市,千篇一律,很多历史,就是往返重复的。
同时也告诉我们,太阳底下,很少有什么新鲜事发生,很多人每天津津乐道的那点所谓的内幕消息,早在几百年前就有了。
如何系统地学习股票投资?

2. 一个疯狂而悲伤的炒股惨案

① 牛顿大神炒股

我们知道,现代金融的起源,是从英国开始的,因为当时的英国,出了两个比上帝笨不了多少的人,一个叫亚当斯密,而另外一个,叫牛顿。
话说时间回到300多年前,英国出现了疯狂的股市投机浪潮。
这时候,一个无名小辈创建了一家空壳子公司。
这家公司,叫做南海公司,当然,与我们的南海没啥关系,这家公司从成立开始,至始至终就没有人知道是干什么的(实际上这家公司除了收钱外,确实也什么事情都没有做)
奇怪的是,当时的人,却争先恐后地疯抢南海公司的股票。
于是呢,南海公司一时间股价飙升,涨幅惊人,这件事情很快传到了大神牛顿耳边。
聪明的牛顿同学一看股市这么赚钱,摸了摸口袋,也跟着大家买了7000英镑南海公司(1720年的7000英镑=…算了,不跟牛顿比了)。
仅仅2个月,南海公司的股价又翻倍了,牛顿同学作为著名的科学家和金融学大家,还是比较严谨的,所以选择了落袋为安,把手中的股票掉后,一下就赚了7000英镑。
没过多久,聪明的牛顿就后悔了,因为刚刚把股票卖掉,南海公司又翻倍了。
于是,耐不住诱惑的牛顿先生,又杀了进去。
很快,股价又翻了8倍,牛顿身兼蓝星最牛X的科学家和金融学两大家的超级牛人,仅仅用了0.03秒钟的时间,就把帐算明白了,这生意简直太划算了,于是,又加大了投入。

如何系统地学习股票投资?

后来的故事,大家都知道了。
当然是南海公司破产,牛顿大神血本无归。
你可能会问我,你说的是同一个牛顿吗?没错,我说的就是那个被苹果砸脑袋上教我们万有引力的牛顿,就是那个奠定了金本位基础留着方便面发型的牛顿,那个担任英国皇家造币厂厂长的牛顿爵士啊!
从南海公司成立开始,自始至终没有人知道这是一家什么公司,但认购时近千名投资者争先恐后把大门挤倒。
尽管也没有多少人相信他真正获利丰厚,但大家却一致认为,会有更大的笨蛋会出现,股价会一直上涨,自己肯定能赚到钱。
后来,牛顿反思的时候感叹道:“我能计算出天体运行,但人们的疯狂实在难以估计。”
再后来,聪明的人们,把这种行为,称之为博傻理论。

② 博傻理论

博傻理论(greater fool theory),是指在资本市场中(如股票、期货市场):人们之所以完全不管某个东西的真实价值而愿意花高价购买,是因为他们预期会有一个更大的笨蛋会花更高的价格从他们那儿把它买走。博傻理论告诉人们的最重要的一个道理是:在这个世界上,傻不可怕,可怕的是做最后一个傻子。
博傻,是金融投机非常重要的基础要素,是好东西。
因此,对市场的敬畏,是股票投资者的必修课。
如何系统地学习股票投资?

3. 怎么选好公司

怎么从A股4000多只股票里,寻找优秀的好公司!

截止当前(2021.12月20日),沪深两市一共有4644只股票在交易。那么,怎么才能在这4000多只股票里,选出心仪的股票 ?
首先声明,本文不荐股,也不对结果承担任何责任,仅仅是希望这个选股的过程和思路,对您有所启发。
因此,结果不是菜头关心的,思路才是。
况且,历史的数据,不代表未来。
下面,正式开始答题:
我们先来看下,有哪些因素决定一个公司的价值 ?
❶ 企业的好坏最终就一个指标,能不能为股东赚到钱?持续地赚到钱?(营收和利润持续增长)
❷ 第二个指标就是赚到这些钱需要投入多少钱?(投入资本回报率,ROIC)
❸ 企业的存量资产能够获得多少回报,股东权益资产能够获得多少回报?(资产收益率和净资产收益率,ROE)
❹ 企业的钱是怎么来的,是股东投的?利润积累的还是借的?(负债率)
然后根据上面的方法,菜头一共选出来293家符合要求的公司。
PS: 全部完整293家公司,关注 CT600519『菜头日记』,发送“293”三个数字(并且会定期更新MSCI中国股票池名单,欢迎关注)。
你看,经过菜头这么一筛选,是不是大部分好公司都筛选出来了,当然,还是那句话,指标是静态的,公司是动态的,历史不代表未来。
上面是菜头经常用到的选股方式之一。当然,每个人的交易系统不同,我们可以通过设置一定的条件,先筛选出符合条件的公司,然后在进行精选,就会减少很多工作量。
关注财务数据的最大意义在于,上市公司一两个指标可以调节或者作假,但是同时满足多个指标,作假调节的难度就会成倍增加。养成看财报的习惯也许不能让你发财,但是大概率可以排雷,万变不离其中,公司的业绩,才是决定公司长期价值的唯一要素。
当然,财务指标不是万能的,哪怕是这么多指标,选出来的公司,也有可能暴雷,下一步,就是在这些公司里面,找出的自己能力圈内,可以理解的公司。
投资有一个非常重要的原则就是,不懂的公司不投,这也是巴菲特大神长期强调的。
如何系统地学习股票投资?

4. 新手需要关注的问题

① 流行的MACD选股法

然后,再回答新手比较关心的技术交易环节:
前些年,大家比较热衷于江恩,下面的部分,你可能根据你自己关心的内容,跳着看。
当然,这些年,菜头个人很少关注技术指标了,随着年龄的增加,你会发现,企业的基本面,远比研究技术要靠谱很多。
不过一些诸如MACD之类异步移动平均线,对于短期情绪的引导和趋势的观察,是非常有用的,大多数时候,得结合基本面一起观察,准确率更高。
MACD,全称是:Moving Average Convergence and Divergence;即平滑异动平均线。最早于20世纪70年代末杰拉尔德·阿佩尔创造的股票价格技术分析中使用的一个交易指标,显示趋势的强度、方向、势头和持续时间的变化。关于MACD的计算方式和各种指标的含义,菜头就不写了,网上到处都有,我今天要讲的是,技术背后的形成逻辑。什么是技术背后的形成逻辑呢,这就涉及到技术指标的反身性。
反身性理论最早由社会学家William Thomas提出,后由同为社会学家的Robert Merton完善。最后,索罗斯在《金融炼金术》一书中,完整地表述了交易对象之间的相互影响,从而说明股市的不可预测性。通俗意思就是,你在做决定的同时,这个决定本身,也会影响其他人的行为,而其他人的行为,又会反过来影响你的决定。
理解了这些,对于理解技术指标对交易行为的影响,就更加容易一些。
简单来说,就是一个指标,尤其是一些大家都高度认可的指标,一旦形成,就会反过来影响人的行为,达成一致预期。一致预期的形成,又会加速验证技术指标的形态,直到形态(趋势)反转,形成反向指标。比如我们经常讲到的金叉理论,就是在MACD底部区域,形成KDJ交叉的态势,如下图:

如何系统地学习股票投资?

上面是比亚迪MACD在负轴形成二次金叉的K线形态,所以股价在日K先年线附近,形成反转态势。
从这个角度看,技术指标,好像非常有用,确实如此,并且你还可以看出,在年线附近金叉之后,成交量立马放大,股价强势反转。
很难说,是技术影响了行为,还是行为反过来形成了技术的态势。
相互影响吧 。
上面说的,有一个非常重要的前提,就是整个大的趋势,要配合才行。
比如比亚迪(股票)的反转,和整个新能源板块的走势,以及科技股板块的走势,是一致的。否则的话,同样的案例,就有可能形成相反的走势,比如下图:

如何系统地学习股票投资?

同样是比亚迪,在2018年上半年的走势图,MACD多次金叉,但是由于整个行情不好,所在的新能源汽车板块也是一路下行,所以每一次反弹,都不及上一次的高点。
我们把这种情况,称为破位。
那么由于股市的不可预测性,你不知道整体行情是底还是顶,这是事后才能知道的。这就意味着,在整个熊市阶段,大多数技术指标,都是失效的。
变得不可交易。

② 安全边际

再就是必须要学会坚守安全边际,下面这段话,是我跟圈内以为私募的基金经理的聊天纪录,大家会从中得到很多启发:
如何系统地学习股票投资?如何系统地学习股票投资?
这就是市场非常残酷的地方,当然,对于聪明的投资者来讲,也是机会。

③ 滚雪球

菜头又不是专门为了写文章吓唬人的,对吧。
解决之道是什么呢?其实很简单:

如何系统地学习股票投资?

没错,需要有源源不断的雪花,才能把雪球滚起来,否则雪球就会融化。
雪花——民间俗称水龙头。
说人话就是,炒股,你要有源源不断的外围收入,才有可能把雪球滚起来,最终通往财富自由之路。
把上面的事情做好了,你才有机会,长期战胜市场。否则,失败,就是必然。
如何系统地学习股票投资?

5. 怎么选择证券公司

这部分内容涉及到合规的问题,文章末尾有提示。
如何系统地学习股票投资?

6. 值得长期持有的公司。

》》》贵州茅台和长江电力;不想关注贵州茅台和长江电力的童鞋,可以直接跳到第7部分。
投资茅台和长江电力的总结:
茅台和长江电力,都属于可以买了一直拿着的公司,茅台的的利润增速包含提价和产能扩张两个部分。并且茅台的窖池(资产)实际价值会随着时间的推移而稳定增值,最大的风险在于品牌护城河坍塌,以及类似于塑化剂这样的不可抗力的行业系统性风险。
长江电力的利润受到发电量和上网电价两个方面因素的影响,利润增速来源于新建电站和折旧到期所释放出来的利润。行业风险相对于茅台更小,但是天花板更明显。
本文不涉及到股价和估值的部分,仅仅是详细阐述这两家公司的底层投资逻辑,投资有风险,但是这两家公司的长期投资风险,已经无限趋近于零了。
如何系统地学习股票投资?

7. 宏观选股

下面,接着讲新手怎么寻找好公司,干货很多,同样值得你反复阅读。
首先菜头想说的是,要判断短期的涨跌,以及个股的走势,是一件非常不容易做到的事。
因为所有书籍都告诉我们,股市短期是投票机,主要由情绪和资金来驱动。
只有拉长了看,才能给企业称重——价格会围绕价值上下波动,但是有时候也会偏离很远。
如果我们把时间拉长到10年或者更长,确定性就出来了。
第一个确定性,也是最重要的确定性,当然就是下面这份文件(不接受反驳)[1]

如何系统地学习股票投资?

我们在这份文件的指导下,来为大家寻找,有哪些确定性的投资机会。
在文件提到的10多个重点产业中,菜头重点为大家在永续经营产业里面,去寻找一些好的公司。
首先,当然是优选消费和医药产业。
吃喝玩乐和生老病死,是每个人都绕不过去的主题。

① 镇楼资料(请悄悄保存)

如何系统地学习股票投资?

好吧,就上面这张图片,都值得你双击屏幕点个赞吧。
当然,放在图片里面的公司,大多数都涨得较高了,下面再来为大家,寻找一些被市场忽略的公司。

② 吃喝行业的投资机会

首先从吃喝中的白酒说起:
关于白酒的,菜头之前写过详细分析,白酒当前已经上升到信仰的层面了,如果不考虑价格的话,菜头当然是主推茅五泸汾四大金刚了。
其中,茅台具有一定的金融属性,当之无愧的老大,但是当前价位买茅台,需要信仰加持,这个菜头给不出建议,见仁见智。
五粮液的酒,卖出去,大多数都被喝掉了,要说高端品牌的潜力,能够让大家把一千多块钱一斤的兑水乙醇全部喝掉,还真需要本事。
所以如果仅仅从消费本身,不考虑金融属性来讲,五粮液的潜力是无限的。
老窖和汾酒是前两届名酒评选的老四大,江湖地位摆在那里,再加上这两年混改比较成功,新品快速全国化推广,释放了业绩,也是不错的。
当然,最大的问题还是,这两年白酒股价涨得太高,股价都不便宜。
其次就是二线白酒的机会,这个也是刚需,毕竟老百姓不能天天喝茅台。
二线白酒有明显的地域特征,它有两个成长逻辑,一是跟随一线白酒涨价,二是跨区域的拓展
在二线白酒里,洋河股份前些年发展不错:江苏省内白酒龙头,当前正在加速布局全国,但是最大的问题是,名气没有老四大高,在白酒高端化洗牌的过程中,比较吃亏,提价能力略次于老四大。
湖南的酒鬼酒:是八大香型中馥郁香型白酒第一品牌,子品牌内参不断跻身高端品牌。
三线白酒:顺鑫农业:牛栏山二锅头通过大规模铺设渠道,已经成功超越红星二锅头,成为国民二锅头头牌。
老白干酒是状元中学(衡水)边上的品牌:独有的老白干香型二锅头,在河北地区销量不错,也在向全国发展。

下面再说喝的和厨房用的:
前面那几家,都涨很高了。
相对来说,伊利的估值,是上面几家里面,相对合理的。
乳制品是人体重要的蛋白质来源,我国目前人均乳制品消费量只有亚洲平均水平的2/3,跟欧美相去甚远,所以提升的空间还很大。
乳制品具体可分为常温奶,低温奶,奶粉和奶酪。
常温奶不容易坏,拼的是上游奶牛场资源和运输渠道。伊利和蒙牛是绝对的霸主。
低温奶添加的防腐剂少,更加新鲜,毛利率也更高,但有运输半径的限制,呈现出地域性。比如,光明乳业就牢牢占据了长三角地区。
奶粉方面,中国飞鹤是奶粉龙头,主要面向二三线城市,抓住宝妈们买贵就是买好的心理,卖出了比国外奶粉更高的毛利。
贝因美本来质量是非常不错的,但是因为公司管理问题,最近几年没落了。
奶酪是个增长很快的细分市场,奶酪渗透率正快速上升,妙可蓝多抓住机遇,成为这个赛道的龙头。
下面再说说,休闲食品
随着消费升级,休闲食品的消费也越来越高,行业每年保持15%以上的增长。
桃李面包:短保质期面包龙头
安琪酵母:酵母是烘焙的必需添加剂,市场需求极大,而且行业对安全要求极高,构成了很高的壁垒,安琪酵母是行业寡头。
洽洽食品、盐津铺子:主打瓜子的传统零食零售店。
三只松鼠、良品铺子:零食界新秀,走互联网销售路线。良品铺子定位高端,三只松鼠更加亲民
农夫山泉:凭借一句“大自然的搬运工”,农夫山泉成为了“水茅”,创始人也一度成为中国首富,下来了,看样子过几天可能又上去了。
休闲食品还有很多线上线下融合的机会,以及传统渠道也可能出圈,就比如前年出圈的辣条,把垂直单品做成了上百亿估值的生意。
这样的机会,未来还会有很多,需要火眼金睛去寻找。
调味品:
“油、盐、酱、醋”是老百姓最基本的刚性需求。
从邻国日本消费升级的20年经验来看,调味品规模上涨了8倍,几乎是增速最快的领域
我国调味品市场规模同样增长迅速,而行业集中度又远低于日本,这也意味着行业龙头还有很大的成长空间。
海天味业、中炬高新、千禾味业:酱油龙头,酱油是调味品里最大的赛道,海天味业的市值曾超过万科+保利的总和。
恒顺醋业:醋业龙头,醋是调味品里仅次于酱油的第二大赛道。
金龙鱼:米面油龙头,米面油属于国计民生的产业,国家严格控价,毛利率比酱油低很多。
涪陵榨菜:榨菜龙头,也被当成经济的反向指标

③ 玩乐行业的投资机会

下面说玩的。
在娱乐至死的年代,玩当然是很重要的事情。
如何系统地学习股票投资?
不过大多数头部企业,都在境外上市。
腾讯是我最看好的公司之一,之前我写文章也说,如果实在不知道买什么,就买腾讯吧,现在这个观点依然没变。
在我看来,腾讯的开放赋能,不寻求控股的投资策略,和阿里追求控股垄断,是一条不同的方向,在未来开放是大趋势的环境下,我更看好前者。
当然,资本市场,也已经给出了答案。

③ 与“生”相关的投资机会

然后,再说“生”的问题,医药当然是重点。

如何系统地学习股票投资?

除了上面图片里面的从生到“生”的机会外,创新药的发展,也是值得重点关注的。
尤其是2015年集采政策推出之后,这个影响是持续的。
创新药
创新药领域经常出现爆款单品的现象,研发一个成功的大单品,加上专利的保护,足以养活一家几百上千亿市值的公司。
当然,也有用力过猛的,比如著名的吉利德公司,发明的丙肝神药彻底治愈了丙肝,结果病人没了,自己的生意也黄了。
看创新药企业,除了看它的成熟药品,还要重点关注正在研发中的药品和进度,也就是业内俗称的管线,因为这些才是业绩增长的根本来源。
恒瑞医药:创新药龙头,肿瘤病和心血管病是创新药最大的市场,恒瑞是最大的抗肿瘤药生产商,主要针对胃癌、乳腺癌。
贝达药业:深耕肺癌领域,在研药品数量非常多。
君实生物:深耕鼻咽癌和肺癌领域,仍处于商业化早期。
中国生物制药、瀚森制药、信达生物、百济神州:抗肿瘤细分龙头,但都在港股上市。
华海药业、天宇股份:心血管疾病原料药生产龙头。
人福医药:麻醉剂绝对龙头。几年前有所膨胀,收购安全套厂家杰士邦,结果股价一落千丈。之后重新聚焦主业,股价迅速反弹。
杜蕾斯:还是要摆正位置。
康弘药业:眼科血管疾病细分赛道龙头
甘李药业:治疗糖尿病类胰岛素的生产龙头
华东医药:业务横跨创新药、医药流通和医美,但创新药能力一般。
复星医药:业务广,什么都做一些,国际化程度不错。
新和成:这个严格来说并不是创新药,但它是维生素生产的龙头。
另外,医药产业链分工也越来越成熟,外包服务也在逐渐形成规模。
随着专业度的提升,外包也越来越精细化,具体可分为研发外包(CRO)、生产外包(CMO)、定制研发生产外包(CDMO),这些都统称CXO。
药明康德:综合性的医药研发外包龙头,覆盖CRO和CDMO领域。
康龙化成:CRO行业龙头
泰格医药、昭衍新药:临床前CRO行业龙头
药石科技:药物分子砌块领域CRO龙头
凯莱英:小分子制药CDMO行业龙头
药明生物:大分子药物CDMO龙头
普洛药业:专注CDMO领域
博腾股份:CMO行业龙头
中药:重点推云南白药和片仔癀,但是股价都不低。
疫苗类:重点看二类苗。
智飞生物:靠独家代理HPV疫苗,成为疫苗一哥。
康泰生物:肺炎和狂犬疫苗生产龙头
沃森生物:主打肺炎疫苗和HPV疫苗。
华兰生物:血液制品生产商,切入流感疫苗领域。
医疗器械:
迈瑞医疗:全国最大的医疗器械公司,主要从事呼吸机、监护仪等生产,受益于COVID疫情。
健帆生物:血液灌流器一家独大,由于尿毒症无法根治,患者对仪器有长时间的依赖。
乐普医疗、先健科技:研发心血管可降解支架。
大博医疗、凯利泰:骨科耗材龙头。
专科医院:

爱尔眼科:眼科连锁龙头。

欧普康视:OK镜,角膜塑形龙头,市场渗透率还不高。
通策医疗:口腔连锁龙头。同时做试管婴儿业务。
锦欣生殖:辅助生殖连锁龙头。
华熙生物、昊海生科、爱美客:医美三剑客,传统医药企业华东最近也在动作频繁。
体外诊断:
受疫情影响,体外诊断行业正迅速发展。
安图生物、迈克生物:领先的体外检测设备供应商
金域医学、迪安诊断:独立医学实验室龙头
艾德生物:聚焦肿瘤检测
万孚生物:涵盖妊娠检测、传染病检测、毒品检测等多领域。

④ 极乐投资

最后,来个沉重的话题,没有办法,也得说。

如何系统地学习股票投资?

由于这个话题太沉重了,就不展开了,大家看看就好。
重点推荐:中国平安,生死都相关,大概率被市场错杀,2022年代理人制度改革完成之后,应该会重新回到增长通道。
转自:https://mp.weixin.qq.com/s/LCZDQP1hqcgFEW22N58tDQ

监控 Python 内存使用情况和代码执行时间

我的代码的哪些部分运行时间最长、内存最多?我怎样才能找到需要改进的地方?”

在开发过程中,我很确定我们大多数人都会想知道这一点,在本文中总结了一些方法来监控 Python 代码的时间和内存使用情况。

本文将介绍4种方法,前3种方法提供时间信息,第4个方法可以获得内存使用情况。

  • time 模块
  • %%time 魔法命令
  • line_profiler
  • memory_profiler

 1. time 模块

这是计算代码运行所需时间的最简单、最直接(但需要手动开发)的方法。他的逻辑也很简单:记录代码运行之前和之后的时间,计算时间之间的差异。这可以实现如下:

 import time

 start_time = time.time()
 result = 5+2
 end_time = time.time()

 print('Time taken = {} sec'.format(end_time - start_time))

下面的例子显示了for循环和列表推导式在时间上的差异:

 import time

 # for loop vs. list comp
 list_comp_start_time = time.time()
 result = [i for i in range(0,1000000)]
 list_comp_end_time = time.time()
 print('Time taken for list comp = {} sec'.format(list_comp_end_time - list_comp_start_time))

 result=[]
 for_loop_start_time = time.time()
 for i in range(0,1000000):
     result.append(i)
 for_loop_end_time = time.time()
 print('Time taken for for-loop = {} sec'.format(for_loop_end_time - for_loop_start_time))

 list_comp_time = list_comp_end_time - list_comp_start_time
 for_loop_time = for_loop_end_time - for_loop_start_time
 print('Difference = {} %'.format((for_loop_time - list_comp_time)/list_comp_time * 100))

我们都知道for会慢一些

 Time taken for list comp = 0.05843973159790039 sec
 Time taken for for-loop = 0.06774497032165527 sec
 Difference = 15.922795107582594 %

 2. %%time 魔法命令

魔法命令是IPython内核中内置的方便命令,可以方便地执行特定的任务。一般情况下都实在jupyter notebook种使用。

在单元格的开头添加%%time ,单元格执行完成后,会输出单元格执行所花费的时间。

 %%time
 def convert_cms(cm, unit='m'):
     '''
    Function to convert cm to m or feet
    '''
     if unit == 'm':
         return cm/100
     return cm/30.48

 convert_cms(1000)

结果如下:

 CPU timesuser 24 µssys: 1 µstotal: 25 µs
 Wall time: 28.1 µs

 Out[8]: 10.0

这里的CPU times是CPU处理代码所花费的实际时间,Wall time是事件经过的真实时间,在方法入口和方法出口之间的时间。

 3. line_profiler

前两个方法只提供执行该方法所需的总时间。通过时间分析器我们可以获得函数中每一个代码的运行时间。

这里我们需要使用line_profiler包。使用pip install line_profiler。

 import line_profiler

 def convert_cms(cm, unit='m'):
     '''
    Function to convert cm to m or feet
    '''
     if unit == 'm':
         return cm/100
     return cm/30.48

 # Load the profiler
 %load_ext line_profiler

 # Use the profiler's magic to call the method
 %lprun -f convert_cms convert_cms(1000'f')

输出结果如下:

 Timer unit: 1e-06 s

 Total time: 4e-06 s
 File: /var/folders/y_/ff7_m0c146ddrr_mctd4vpkh0000gn/T/ipykernel_22452/382784489.py
 Function: convert_cms at line 1

 Line #     Hits         Time Per Hit   % Time Line Contents
 ==============================================================
      1                                           def convert_cms(cm, unit='m'):
      2                                               '''
      3                                               Function to convert cm to m or feet
      4                                               '''
      5         1         2.0     2.0     50.0     if unit == 'm':
      6                                                   return cm/100
      7         1         2.0     2.0     50.0     return cm/30.48

可以看到line_profiler提供了每行代码所花费时间的详细信息。

  • Line Contents :运行的代码
  • Hits:行被执行的次数
  • Time:所花费的总时间(即命中次数x每次命中次数)
  • Per Hit:一次执行花费的时间,也就是说 Time =  Hits X Per Hit
  • % Time:占总时间的比例

可以看到,每一行代码都详细的分析了时间,这对于我们分析时间相当的有帮助。

 4. memory_profiler

与line_profiler类似,memory_profiler提供代码的逐行内存使用情况。

要安装它需要使用pip install memory_profiler。我们这里监视convert_cms_f函数的内存使用情况

 from conversions import convert_cms_f
 import memory_profiler

 %load_ext memory_profiler

 %mprun -f convert_cms_f convert_cms_f(1000'f')

convert_cms_f函数在单独的文件中定义,然后导入。结果如下:

 Line #   Mem usage   Increment Occurrences   Line Contents
 =============================================================
      1     63.7 MiB     63.7 MiB           1   def convert_cms_f(cm, unit='m'):
      2                                             '''
      3                                             Function to convert cm to m or feet
      4                                             '''
      5     63.7 MiB     0.0 MiB           1       if unit == 'm':
      6                                                 return cm/100
      7     63.7 MiB     0.0 MiB           1       return cm/30.48memory_profiler 提供对每行代码内存使用情况的详细了解。

这里的1 MiB (MebiByte) 几乎等于 1MB。1 MiB  = 1.048576 1MB

但是memory_profiler 也有一些缺点:它通过查询操作系统内存,所以结果可能与 python 解释器略有不同,如果在会话中多次运行 %mprun,可能会注意到增量列报告所有代码行为 0.0 MiB。这是因为魔法命令的限制导致的。

虽然memory_profiler有一些问题,但是它就使我们能够清楚地了解内存使用情况,对于开发来说是一个非常好用的工具

 5. 总结一下

虽然Python并不是一个以执行效率见长的语言,但是在某些特殊情况下这些命令对我们还是非常有帮助的。

转自:https://mp.weixin.qq.com/s/oKm5oDVsXxX8UZd7FUQaFg

一台服务器最大能支持多少条 TCP 连接

推荐关注↓

作者:文攀

https://juejin.cn/post/7162824884597293086

一、一台服务器最大能打开的文件数

1、限制参数

我们知道在Linux中一切皆文件,那么一台服务器最大能打开多少个文件呢?Linux上能打开的最大文件数量受三个参数影响,分别是:

  • fs.file-max (系统级别参数):该参数描述了整个系统可以打开的最大文件数量。但是root用户不会受该参数限制(比如:现在整个系统打开的文件描述符数量已达到fs.file-max ,此时root用户仍然可以使用ps、kill等命令或打开其他文件描述符)
  • soft nofile(进程级别参数):限制单个进程上可以打开的最大文件数。只能在Linux上配置一次,不能针对不同用户配置不同的值
  • fs.nr_open(进程级别参数):限制单个进程上可以打开的最大文件数。可以针对不同用户配置不同的值

这三个参数之间还有耦合关系,所以配置值的时候还需要注意以下三点:

  1. 如果想加大soft nofile,那么hard nofile参数值也需要一起调整。如果因为hard nofile参数值设置的低,那么soft nofile参数的值设置的再高也没有用,实际生效的值会按照二者最低的来。

  2. 如果增大了hard nofile,那么fs.nr_open也都需要跟着一起调整(fs.nr_open参数值一定要大于hard nofile参数值)。如果不小心把hard nofile的值设置的比fs.nr_open还大,那么后果比较严重。会导致该用户无法登录,如果设置的是*,那么所有用户都无法登录

  3. 如果加大了fs.nr_open,但是是用的echo “xxx” > ../fs/nr_open命令来修改的fs.nr_open的值,那么刚改完可能不会有问题,但是只要机器一重启,那么之前通过echo命令设置的fs.nr_open值便会失效,用户还是无法登录。所以非常不建议使用echo的方式修改内核参数!!!

2、调整服务器能打开的最大文件数示例

假设想让进程可以打开100万个文件描述符,这里用修改conf文件的方式给出一个建议。如果日后工作里有类似的需求可以作为参考。

  • vim /etc/sysctl.conf
fs.file-max=1100000 // 系统级别设置成110万,多留点buffer
fs.nr_open=1100000 // 进程级别也设置成110万,因为要保证比 hard nofile大
  • 使上面的配置生效sysctl -p

  • vim /etc/security/limits.conf

// 用户进程级别都设置成100完
soft nofile 1000000
hard nofile 1000000

二、一台服务器最大能支持多少连接

我们知道TCP连接,从根本上看其实就是client和server端在内存中维护的一组【socket内核对象】(这里也对应着TCP四元组:源IP、源端口、目标IP、目标端口),他们只要能够找到对方,那么就算是一条连接。那么一台服务器最大能建立多少条连接呢?

  • 由于TCP连接本质上可以理解为是client-server端的一对socket内核对象,那么从理论上将应该是【2^32 (ip数) * 2^16 (端口数)】条连接(约等于两百多万亿)
  • 但是实际上由于受其他软硬件的影响,我们一台服务器不可能能建立这么多连接(主要是受CPU和内存限制)。

如果只以ESTABLISH状态的连接来算(这些连接只是建立,但是不收发数据也不处理相关的业务逻辑)那么一台服务器最大能建立多少连接呢?以一台4GB内存的服务器为例!

  • 这种情况下,那么能建立的连接数量主要取决于【内存的大小】(因为如果是)ESTABLISH状态的空闲连接,不会消耗CPU(虽然有TCP保活包传输,但这个影响非常小,可以忽略不计)
  • 我们知道一条ESTABLISH状态的连接大约消耗【3.3KB内存】,那么通过计算得知一台4GB内存的服务器,【可以建立100w+的TCP连接】(当然这里只是计算所有的连接都只建立连接但不发送和处理数据的情况,如果真实场景中有数据往来和处理(数据接收和发送都需要申请内存,数据处理便需要CPU),那便会消耗更高的内存以及占用更多的CPU,并发不可能达到100w+)

上面讨论的都是进建立连接的理想情况,在现实中如果有频繁的数据收发和处理(比如:压缩、加密等),那么一台服务器能支撑1000连接都算好的了,所以一台服务器能支撑多少连接还要结合具体的场景去分析,不能光靠理论值去算。抛开业务逻辑单纯的谈并发没有太大的实际意义。

服务器的开销大头往往并不是连接本身,而是每条连接上的数据收发,以及请求业务逻辑处理!!!

三、一台客户端机器最多能发起多少条连接

我们知道客户端每和服务端建立一个连接便会消耗掉client端一个端口。一台机器的端口范围是【0 ~ 65535】,那么是不是说一台client机器最多和一台服务端机器建立65535个连接呢(这65535个端口里还有很多保留端口,可用端口可能只有64000个左右)?

由TCP连接的四元组特性可知,只要四元组里某一个元素不同,那么就认为这是不同的TCP连接。所以需要分情况讨论:

  • 【情况一】、如果一台client仅有一个IP,server端也仅有一个IP并且仅启动一个程序,监听一个端口的情况下,client端和这台server端最大可建立的连接条数就是 65535 个。

因为源IP固定,目标IP和端口固定,四元组中唯一可变化的就是【源端口】,【源端口】的可用范围又是【0 ~ 65535】,所以一台client机器最大能建立65535个连接

  • 【情况二】、如果一台client有多个IP(假设客户端有 n 个IP),server端仅有一个IP并且仅启动一个程序,监听一个端口的情况下,一台client机器最大能建立的连接条数是:n * 65535 个

因为目标IP和端口固定,有 n 个源IP,四元组中可变化的就是【源端口】+ 【源IP】,【源端口】的可用范围又是【0 ~ 65535】,所以一个IP最大能建立65535个连接,那么n个IP最大就能建立 n * 65535个连接了

以现在的技术,给一个client分配多个IP是非常容易的事情,只需要去联系你们网管就可以做到。

  • 【情况三】、如果一台client仅有一个IP,server端也仅有一个IP但是server端启动多个程序,每个程序监听一个端口的情况下(比如server端启动了m个程序,监听了m个不同端口),一台client机器最大能建立的连接数量为:65535 * m

源IP固定,目标IP固定,目标端口数量为m个,可变化的是源端口,而源端口变化范围是【0 ~ 65535】,所以一台client机器最大能建立的TCP连接数量是 65535 * m个

  • 其余情况类推,但是客户端的可用端口范围一般达不到65535个,受内核参数net.ipv4.ip_local_port_range限制,如果要修改client所能使用的端口范围,可以修改这个内核参数的值。

  • 所以,不光是一台server端可以接收100w+个TCP连接,一台client照样能发出100w+个连接

四、其他

  • 三次握手里socket的全连接队列长度由参数net.core.somaxconn来控制,默认大小是128,当两台机器离的非常近,但是建立连接的并发又非常高时,可能会导致半连接队列或全连接队列溢出,进而导致server端丢弃握手包。然后造成client超时重传握手包(至少1s以后才会重传),导致三次握手连接建立耗时过长。我们可以调整参数net.core.somaxconn来增加去按连接队列的长度,进而减小丢包的影响

  • 有时候我们通过 ctrl + c方式来终止了某个进程,但是当重启该进程的时候发现报错端口被占用,这种问题是因为【操作系统还没有来得及回收该端口,等一会儿重启应用就好了】

  • client程序在和server端建立连接时,如果client没有调用bind方法传入指定的端口,那么client在和server端建立连接的时候便会自己随机选择一个端口来建立连接。一旦我们client程序调用了bind方法传入了指定的端口,那么client将会使用我们bind里指定的端口来和server建立连接。所以不建议client调用bind方法,bind函数会改变内核选择端口的策略

public static void main(String[] args) throws IOException {
    SocketChannel sc = SocketChannel.open();
   // 客户端还可以调用bind方法
    sc.bind(new InetSocketAddress("localhost", 9999));
    sc.connect(new InetSocketAddress("localhost", 8080));
    System.out.println("waiting..........");
}
  • 在Linux一切皆文件,当然也包括之前TCP连接中说的socket。进程打开一个socket的时候需要创建好几个内核对象,换一句直白的话说就是打开文件对象吃内存,所以Linux系统基于安全角度考虑(比如:有用户进程恶意的打开无数的文件描述符,那不得把系统搞奔溃了),在多个位置都限制了可打开的文件描述符的数量。

  • 内核是通过【hash表】的方式来管理所有已经建立好连接的socket,以便于有请求到达时快速的通过【TCP四元组】查找到内核中对应的socket对象

在epoll模型中,通过红黑树来管理epoll对象所管理的所有socket,用红黑树结构来平衡快速删除、插入、查找socket的效率

五、相关实际问题

在网络开发中,很多人对一个基础问题始终没有彻底搞明白,那就是一台机器最多能支撑多少条TCP连接。不过由于客户端和服务端对端口使用方式不同,这个问题拆开来理解要容易一些。

注意,这里说的是客户端和服务端都只是角色,并不是指某一台具体的机器。例如对于我们自己开发的应用程序来说,当他响应客户端请求的时候,他就是服务端。当他向MySQL请求数据的时候,他又变成了客户端。

1、”too many open files” 报错是怎么回事,该如何解决

你在线上可能遇到过too many open files这个错误,那么你理解这个报错发生的原理吗?如果让你修复这个错误,应该如何处理呢?

  • 因为每打开一个文件(包括socket),都需要消耗一定的内存资源。为了避免个别进程不受控制的打开了过多文件而让整个服务器奔溃,Linux对打开的文件描述符数量有限制。如果你的进程触发到内核的限制,那么”too many open files” 报错就产生了
  • 可以通过修改fs.file-max 、soft nofile、fs.nr_open这三个参数的值来修改进程能打开的最大文件描述符数量

需要注意这三个参数之间的耦合关系!

2、一台服务端机器最大究竟能支持多少条连接

因为这里要考虑的是最大数,因此先不考虑连接上的数据收发和处理,仅考虑ESTABLISH状态的空连接。那么一台服务端机器上最大可以支持多少条TCP连接?这个连接数会受哪些因素的影响?

  • 在不考虑连接上数据的收发和处理的情况下,仅考虑ESTABLISH状态下的空连接情况下,一台服务器上最大可支持的TCP连接数量基本上可以说是由内存大小来决定的。
  • 四元组唯一确定一条连接,但服务端可以接收来自任意客户端的请求,所以根据这个理论计算出来的数字太大,没有实际意义。另外文件描述符限制其实也是内核为了防止某些应用程序不受限制的打开【文件句柄】而添加的限制。这个限制只要修改几个内核参数就可以加大。
  • 一个socket大约消耗3kb左右的内存,这样真正制约服务端机器最大并发数的就是内存,拿一台4GB内存的服务器来说,可以支持的TCP连接数量大约是100w+

3、一条客户端机器最大究竟能支持多少条连接

和服务端不同的是,客户端每次建立一条连接都需要消耗一个端口。在TCP协议中,端口是一个2字节的整数,因此范围只能是0~65535。那么客户单最大只能支持65535条连接吗?有没有办法突破这个限制,有的话有哪些办法?

  • 客户度每次建立一条连接都需要消耗一个端口。从数字上来看,似乎最多只能建立65535条连接。但实际上我们有两种办法破除65535这个限制

方式一,为客户端配置多IP 方式二,分别连接不同的服务端

  • 所以一台client发起百万条连接是没有任何问题的

4、做一个长连接推送产品,支持1亿用户需要多少台机器

假设你是系统架构师,现在老板给你一个需求,让你做一个类似友盟upush这样的产品。要在服务端机器上保持一个和客户端的长连接,绝大部分情况下连接都是空闲的,每天也就顶多推送两三次左右。总用户规模预计是1亿。那么现在请你来评估一下需要多少台服务器可以支撑这1亿条长连接。

  • 对于长连接推送模块这种服务来说,给客户端发送数据只是偶尔的,一般一天也就顶多一两次。绝大部分情况下TCP连接都是空闲的,CPU开销可以忽略
  • 再基于内存来考虑,假设服务器内存是128G的,那么一台服务器可以考虑支持500w条并发。这样会消耗掉大约不到20GB内存用来保存这500w条连接对应的socket。还剩下100GB以上的内存来应对接收、发送缓冲区等其他的开销足够了。所以,一亿用户,仅仅需要20台服务器就差不多够用了!

– EOF