描写饭后唯美的句子

时间:2022-04-09 14:49 | 分类: 句子大全 | 作者:java互联网架构 | 评论: 次 | 点击:

描写饭后唯美的句子

1. 描写食物的优美句子.诗

好句:

柑橘是海盐的特产,橘子皮里面住着一个个金灿灿的小月亮,亲亲热热地住在一所房子里。

盐水鸭皮白柔嫩、肥而不腻、香鲜味美,具有香、酥、嫩的特点。

灌汤小笼包的皮是薄薄的,甚至都透亮了,张嘴咬一口,里面鲜美的汁水流入口中,咬那浸了汁水的肉团,不肥不腻,入口爽滑……那真叫美!

那水灵灵、红艳艳的枣像天上密密麻麻、闪闪烁烁的繁星,一个个都眨着调皮的眼睛。

那些冰糖葫芦红彤彤的,在阳光的照耀下闪闪发光,不知引来多少小孩儿渴求的目光。

小混沌,个小,皮薄,只要往开水中一捞,就能盛入碗中,吃上一口,好鲜美!

我拿来水瓶,朝茶杯里倒上开水,顿时,水中的龙井茶如同千万条小鱼上下翻飞,煞是好看。

烤红薯焦糊糊的,周身满是草灰,嗅一嗅,香喷的气味马上会进入你的五脏六腑,令你口水直流三千尺。

臭豆腐干是热情好客的,她总是把浓郁的烈性的香味弥漫在周围的空气中,让人为谋其面,先文其香。

粽子用绿色的芦叶包着纯白的糯米和红色的枣子,煮熟后,剥开芦叶,只见米团里仿佛嵌着几颗深红油亮的玛瑙,很好看。

好诗:

山暖已无梅可折,江清独有蟹堪持。

日啖荔枝三百颗,不辞长做岭南人。

蜀人贵芹芽脍,杂鸠肉为之。

秦烹惟羊羹,陇馔有熊腊。

长江绕郭知鱼美,好竹连山觉笋香。

东门买彘骨,醢酱点橙薤。蒸鸡最知名,美不数鱼鳖。

初游唐安饭薏米,炊成不减雕胡美。大如苋实白如玉,滑欲流匙香满屋。

鲈肥菰脆调羹美,(麦乔)熟油新作饼香。自古达人轻富贵,倒缘乡味忆回乡。

净洗铛,少着水,柴头罨烟焰不起。待他自熟莫催他,火候足时他自美。黄州好猪肉,价贱如泥土。富者不肯吃,贫者不解煮。早晨起来打两碗,饱得自家君莫管。

2. 描写吃东西的动作优美句子有哪些

1、我们去了田野粥屋,饭馆里很暖和,人也挺多的,我点了紫薯糜子粥,爸爸点了好几样菜,饭菜很快就上来了,我看见一桌香喷喷的饭菜,迫不及待地吃起来,哇,真香呀!不知不觉我就把一碗米饭吃完了。

2、说完爸爸在说说相反的型号。那就是妈妈的淑女型,说到妈妈我要悄悄的告诉你:我妈妈不吃肥肉,只是经常吃瘦肉和青菜哦!皮肤还算白,哈哈!不愧是淑女呀!就拿她的吃相来说吧,用一个不大的碗,张开一张樱桃小嘴,轻轻的将饭喂入口中,很轻的嚼了几下,生怕太过用力了米饭会痛似的。

3、吧唧,吧唧,吧唧,吧唧咦,这是谁发出的声音呀?呵呵,这是我们一家三口吃饭的声音。也许你会问,我们家吃饭的声音怎么是这样的呢?对呀,不听不知道,细细听起来,就会听出吃饭时许多稀奇古怪的声音:妈妈喝着汤,吱溜吱溜的;我嚼起牛肉,吧唧吧唧的;爸爸呢,喝起冰啤酒,咕噜咕噜的;不知什么时候,又传来呱啦呱啦的声音;好像在开个才艺大比拼,一个赛一个响,一个赛一个奇怪,真是个吃饭交响乐呀! 4、一家人坐着吃中饭,何辰怡跟奶奶并排的坐着,辰辰用小脚碰了一下奶奶的脚。

辰辰说:握握小脚,你好!你好。5、最上面的几口饭,菜也是又油又腻,便再没有胃口了,那就喝汤吧,我刚搅了一下,一只惨死的苍蝇的遗骸就浮出水面,胃猛烈的抽絮着,五脏六腑翻江倒海,我下意识的捂住了嘴,还好今天戴了眼镜,看得清。

6、我们到了饭堂,饭都已经端到了桌子上,上了半天的课,同学们肚子都饿看,一个个狼吞虎咽地吃着。可是吃了一半,大家好像都饱了似的,开始叽叽喳喳地说起话来,管理组长听到这么多吵闹的声音,于是发起了威,指着我们说:你们再吵我就把你们一个个拉出来。

大家听了一时安静了下来,可是不一会又开始闹哄哄的了。我还是继续埋头吃我的饭。

7、张红每次吃饭都跟打仗似得,好像慢了一秒就gameover了。学校的馒头虽不大,但也不小,可张红一口下去馒头就少了一半。

勺子也不停歇,一勺又一勺的往嘴了送,两颊被饭菜塞得鼓鼓的,还不时的抖动,加上那两腮上的两团苹果红,乍一瞧,还真有点像是一只正在进食的松鼠。因为吃的急,免不了被噎着,张红便总忙忙地用一只手端着碗往嘴里倒,另一只手握成拳状,急促的捶打着胸口。

一阵风卷云残过后,餐盘上一片洁净,就只剩些菜汤了,一搞定,张红便急不可待的端着餐盘迈着大步走了。8、王杰用她那三根白皙圆润的手指轻轻地拈着包子的下端,一边笑着和对面的人说话,一边一小口一小口的如小鸡啄米般吃着,半晌,才把一个不算太大的包子消灭完。

也许是觉得有些口干,她慢慢地拿起放在一边的卫生纸擦了擦刚才拿包子的三根手指的指腹,然后两手扶着碗边,翘着小指和无名指,微启着红唇,缓缓地抿了一口。察觉了我的目光,王杰扭过头来,微微的向我轻笑了一下,一边小心翼翼的把碗放回了原处。

待到一阵细嚼慢咽后,一是全班最后几名,但她却不着急,拿出一张新的纸巾拭了拭嘴,便端着餐盘慢慢地走了。9、我很饿,吃饭的时候饥不择食,不喜欢吃的菜都吃得津津有味。

10、他拿起碗筷就大口大口的地用筷子往嘴里塞饭,饭到了嘴里还没有经过细爵就囫囵吞下肚去,饿地太厉害了!后面直接拿起碗往嘴里倒饭,大嘴使劲地吞抿!11、十几个人坐在餐桌上,但是屋里却静得可怕。饭菜已经上齐,和奶奶做的一样香甜,但却少了那种熟悉而又特别的味道。

平常话最多的小姑爷这时也按捺不住,他开口道:“再也吃不到妈做的菜了!”小姑狠狠地瞪了他一眼。饭桌旁传来低低的啜泣声。

饭后,大家像往常一样开始“娱乐”。但却没有了以往的舒坦与惬意。

12、“开饭啦!开饭啦!”这是妈妈再叫我,爸爸和爷爷吃饭。“哇!好香呀!今天什么日子呀!怎么做这么多又这么香的饭菜呀!”我再问妈妈。

“怎么了?不行吗?如果不行的话你就别吃了。”妈妈说。

描写吃饭的句子。吃饭的时候,爸爸和爷爷是边吃饭边说话。

我呢,则是边吃饭边玩耍。而妈妈呢,则在一旁一声不吭的在吃饭。

爸爸和爷爷谈笑风生有说有笑。时间过去了半个小时,爸爸妈妈和爷爷早就吃完了。

则我呢,慢慢吞吞的在一旁吃饭。不管它们吃得快吃得慢都要等我吃完才洗碗。

爷爷吃晚饭就进屋里看新闻去了;爸爸便在客厅抽烟。妈妈在洗碗,我就进屋埋头写作业……13、洗漱完,我和爸妈一起吃早点。

四方桌的南面,空着了一付碗筷。以往一家人吃饭,总能听到一家人爽心的笑声以及奶奶让我多吃几口的关切话语。

然而今天,我们都默默地吞咽着,静静地用心情去体味没有了奶奶的日子。14、我从小有个习惯,就是吃饭总会吃得一点不剩。

一次和朋友各点了一份酸豆角炒饭,朋友胃口小只吃了一半就饱了,我却一直吃到盘子光光。结账的时候,老板在饭桌旁看着朋友的盘子说:“你的酸豆角炒饭,五元。”

然后他看着我的盘子,皱了皱眉头问:“你吃的啥?”15、看到妈妈刚做好的红烧肉端上了桌,宝宝赶忙跑了过去,爬上了椅子,用他那刚玩过沙子的小手捏了一块放在嘴里,()笑呵呵的对妈妈说:“真好吃啊!”妈妈开心地拿来了毛巾,帮他的小手。

3. 描写东西的优美的句子

1、请保留一份单纯,使你多一份与人的友善,少一些心灵的冷漠麻木;请保留一份单纯,使你多一份人生的快乐,少一些精神的衰老疲惫;请保留一份单纯,使你多一份奋进的力量,少一些故作高深的看破红尘。

2、成功是你梦寐以求的那朵红玫瑰,挫折正是那遍及周围的针刺。快乐是你辛勤耕耘获得的果实,悲伤正是那成熟前的秕粒。

3、天空收容每一片云彩,不论其美丑,所以天空宽阔无边。大地拥抱每一寸土地,不论其贫富,所以大地广袤无垠。

海洋接纳每一条河流,不论其大小,所以海洋广阔无边。 4、当简爱说:"我们是平等的,我不是无感情的机器",我懂得了作为女性的自尊;当裴多菲说:"若为自由故,两者皆可抛",我懂得了作为人的价值;当鲁迅说:"不在沉默中爆发,就在沉默中灭亡",我懂得人应具有反抗精神;当白朗宁说:"拿走爱,世界将变成一座坟墓",我懂得了为他人奉献爱心的重要。

5、大厦巍然屹立,是因为有坚强的支柱,理想和信仰就是人生大厦的支柱;航船破浪前行,是因为有指示方向的罗盘,理想和信仰就是人生航船的罗盘;列车奔驰千里,是因为有引导它的铁轨,理想和信仰就是人生列车上的铁轨。 6、什么是幸福?幸福是果园里果农望着压满枝头果实的满脸喜色,幸福是教室里莘莘学子憧憬未来的动人笑脸,幸福是实验室里科学家又有新发现时的舒展眉头,幸福是领奖台上运动员仰望国旗冉冉升起时的莹莹泪光。

幸福是奋斗的结晶,勤劳的丰碑。 7、未经历坎坷泥泞的艰难,哪能知道阳光大道的可贵;未经历风雪交加的黑夜,哪能体会风和日丽的可爱;未经历挫折和磨难的考验,怎能体会到胜利和成功的喜悦。

挫折,想说恨你不容易…… 8、幸福,时时刻刻围绕在你身旁。如果你从母亲手中接过饭碗,心存温馨,那就是幸福;如果你在灯下读着朋友的来信,品味友情,那就是幸福;如果你独坐一隅,静静听歌,凝神遐思,那就是幸福 9、有人说,幸福是星级宾馆里山珍海味间的觥筹交错;有人说,幸福是高档舞台厅里动人旋律中的翩翩起舞;有人说,幸福是端座奥迪、宝马车于人流如潮的大街上招摇过市;也有人说,幸福是待在密室里数着成叠的百元大钞;然而我要说:拥有这些,不一定就是真的拥有了幸福! 10、远去的飞鸟,永恒的牵挂是故林;漂泊的船儿,始终的惦记是港湾;奔波的旅人,无论是匆匆夜归还是离家远去,心中千丝万缕、时时惦念的地方,还是家。

11、幸福是什么?是功成名就、受人敬仰吗?是恬静悠闲、无牵无挂吗?是高朋满座、儿孙绕膝吗?我说:幸福是……。 12、人生就像一座山,重要的不是它的高低,而在于灵秀;人生就像一场雨,重要的不是它的大小,而在于及时。

13、要装进一杯新泉,你就必须倒掉已有的陈水;要获取一枝玫瑰,你就必须放弃到手的蔷薇;要多一份独特的体验,你就必须多一份心灵的创伤。 14、"指点江山,激扬文字"是一种豪迈的潇洒,"天生我材必有用"是一种自信的潇洒,"独钓寒江雪"是一种高洁的潇洒,"不破楼兰终不还"是一种悲壮的潇洒。

15、风从水上走过,留下粼粼波纹;阳光从云中穿过,留下丝丝温暖;岁月从树林走过,留下圈圈年轮,朋友,我们从时代的舞台上走过,留下了什么呢? 16、希望大海风平浪静,却常常有狂风和恶浪。希望江河一泻千里,却常常有旋涡和急流,希望生活美满幸福,却常常有悲伤和忧愁。

17.冬天的河干涸了,我相信,春水还会来临,那时白帆就是我心中的偶像;风中的树叶凋零了,我相信,泥土里的梦将在枝头开花结果。 18、天使的翅膀碎了,落到人间,成了我们的忧伤;诚信的被囊抛了,散到世上,成了撒旦的魔杖。

19、没有哪一种胭脂能涂抹时间,没有哪一件服装能掩饰灵魂,没有哪一套古籍能装潢空虚。 20、它可能是一座山,让你感受巍峨,它可能是一片海,让你体会壮阔,它可能是一首交响乐,让你领略激越,它可能是一座石雕,让你明白雄健。

21、在经受了失败和挫折后,我学会了坚韧;在遭受到误解和委屈时,我学会了宽容;在经历了失落和离别后,我懂得了珍惜。 22、不是苦恼太多,只是我们不懂生活;不是幸福太少,只是我们不懂把握。

23、责任感是诸葛孔明"鞠躬尽瘁,死而后已"写就的《出师表》,责任感是孔繁森离家别母血洒高原树立的公仆丰碑,责任感是贝多芬挑战人生超越自我谱写的《命运交响曲》。 24、金钱可以买来名贵的手表,但买不来宝贵的时间;金钱可以买来美味的食品,但买不好的胃口。

25、是一丛秋菊,也要散发芳香;是一片秋叶,也要装点大地;是一株古柏,也要撑起蓝天;是一眼古井,也要流出清泉。 26、尊重别人是一种美德,受人尊重是一种幸福。

27、书是良药,刘向说:"书犹药也,善读可以医愚";书是益友,臧克家说:"读过一本书,像交了一位益友";书是窗户,高尔基说:"每一本书,都在我面前打开了一扇窗户"。 28、成熟是一种素质,一种源于心灵表于行动的素质;成熟是一种能力,一种自我约束自我管理的能力;成熟是一种态度,一种对任何事物都保持冷静的态度;成熟是一种心境,一种能看淡一切,万事淡如水的。

4. 小说中写饭菜或做饭的唯美语句请问谁有

“小馋猫你的最爱好了!”我赶紧放下手中的作业,急冲冲地跑向厨房,菠萝饭果真是香,一进厨房,一股诱人的果香和米饭的清香钻进鼻尖,让人口齿生津。

打开菠萝饭的盖子,一阵轻烟袅袅升起,在热腾腾的烟雾中,一道美食呈现在我的眼前。几根黄澄澄的菠萝细丝像网络一样盖在饭上,白色的米饭配上丰富的配料:火腿、青豆、玉米。

好像白玉镶嵌着一颗颗红色的玛瑙、绿色的翠玉和耀眼的碎金。菠萝则好似襁褓裹住了这胖娃娃。

菠萝饭不仅看相好,味道更是诱人。我拿起勺子弄了一勺饭放进口中。

酸酸甜甜的菠萝味刺激了我舌头上每一个细胞,感觉充满活力。

5. 与吃饭有关的句子

描写吃饭的句子

1、我很饿,吃饭的时候饥不择食,不喜欢吃的菜都吃得津津有味。

2、他拿起碗筷就大口大口的地用筷子往嘴里塞饭,饭到了嘴里还没有经过细爵就囫囵吞下肚去,饿地太厉害了!后面直接拿起碗往嘴里倒饭,大嘴使劲地吞抿!

3、十几个人坐在餐桌上,但是屋里却静得可怕。饭菜已经上齐,和奶奶做的一样香甜,但却少了那种熟悉而又特别的味道。平常话最多的小姑爷这时也按捺不住,他开口道:“再也吃不到妈做的菜了!”小姑狠狠地瞪了他一眼。饭桌旁传来低低的啜泣声。饭后,大家像往常一样开始“娱乐”。但却没有了以往的舒坦与惬意。

6. 跪求关于美食的唯美的句子

1.秦烹惟羊羹,陇馔有熊腊。

2.蜀人贵芹芽脍,杂鸠肉为之。3.净洗铛,少着水,柴头罨烟焰不起。

待他自熟莫催他,火候足时他自美。黄州好猪肉,价贱如泥土。

富者不肯吃,贫者不解煮。早晨起来打两碗,饱得自家君莫管。

4.竹外桃花三两枝,春江水暖鸭先知。蒌蒿满地芦芽短,正是河豚欲上时。

5.秋来霜露满园东,芦菔生儿芥生孙。我与何憎同一饱,不知何苦食鸡豚。

6.丰湖有藤菜,似可敌莼羹。7.纤手搓来玉色匀,碧油煎出嫩黄深。

夜来春睡知轻重,压扁佳人缠臂金。8.小饼如嚼月,中有酥和饴。

9.时绕麦田求野荠,强为僧舍煮山羹。10.长江绕郭知鱼美,好竹连山觉笋香。

11.人间定无可意,怎换得玉脍丝莼。12.天上苏陀供,悬知未易同。

13.以菘菜、山药、芋、菜菔杂为之,不施醢酱,山庖珍烹也。14.东门买彘骨,醢酱点橙薤。

蒸鸡最知名,美不数鱼鳖。15.霜余蔬甲淡中甜,春近录苗嫩不蔹。

采掇归来便堪煮,半铢盐酪不须添。16.初游唐安饭薏米,炊成不减雕胡美。

大如苋实白如玉,滑欲流匙香满屋。17.鲈肥菰脆调羹美,(麦乔)熟油新作饼香。

自古达人轻富贵,倒缘乡味忆回乡。”18.色如玉版猫头笋,味抵驼峰牛尾猩。

19.新津韭黄天下无,色如鹅黄三尺余,东门彘肉更奇绝,肥美不减胡羊酥。20.紫驼之峰出翠釜,水精之盘行素鳞,犀箸餍饫久未下,鸾刀缕切空纷纶,黄门飞鞚不动尘,御厨络绎送八珍。

21.青青竹笋迎船出,白白红鱼入馔来。我已经尽力了,望采纳。

7. 描写饭菜的句子

1. 肥嫩的肉质被烤得焦黄脆嫩,浓香的汁液包裹在周围,在灯光下泛出点点的油光,扑鼻的香味阵阵袭来。

2. 妈妈做的菜,新鲜滑嫩,汁多味美!

3. 焦脆而不糊、细嫩而不腻、初闻臭气扑鼻,细嗅浓香诱人,具有白豆腐的新鲜爽口,油炸豆腐的芳香松脆。

4. 灌汤小笼包的皮是薄薄的,甚至都透亮了,张嘴咬一口,里面鲜美的汁水流入口中,咬那浸了汁水的肉团,不肥不腻,入口爽滑……那真叫美!

5. 盐水鸭皮白柔嫩、肥而不腻、香鲜味美,具有香、酥、嫩的特点。

6. 烧卖里碧绿的颜色,透出蒸熟后薄如纸的面皮,犹如翡翠一般。轻轻地咬上一口,皮一点便破,吃到里面由虾仁、韭菜和鸡蛋制成菜茸,爽口清润。吃下去后嘴里还充满虾仁的香味,真可谓齿颊留香。

7. 近看,白白嫩嫩的小笼汤包饱满,润泽,嗯,看起来就很好吃。瞧,那皮儿是多么的娇嫩呀,娇嫩得就好像胖娃娃肥嘟嘟的小脸蛋儿,轻轻一捏就破碎了。透过外皮儿,你能清清楚楚地看到里面那纯美的汤汁儿。

8. 我最满意的是自己取名为《花》的冷盘。瞧,西红柿切成片,放在四周当花瓣。香蕉切成圆圈,放在西红柿里面一层。橘子一瓣一瓣放在中间,再把桂圆核子去掉,捏成一个长短不一的花蕊。真可谓层层叠叠,色香味齐全啊!

9. 这盘菜五色俱全,让我忍不住口水直流。再看看其它菜,让我眼花缭乱。

10. 妈妈忙碌了半天,准备了一桌丰富的晚餐,好菜可多啦,有北京烤鸭、红烧全鱼、清炖土鸡、腊味合蒸、素炒莴笋片、水煮萝卜丝、汤圆、水饺等等,爷爷奶奶来了,在外面工作的姑姑姑爷和周琴妹妹也回来了,大家围坐在一起,吃年夜饭,相互祝福,有说有笑。

11. 妈妈熬的鸡汤,白色的,很香,咸味,很好喝。每次妈妈做鸡汤,我都拿个小勺子喝,喝一口,品品味,再咽下去,再喝一口,再品品味,再咽下去,再喝一口,再品品味,再咽下去,再喝一口,再品品味,再咽下去。

8. 描写吃饭的语句

描写吃饭的语句

1. 我们去了“田野粥屋”,饭馆里很暖和,人也挺多的,我点了紫薯糜子粥,爸爸点了好几样菜,饭菜很快就上来了,我看见一桌香喷喷的饭菜,迫不及待地吃起来,哇,真香呀!不知不觉我就把一碗米饭吃完了。

2. 姥姥的牙齿不好,吃东西时,她那片干瘪嘴儿老是一瘪一瘪地动着。

3. 它伸长脖子,张开嘴巴,红色的舌头清晰可见,先显出了一股霸气,它侧这头,再微微收缩。突然,它再次把张开大嘴的头伸向前方,紧紧咬住猎物,迅速缩回头部,慢慢地“品尝”自己的佳肴……

解Bug之路——Nginx 502 Bad Gateway

转载:https://www.cnblogs.com/alchemystar/p/13409534.html

前言

事实证明,读过Linux内核源码确实有很大的好处,尤其在处理问题的时刻。当你看到报错的那一瞬间,就能把现象/原因/以及解决方案一股脑的在脑中闪现。甚至一些边边角角的现象都能很快的反应过来是为何。笔者读过一些Linux TCP协议栈的源码,就在解决下面这个问题的时候有一种非常流畅的感觉。

Bug现场

首先,这个问题其实并不难解决,但是这个问题引发的现象倒是挺有意思。先描述一下现象吧,笔者要对自研的dubbo协议隧道网关进行压测(这个网关的设计也挺有意思,准备放到后面的博客里面)。先看下压测的拓扑吧:

解Bug之路——Nginx 502 Bad Gateway

为了压测笔者gateway的单机性能,两端仅仅各保留一台网关,即gateway1和gateway2。压到一定程度就开始报错,导致压测停止。很自然的就想到,网关扛不住了。

网关的情况

去Gateway2的机器上看了一下,没有任何报错。而Gateway1则有大量的502报错。502是Bad Gateway,Nginx的经典报错,首先想到的就是Gateway2不堪重负被Nginx在Upstream中踢掉。

解Bug之路——Nginx 502 Bad Gateway

那么,就先看看Gateway2的负载情况把,查了下监控,发现Gateway2在4核8G的机器上只用了一个核,完全看不出来有瓶颈的样子,难道是IO有问题?看了下小的可怜的网卡流量打消了这个猜想。

Nginx所在机器CPU利用率接近100%

这时候,发现一个有意思的现象,Nginx确用满了CPU!

解Bug之路——Nginx 502 Bad Gateway

再次压测,去Nginx所在机器上top了一下,发现Nginx的4个Worker分别占了一个核把CPU吃满-_-!

解Bug之路——Nginx 502 Bad Gateway

什么,号称性能强悍的Nginx竟然这么弱,说好的事件驱动\epoll边沿触发\纯C打造的呢?一定是用的姿势不对!

去掉Nginx直接通信毫无压力

既然猜测是Nginx的瓶颈,就把Nginx去掉吧。Gateway1和Gateway2直连,压测TPS里面就飙升了,而且Gateway2的CPU最多也就吃了2个核,毫无压力。

解Bug之路——Nginx 502 Bad Gateway

去Nginx上看下日志

由于Nginx机器权限并不在笔者手上,所以一开始没有关注其日志,现在就联系一下对应的运维去看一下吧。在accesslog里面发现了大量的502报错,确实是Nginx的。又看了下错误日志,发现有大量的

Cannot assign requested address

由于笔者读过TCP源码,一瞬间就反应过来,是端口号耗尽了!由于Nginx upstream和后端Backend默认是短连接,所以在大量请求流量进来的时候回产生大量TIME_WAIT的连接。

解Bug之路——Nginx 502 Bad Gateway

而这些TIME_WAIT是占据端口号的,而且基本要1分钟左右才能被Kernel回收。

解Bug之路——Nginx 502 Bad Gateway

cat /proc/sys/net/ipv4/ip_local_port_range3276861000

也就是说,只要一分钟之内产生28232(61000-32768)个TIME_WAIT的socket就会造成端口号耗尽,也即470.5TPS(28232/60),只是一个很容易达到的压测值。事实上这个限制是Client端的,Server端没有这样的限制,因为Server端口号只有一个8080这样的有名端口号。而在upstream中Nginx扮演的就是Client,而Gateway2就扮演的是Nginx

解Bug之路——Nginx 502 Bad Gateway

为什么Nginx的CPU是100%

而笔者也很快想明白了Nginx为什么吃满了机器的CPU,问题就出来端口号的搜索过程。

解Bug之路——Nginx 502 Bad Gateway

让我们看下最耗性能的一段函数:

int __inet_hash_connect(...){// 注意,这边是static变量static u32 hint;// hint有助于不从0开始搜索,而是从下一个待分配的端口号搜索u32 offset = hint + port_offset;.....inet_get_local_port_range(&low, &high);// 这边remaining就是61000 - 32768remaining = (high - low) + 1......for (i = 1; i <= remaining; i++) {port = low + (i + offset) % remaining;/* port是否占用check */....goto ok;}.......ok:hint += i;......}

看上面那段代码,如果一直没有端口号可用的话,则需要循环remaining次才能宣告端口号耗尽,也就是28232次。而如果按照正常的情况,因为有hint的存在,所以每次搜索从下一个待分配的端口号开始计算,以个位数的搜索就能找到端口号。如下图所示:

解Bug之路——Nginx 502 Bad Gateway

所以当端口号耗尽后,Nginx的Worker进程就沉浸在上述for循环中不可自拔,把CPU吃满。

解Bug之路——Nginx 502 Bad Gateway

为什么Gateway1调用Nginx没有问题

很简单,因为笔者在Gateway1调用Nginx的时候设置了Keepalived,所以采用的是长连接,就没有这个端口号耗尽的限制。

解Bug之路——Nginx 502 Bad Gateway

Nginx 后面有多台机器的话

由于是因为端口号搜索导致CPU 100%,而且但凡有可用端口号,因为hint的原因,搜索次数可能就是1和28232的区别。

解Bug之路——Nginx 502 Bad Gateway

因为端口号限制是针对某个特定的远端server:port的。所以,只要Nginx的Backend有多台机器,甚至同一个机器上的多个不同端口号,只要不超过临界点,Nginx就不会有任何压力。

解Bug之路——Nginx 502 Bad Gateway

把端口号范围调大

比较无脑的方案当然是把端口号范围调大,这样就能抗更多的TIME_WAIT。同时将tcp_max_tw_bucket调小,tcp_max_tw_bucket是kernel中最多存在的TIME_WAIT数量,只要port范围 - tcp_max_tw_bucket大于一定的值,那么就始终有port端口可用,这样就可以避免再次到调大临界值得时候继续击穿临界点。

cat /proc/sys/net/ipv4/ip_local_port_range2276861000cat /proc/sys/net/ipv4/tcp_max_tw_buckets20000

开启tcp_tw_reuse

这个问题Linux其实早就有了解决方案,那就是tcp_tw_reuse这个参数。

echo '1' > /proc/sys/net/ipv4/tcp_tw_reuse

事实上TIME_WAIT过多的原因是其回收时间竟然需要1min,这个1min其实是TCP协议中规定的2MSL时间,而Linux中就固定为1min。

#define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAIT  * state, about 60 seconds*/

2MSL的原因就是排除网络上还残留的包对新的同样的五元组的Socket产生影响,也就是说在2MSL(1min)之内重用这个五元组会有风险。为了解决这个问题,Linux就采取了一些列措施防止这样的情况,使得在大部分情况下1s之内的TIME_WAIT就可以重用。下面这段代码,就是检测此TIME_WAIT是否重用。

__inet_hash_connect|->__inet_check_establishedstatic int __inet_check_established(......){....../* Check TIME-WAIT sockets first. */sk_nulls_for_each(sk2, node, &head->twchain) {tw = inet_twsk(sk2);// 如果在time_wait中找到一个match的port,就判断是否可重用if (INET_TW_MATCH(sk2, net, hash, acookie,saddr, daddr, ports, dif)) {if (twsk_unique(sk, sk2, twp))goto unique;elsegoto not_unique;}}......}

而其中的核心函数就是twsk_unique,它的判断逻辑如下:

int tcp_twsk_unique(......){......if (tcptw->tw_ts_recent_stamp &&    (twp == NULL || (sysctl_tcp_tw_reuse &&     get_seconds() - tcptw->tw_ts_recent_stamp > 1))) {       // 对write_seq设置为snd_nxt+65536+2       // 这样能够确保在数据传输速率<=80Mbit/s的情况下不会被回绕      tp->write_seq = tcptw->tw_snd_nxt + 65535 + 2......return 1;}return 0;}

上面这段代码逻辑如下所示:

解Bug之路——Nginx 502 Bad Gateway

在开启了tcp_timestamp以及tcp_tw_reuse的情况下,在Connect搜索port时只要比之前用这个port的TIME_WAIT状态的Socket记录的最近时间戳>1s,就可以重用此port,即将之前的1分钟缩短到1s。同时为了防止潜在的序列号冲突,直接将write_seq加上在65537,这样,在单Socket传输速率小于80Mbit/s的情况下,不会造成序列号重叠(冲突)。同时这个tw_ts_recent_stamp设置的时机如下图所示:

解Bug之路——Nginx 502 Bad Gateway

所以如果Socket进入TIME_WAIT状态后,如果一直有对应的包发过来,那么会影响此TIME_WAIT对应的port是否可用的时间。开启了这个参数之后,由于从1min缩短到1s,那么Nginx单台对单Upstream可承受的TPS就从原来的470.5TPS(28232/60)一跃提升为28232TPS,增长了60倍。如果还嫌性能不够,可以配上上面的端口号范围调大以及tcp_max_tw_bucket调小继续提升tps,不过tcp_max_tw_bucket调小可能会有序列号重叠的风险,毕竟Socket不经过2MSL阶段就被重用了。

不要开启tcp_tw_recycle

开启tcp_tw_recyle这个参数会在NAT环境下造成很大的影响,建议不开启。

Nginx upstream改成长连接

事实上,上面的一系列问题都是由于Nginx对Backend是短连接导致。Nginx从 1.1.4 开始,实现了对后端机器的长连接支持功能。在Upstream中这样配置可以开启长连接的功能:

upstream backend {    server 127.0.0.1:8080;# It should be particularly noted that the keepalive directive does not limit the total number of connections to upstream servers that an nginx worker         process can open. The connections parameter should be set to a number small enough to let upstream servers process new incoming connections as well.    keepalive 32;     keepalive_timeout 30s; # 设置后端连接的最大idle时间为30s}

这样前端和后端都是长连接,大家又可以愉快的玩耍了。

解Bug之路——Nginx 502 Bad Gateway

由此产生的风险点

由于对单个远端ip:port耗尽会导致CPU吃满这种现象。所以在Nginx在配置Upstream时候需要格外小心。假设一种情况,PE扩容了一台Nginx,为防止有问题,就先配一台Backend看看情况,这时候如果量比较大的话击穿临界点就会造成大量报错(而应用本身确毫无压力,毕竟临界值是470.5TPS(28232/60)),甚至在同Nginx上的非此域名的请求也会因为CPU被耗尽而得不到响应。多配几台Backend/开启tcp_tw_reuse或许是不错的选择。

总结

应用再强大也还是承载在内核之上,始终逃不出Linux内核的樊笼。所以对于Linux内核本身参数的调优还是非常有意义的。如果读过一些内核源码,无疑对我们排查线上问题有着很大的助力,同时也能指导我们避过一些坑!


  • 发表评论
【已经有()位大神发现了看法】

  • 匿名发表
  •  
人参与,条评论