去东京

一直想去日本旅行, 这一次终于成行了。日本的第一站是首都东京。

东京!(其实是在介绍皇居历史啦,但是放在这里可以搞笑)

签证办的非常顺利,在网上预约好时间,然后携带指定的资料去大使馆就可以了,不用事先在网上填写表格。比澳大利亚简单太多。费用是 60 新币一人,五年有效,相比于澳大利亚 220 新币一年,简直便宜太多。

去东京还发生了一件有趣的事。我们下了飞机第一站去筑地市场吃早饭,结果在那里居然遇到了飞机上坐在我旁边小哥。我跟他打招呼,他也认出来我,然后他旁边的朋友惊掉了下巴——what?(你在东京居然有熟人?)

东京给我们的第一印象是干净。大街上一尘不染,几乎看不到垃圾。(在游客聚集的地方,比如筑地市场,还是有一些垃圾的。)而且很神奇的是,我在整个城市都没见过垃圾桶,只有在某些商业场所,商家自己安置的垃圾桶,所有人都自己拿着垃圾。没有垃圾桶,城市不是应该更脏吗?不知道为何东京反而这么干净。有天早上买了一杯咖啡,结果一直没见到垃圾桶,拿着喝完的纸杯拿了一整天。

我发现我的博客宽度太小,导致我自豪的很多照片贴在这里显得小气。读者如果碰到喜欢的照片可以点击打开大图慢慢欣赏。(也许改换一个博客主题了?)

东京地铁

东京的市民总是行色匆匆,在地铁站总是能看到人们在着急赶着什么。在工作日,地铁里面的上班族打扮都非常精致,男士都穿着西装,女士都妆容精致。

我们第一站去了新宿,新宿站有超过200个出口,可能是世界上最大的地铁站。

东京的地铁可太值得一说了。这是下飞机之后带给我们的第一个冲击。东京的地铁非常复杂:

出口多而且不连通。像上海和新加坡这种城市,地铁网也很发达,很多换乘站有好几条线。在换乘站,你只要从任何一个入口进入地铁站,就可以根据指示去任何一条线路。我们以为东京也是这样,结果在秋叶原站从一个入口进去,找日比谷线,转了好半天,才意识到不同线路之间的地铁站是不连通的!即使它们都叫做秋叶原站。有时候甚至同站换乘都要刷卡出去,然后再从另一个入口进。所以,后面还是乖乖按照 Google 地图来走吧,如果 Google 让你去一个入口,即使在途中遇到了更近的入口,也不要选择这个近的入口。究其原因,是因为东京的铁路是由不同公司运营的,同一家公司的线路可能共享入口。

地铁站设计复杂。很多列车的两个反方向站台是只有一条路过去的,很容易坐反方向。不过我摸索出一个窍门,东京的地铁每一个线路都有编号,比如 G,JR,JT,等等,每一个站都有标号,比如 G9,G10,G11. 如果你要去一个地方,先查看目的地的编号,比如 G8,然后看当前位置,比如是 G4,那么找到站台之后,确认方向是数字变大的方向,就对了。

计价方式复杂。东京铁路有各种 Pass,即周游券,通票。但是简单算了一下,就放弃了。因为 Pass 的种类繁多,有的不包括这家公司,有的不包括那家公司。而且正常坐地铁,买 Pass 的话很难回本,如果能回本,很可能旅行计划做的有问题,哈哈。我们是全程刷西瓜卡。

铁路系统和地铁系统。如果去周边城市,就要用到铁路系统,这个又很复杂了,分成 Local train,急行线,特急线,票价区分度很高,可能快 20min 就贵出来好多。票可能要买两种,一种乘车券和一种指定席券。我们去机场的时候只刷了西瓜卡,结果上车发现全是指定席,只好在车上补票。还有一个有趣的事情,是我们去东京站坐火车,火车站和地铁站都是东京站。我们从地铁到了之后,按照指示找到了我们要找的站台(非常难找,问了工作人员才找到),等火车的时候,欣突然意识到,我们根本没用到购买的火车票,一定是哪里不对。于是又找了一个工作人员问了一下,才明白,我们需要找一个出口,刷西瓜卡出去,然后再刷火车票进入。晕!

电梯很少。这一点也很不好,虽然可能是有电梯的,但是我们 90% 的时间都在走楼梯,因为指示牌都是指向楼梯路线的,找直梯无疑是给自己增加难度。上海,新加坡的地铁就很少需要人走楼梯,扶梯和直梯都在显眼的位置。说起来,在东京没有见过轮椅,可能东京的无障碍设施也不是很好。

东京市区

日本的相机行业非常发达,目前单反微单头部三家,佳能,尼康,索尼都是日本企业(网上看到有人说日本二战点错了技能树,研究瞄具去了,不知真假,但是挺有趣)。日本人对相机使用又比较爱惜(无从考证,个人认为所有的摄影师都对相机比较爱惜)。所以在日本能看到很多中古(二手)相机店。折合汇率,日本可能是购买相机最好的地方,而且很多热门款式,在中国可能都买不到了,日本还有货。

北村写真就是一整栋大楼,一层是二手镜头,一层是机身设备。还有一层很有趣,都是过时的 CCD 和胶片机,花 5 新币就能买到一台还能工作的相机。很多镜头由于缺陷,也买几十新币的。

北村写真店
街头的咖啡店,但是没什么人光顾,我觉得如果能提供一个垃圾桶,顾客肯定会很多!
筑地市场的一个店,不知道为什么要放两只蛙蛙
筑地市场的一家寿司店
东京的街道,琳琅满目的广告牌是东京的签名
东京塔上的夜景

哈哈,不要小看了这张照片,这是我在东京塔上没有三脚架的情况下,手持 4s,才得到的这张图片。其实是发现了一个绝妙的方法,只要把镜头按在玻璃上,即能克服反光,又能保持稳定。

皇居

皇居的导览很赞,有中文,需要提前一个月预约,当天去排队也可以,我去的时候发现大部分人好像是当天排队进来的。导览团队非常专业,介绍的内容也很有趣。

我们的导览,很有趣,讲很多笑话,中文说的很好
皇居
皇居

新宿

歌舞伎町一番街,白天路过了一下
新宿御苑,蒲公英
新宿御苑
新宿御苑
新宿御苑

涩谷 – 原宿

涩谷这天可太有趣了。先是早上,在明治神宫,遇到了有人结婚,于是观摩了日本的传统婚礼。然后在原宿的大街上,见到了很多警察,整条街都是警察,阵势很大的样子,往前走,看到了貌似是某种日本右翼势力在抗议(真是可恶)。

涩谷 sky 上面的景色
涩谷 sky
Google 气派的办公室

涩谷 sky 也挺有趣,就是一个很高的办公楼顶楼的景观,上面很漂亮。有意思的是它的售票,官网提前一个月开卖,在涩谷 sky 看日落很美,但是一定要提前一个月抢票,这个时段的票基本上放出来就没了。日落时段的票,官方推荐的购票渠道,比如 Klook,booking等,都没有了,但是——淘宝居然可以买得到?是的,淘宝无良商家在官方一开卖就全买下来了,然后用 2-3 倍的价格再卖给我们。简直太可恶了!

其实官方的角度讲,票卖光了是好事,对吧?但是他们居然没有坐视不管。他们会检查票是不是官方发送的邮件,是不是二次转发或者截图,一个账号购买的5张票如果分开入场会被拒绝,等等,以此来打击黄牛。

其实购票实名认证不就好了?

明治神宫
明治神宫的大树
明治神宫的婚礼
严阵以待的警察

上野

上野公园,「环游世界第一站」,不知道现在到哪里了?
鸭子船,本来没计划做,偶尔看到了,居然才 7 新币,就当上去休息一下了。 (结果因为要炫耀一下速度蹬的腿都酸了)
某种会飞又会游泳可能也会走路的三栖鸟儿
上野区域有很多鞋店
晴空塔
虽然垃圾桶没有,但是这种自动售卖机倒是随处可见。口渴了,只要随便找一个看起来会有售卖机的胡同,就能发现售卖机。
仲见世商店街
浅草寺
浅草寺

富士山

这一天在飞猪上买了一个一天的包车团,从东京出发,去了很多网红景点,一路比较赶,我很痛苦。团上的姑娘都是下车拍照,上车修图,乐此不疲。事实证明我报错团(选错路线)了。

其中,日川时计店就是一个卖表的店,店门口的街道能看到富士山而已。lawson 就是一个便利店,店后面是富士山。我不理解为什么要来打卡,可能是被小红书忽悠过来的?来的大部分是中国人。看富士山的话,去一个公园(我觉得大石公园比较好)就够了,真没必要去这些“网红”景点打卡奔波。

东京站
下吉田,富士山下的小村子
下吉田的火车道
新仓山浅间公园在山上,要爬上去。这是爬到半山腰拍的。
Arakurayama Sengen Park 新仓山浅间公园,网红景点
富士山
lawson 便利店,著名打卡景点。但是这个 lawson 据说要拆了,因为游客在马路上拍照,挺危险的。lawson估计也没有怨言,因为大家都是在这里拍照,不进去消费,关了就关了。
日川时计店旁边的一条小溪

日川时计店的照片就不放了,很多游客在马路上拍照,特别安置了一个工作人员维持秩序,场面很混乱。

忍野八海

忍野是富士山下的一个小村子,八海就是八个池子。类似于中国的古镇景点。

但是其中这个池子真值得说一说,拍照又拍不出来当时的效果。照片的水看起来很浅,其实有 8 米深,但是水非常清澈,比游泳池还清。除了波纹,几乎看不到水的存在,只有鱼和鱼的影子,鱼就像在这里飞翔一样。有一种恐怖的幽静。非常震撼。我觉得现在的数码设备记录不下来这种感觉,得亲身看了才知道。

忍野村
大石公园

我们这一天运气不错,能看到富士山。富士山很多时候是被云遮挡住的,如果不是晴天,那么云都见不到,都是雾。这个网站可以查看富士山能见度的预报:什么时候去看富士山?

镰仓

镰仓高校前,又是一个我不理解的景点,普普通通的电车,普普通通的学校。可能是因为我不看灌篮高手吧。
镰仓的海
海边钓鱼的父子
还是大海
在镰仓拍到的 1969 年 GTO
狗(很显然)
街道
在去江之岛的桥上拍到的,天气好的时候应该能看到富士山

热海花火大会

这次的旅行以花火大会结尾,非常完美。举办方做的很好,活动的信息非常周全,甚至烟花放 5000 发都标记清楚。新闻上说现场人很多,但是我感觉不至于能到上新闻的程度。我们的司机很专业,让我们去人流少的地方上车,全程安排很好。

花火大会的场面很震撼,居然有笑脸烟花,地球仪烟花这种东西,不知道怎么做到的。最后的节目空中尼加拉瓜大瀑布,非常震撼。只可惜我第一次使用相机的 B 门,很不熟练,以及没有三脚架,只能拍出下面的样子了。

购物

现在的东京是购物天堂。一个是日元汇率大跌,相当于是全国物价对于外国人来说都便宜了。另一个是退税方便,一般的城市是机场退税,但是东京大部分商店可以直接用退税价格购物,甚至超市都可以退税,相当于全国都是免税店,只要拿出护照就可以了。但是消耗品用退税价格购买的话,不能在日本消费。退税购买之后,电源会用一个专用的透明袋子封起来,不能拆开使用。东京的商业很发达,商场林立,像优衣库,MUJI,这种商场都是整栋楼整栋楼开,很好逛。

优衣库

东京的食堂

可能是因为寸土寸金,我们去过的食堂都非常小。很多食堂的设计,都是开放式厨房,食客围着厨房而坐,可以边吃边看厨师的制作过程。有种温馨的感觉。

不过也是因为都比较小吧,大部分的食堂都需要排队的,甚至有很多,如果不是提前预约,都吃不上。幸运的是,我们是在五一之前去的,所以在工作日的非午餐饭餐高峰时间去,不排队也能吃到很多不错的。很多餐厅午餐和晚餐是不一样的价格,相同的餐厅相同的食物,晚餐的价格可能是午餐的两倍。

一些有趣的餐厅和图片。

这家是在涩谷玩的时候在附近随便找的一家牛肉饭。菜单基本上只有牛肉一种,只是你要选择多少肉而已,类似于食其家。厨师的主要工作就是烤肉和切肉。

ステーキライスの店 センタービーフ渋谷宮益坂店

地址:Japan, 〒150-0002 Tokyo, Shibuya City, Shibuya, 1 Chome−12−24, 707 Shibuya, 1階

围着厨房而坐
我点的 mega size 正在制作中
开吃。很自不量力的点了最大份 Mega size,结果吃撑了。

下面这家是在神田的一番街随便找的一家,因为住在附近,回去的时间玩了,就在这里吃了。这是一家烧鸟店,也是厨师在中间烤,食客围坐,但是很干净,餐厅有合理的排烟系统,食客和厨师之间也有一层玻璃,所以完全没有烧烤的烟。厨师会时不时看你吃的进度,等你快吃完的时候马上烤下一串,让你吃到的都是新鲜的刚烤好的。

烤的很嫩,一点烤黑的地方都没有,像是水浴烹调的牛排一样,非常鲜美。新加坡也有烧鸟,但是新加坡的是事先烤好的,完全比不上现烤的。我们点的套餐,有鸡肉,鸡肝等等,非常下酒。

店名:Tori no Kakehashi

地址:Japan, 〒101-0044 Tokyo, Chiyoda City, Kajicho, 2 Chome−11−19 神田日新ビル1B

随便拍了一张前菜

后来又在附近找了一家居酒屋。这家更有意思,自己加装了楼梯,将一个小餐厅隔成两层。我们就坐着二楼很小的一个地方边喝边吃。这家的烧鸟不贵,店名就叫做 50,所以每一串只有 50yen,折合人民币 2.3元。

居酒屋的二楼小桌子

但是居酒屋有一套 system,(我发现之前去过的也都是一样的套路):

  • 每个人至少点一杯饮料;
  • 是有餐位费的,但是也会有免费小菜,叫做 Otoshi;
  • 23点之后加收 10%;
  • 小费加收 10%;

可能是因为店小,要通过这种系统来提高翻桌率吧。不然遇到点一杯酒喝一晚上的酒鬼怎么办。

下面这一家是烤肉。叫做俺の肉。

地址是:神田(東京都) JR 神田站 西口 步行1分鐘,3-15-10, Uchikanda, Chiyoda-ku, Tokyo, 101-0047

空间依然非常局促,像是飞机的经济舱座位。但是肉非常好吃。非常鲜嫩,像果冻一样。老板是一个五大三粗的汉子,但是总是笑眯眯的。

治愈的烤肉
买的一个套餐,非常好吃。尤其是最上面两块。

下面一家是鳗鱼饭。叫做:鰻の成瀬。也很好吃,服务员会给一个牌子,上面写的鳗鱼的不同吃法。

心心念念的鳗鱼饭

最后一个随便找的一家家庭料理。都是 1300yen 的定食,便宜又好吃。

家庭料理的定食

这次旅行我们还去了伊豆,伊豆游记请见这里

 

去悉尼

上个月看到飞澳大利亚机票很便宜,于是就想去澳洲旅行一下。 算得上是一场说走就走的旅行了。(虽然最后算了一下,机票在这次的旅行中反而是最小的花费,酒店住宿才是贵的地方,哈哈。)

我们这次先后去了悉尼和墨尔本,这篇博客分享一些旅行中的七七八八的事情和照片。先写悉尼篇,后面有空再来写墨尔本篇。

签证申请

出发之前的签证申请,直接让我审视了一遍自己的人生,需要的材料非常多,稀奇的材料包括:

  1. 当前持有的签证;
  2. 家庭中有没有人不申请签证,不申请的话也要填资料并说明原因;
  3. 户口本(??);
  4. 过去5年去过哪些国家(??)

一共 21 页呀。整个流程 Kuact 写的这个版本 依然有效,可以参考。费用也比较高,一共 220 新币一个人,不过出签了才意识到这是一个一年多次入境的签证,那还不错,下一次可以去西澳旅行一下。如果只去一次的话,这个签证就显得有些太贵了。总体的流程如下:

  1. 注册 immi 账号,签证类型选择 Visitor (subclass 600)
  2. 登陆之后开始为每一个人创建一份申请,填表
  3. 提交申请,付费
  4. 会收到邮件,然后去 VFSGLOBAL 预约生物信息采集。VFSGLOBAL 是一个签证外包的机构,在新加坡负责很多国家的签证
  5. 注册一个 VFSGLOBAL 账号,登陆之后为每一个人预约生物信息采集(是每一个人,如果只给自己预约了,那么家人是没有预约的,到了现场才发现的话只能交昂贵的现场预约费用了)
  6. 现场生物采集,只收新币现金
  7. 采集完成之后我没有做 immi 上 submit 的操作,然后就出签了

签证下来的速度倒是异常的快,提交申请 3 天就出签了。

入境

机场对水果的控制格外严格,过关之前自觉地丢了很多东西。通关意外地非常顺利,直接刷护照过了,连句话都没人跟我说,下飞机到过关几乎花了10min左右。(最近发现中国新建的机场也支持自助刷护照入关了,非常便捷)。

悉尼衣食住行感受

到了悉尼,一出机场就感受到了一阵凉爽的风——好舒服呀。好像也好久没有经历过这样的风了,不知道在新加坡连续度过了多少个夏天。

出发之前还问刚回来的一个新加坡朋友,那边冷吗?朋友说冷,我打趣问道冷是 for Singaporan or for everyone?

到了发现果然不是很冷,白天T恤晚上加一件卫衣或者外套够了。最好是能防风的,温度不是特别低,但是风很大。

说吃的。没想到来了澳大利亚的几顿饭——汉堡,汉堡,还是……汉堡。一连吃了四顿汉堡,机场的麦当劳,餐厅的汉堡,酒吧的汉堡。有时候不想吃汉堡,点了一个叫做 PBB 的东西,上来一看,还是汉堡。

澳大利亚对澳大利亚的产品非常自豪,超市买的零食,蔬菜,显眼的地方都印着“澳大利亚生产”,有一些不是,也碰瓷似的写着“90%的原料来自澳大利亚”。麦当劳和 Burger King 的汉堡盒子上也特殊地写澳大利亚牛肉。哦对了,冷知识:澳大利亚的 Burger King 不叫 Burger King,叫 Hungry Jack’s。因为 Burger King 进驻澳洲市场的时候,已经有一家公司叫 Burger King 了。

住。相当的贵。定的酒店都在 1000 人民币一晚以上。到这里才意识到这趟旅行最贵的是酒店,机票反而是小 Case 了。但是听说房价相比于其他一线城市也不算贵,况且居民一般也不会选择住在市区,郊区就更便宜了。我们出 City(不是装逼,那里管市区就叫 City)看到过很多独栋的 House,看起来很漂亮,居住应该也很舒适。

行。习惯了在新加坡方便的公交系统,去到了广袤的澳大利亚,发现这里的公交系统乘坐起来很不方便。首先是线路少,乘坐巴士经常要走上个七八百米;其次是车次少,有的地方要等上半小时甚至一小时;最后是价格昂贵,我以为新加坡相比中国的公交已经很贵了,没想到澳大利亚更贵。

公交系统的数据上,整个新南威尔士州(悉尼所在的州),2023年10月有巴士 837 辆,而新加坡在 2020年就有大约 5800 辆巴士

看来,在澳大利亚生活,至少得有辆车。

说起坐车,遇到一件文化冲击的事。一天时间比较晚了,我们坐公交车回酒店。车上有一些看起来刚参加完 party 的青少年,他们比我们早下车,下车的时候,每一个人都说 “Thank you”。我之前从没见有人跟公交车司机说谢谢的,司机上班就是开车,开车载乘客不是天经地义吗?回到酒店之后躺在床上看了一下网友的说法,说在澳洲孩子就被教育说谢谢,虽然大部分的工作是领薪水提供服务的,但是这些工作人员依然帮助了你——超市收银员帮你把东西收了起来,司机安全地把你送到了目的地,服务员帮你点餐,等等。这些服务值得让我们表达谢意。

有趣的是,像新加坡这种人口极度密集的社会,反而没有这么多客套话,人们以效率为优先目标,只问必要的问题,然后马上服务下一个顾客。反而是在地广人稀的地方,人与人之间的关系更加密切一些。另一个表现是,在悉尼进到餐厅或者检票的时候,人们也会客套很多,都会问一下你今天怎么样?有一次买咖啡,服务员问我今天要去哪里,我说要去动物园,他的同事们就开始跟我说起他们喜欢的动物。

在悉尼我们参观了澳大利亚博物馆,教堂,监狱,皇家植物园,在城市里徒步(现在好想叫做 City Walk 了?),去了悉尼歌剧院,去邦迪海滩徒步,去了蓝山徒步,参观了悉尼大学,新南威尔士美术馆,等等。最有意思的是,还歪打正着去了议会,由于已经下班了,工作人员只给我们做了简单的介绍。晚上躺在酒店里还看了发生在议院里面的电视辩论。后来去墨尔本的时候,我们专门预约了议会导览参观,非常赞。

悉尼的旅行结束之后,我们坐一家本地的航空公司 JetStar 的飞机去往墨尔本。又遇见一件文化冲击的事情。JetStar 算是一家廉航,廉航的酒水是收费的(非廉航的酒精类饮料一般也是收费的)。我之前的飞行经历中,在飞机上买酒水的是少数人,大部分都不会在飞机上购买饮料,尤其是这种两个小时的短途飞行。可在悉尼飞墨尔本这架飞机上,推着餐车的空姐异常忙碌,我前面的人每一个人,小桌上都摆上了酒,要么是啤酒,要么是红酒,要不是看到他们刷卡,我都以为澳大利亚的飞机喝酒免费。如此真真切切体会到本地人的潇洒。

接下来是一些旅行片段。

先放地标建筑
在歌剧院附近,意外地碰到了邮轮起航。就是我们之前去坐过的那家
从酒店望出去的风景,虽然算是在 City 区域了,但是楼房普遍都不高。
在博物馆里看到奇奇怪怪的动物。袋鼠的蛋蛋是不是很可爱?袋鼠蛋蛋在澳大利亚是可以买到的纪念品。(好残忍)
免费参观一个悉尼的监狱。居然是这么先进的一个 ipod 和森海塞尔的耳机。导游程序做的非常赞。随着你走到一个地方,它会自动给你介绍周围的东西,模拟之前监狱的情景等等。
参观监狱。
监狱内部的样子
皇家植物园
参观新南威尔士州的议院
CBD 风景线
邦迪海滩徒步,太阳暴晒,风景很美。
去蓝山徒步,蓝山很美,视野辽阔,跟新加坡很不一样。
蓝山的景点,三姐妹峰
在一个港湾的桥上随手拍的一个小亭子

同事刚从悉尼回来,推荐我们这个蛋糕,于是按照 Google 去买。到了之后发现店面位置很小,排队的人也不多,尴尬的是,买了之后没地方吃。于是在旁边的一家咖啡店问店员,能否买两杯咖啡,在店里用我们外带的食物,店员爽朗的说完全没问题。并且称赞我们买的蛋糕很好看。

喝咖啡的时候,店员小姐站在店门口的街上,用比较前卫的方式在买咖啡,她拿着一个杯子,对路过人的大声说,不来杯咖啡吗?

漂亮的小蛋糕
在美术馆里面参与的一种很新颖的艺术——搓泥巴。

就写到这里吧,有空了再来写墨尔本篇,请期待!

 

iowait 的含义

iowait 是 CPU 的一种状态,表示此时 CPU 正处于 idle 状态,并且至少有一个进程正在等待 IO。

CPU 一共有四种状态。在任一时刻,CPU 的状态都是四种中的一种。这四种状态是:user, sys, idle iowait. 一般的程序,比如 sar top,会用百分比表示 CPU 分别处于这四种状态的时间,这四种状态相加的结果是 100%。

其实准确来说,CPU 只有两种状态:busy 和 idle。Busy 又分成了两种,user 和 system,可以表示 CPU 目前正在执行用户空间的代码,还是正在执行 kernel 空间的代码,方便开发者定位问题。Idle 又分成了两种:idle 和 iowait。笼统来说,idle 就是目前系统中没有 Runnable 的进程了(参考之前的博文:Linux 进程的生命周期),iowait 就是目前系统中没有 Runnable 进程(所以说 iowait 是 idle 的一种),并且,有进程卡在 IO 上。

(注意,本文说的“进程”是从资源调度的角度讲的,本文的语境中,进程包括线程)

统计的方式

Kernel 会定期更新 counter(AIX,CPU state counter 每个 clock interrrupt 更新,每 10ms 一个 interrupt)。

对于每次更新,检查 CPU 是否是 busy,如果是 busy,检查 CPU 在执行用户态还是内核态的代码,增加相应的计数器。如果不是 busy,那就是 idle,检查此 CPU 之前有没有发出 IO 操作,如果有,那么就增加 iowait,如果没有,那么就增加 idle 的计数器。(所以可以认为这个数值是抽样统计的方法?)

像 sar,top 这种展示工具,就去读 counter,计算时间段内的比例,展示结果。

举例说明含义

综上,假设 CPU state 出现了比较高的 iowait,那么就意味着:这个 CPU (在大部分时间)找不到可以执行的进程了,至少有一个进程在等待 IO。

iowait 只包括文件系统的 IO,不包括:sockets, pipes, ttys, select(), poll(), sleep(), pause()。

举例1: 一个机器有 4 个 CPU,1个CPU iowait 比较高,3 个 CPU user+sys 很高,iowait 很低。

意思是当前有 3 个 Runnable 的进程,有至少1个进程阻塞在 IO,其他的进程要么阻塞在 IO,要么阻塞在其他状态,但是不是 Runnable 状态,Runnable 状态的进程有且只有 3 个。因为如果再多来一个 Runnable,那么它就会被 iowait 高的那个 CPU 去执行,此 CPU 的 iowait 也不会很高了,user+sys 会变高。

举例2: 这个例子是参考资料 What exactly is “iowait”? 中的,非常典型。

假设有 6 个 CPU,而且只有 6 个进程:

  • 2个进程不涉及磁盘 IO 操作,只有 CPU 计算;
  • 4个进程要花 70% 的时间做 IO 操作,30% 的时间在 CPU 上计算,这 30% 中,5% 是在 kernel mode,25% 是在 user mode。

那么 CPU 利用率将会如下,最后一行是综合所有的 CPU 的数据:

现在,还是6个进程完全不变,但是 CPU 从6个减少到了4个,数据将会是如下:

可以看到,2个 100% 利用率的 CPU 保持不变,但是总的 CPU 的利用率是 80% 了。解释如下。

4个进程,每一个进程只要花 30% 的时间来计算,其他的时间是 iowait,iowait 是 idle 中的一种,iowait 的时候,如果能有别的事情可以做,CPU 就会去做别的事情。所以 2 个 CPU 每一个会花 60% 的时间做计算工作(一个进程是 25% + 5%,做完之后做下一个进程的 25% + 5%)。做完 60% 就无事可做了,剩下 40% 的 iowait(就是 idle)。

总结

iowait 是一种 idle,如果比例过高,它可以告诉我们几件事情:

  • 系统正在做的工作,大部分时间都是在等待 io 了,io 系统的性能不够高(也有可能是硬盘坏了);
  • CPU 没有更多的工作可以做了,我们可以给系统分配更多的计算工作;
  • 它不是 CPU 的一种“阻塞”状态,它不能说明:CPU 现在在等待 IO,无法运行其他进程。而是:没有可以运行的进程能给 CPU 做;

iowiat 是 CPU 角度的一个状态,它不是进程角度的状态。iowait 很低,不能代表进程没有卡在 IO 上。假设有一个进程需要花 70% 的时间做 io操作,把它放到一个空闲的,单 CPU 的系统中,显示的 iowait 是 70%,但是我在这个系统中增加一个不依赖 io 的计算任务,iowait 就变成 0 了。但是我们之前的那个进程,依然需要花 70% 的时间等待 io。所以,它不代表进程的状态。

参考内容:

  1. What exactly is “iowait”?
 

探测 TCP 乱序问题

TCP 协议是基于 IP 协议的。IP 协议不保证顺序,只能说尽力保证包的顺序。如果发生乱序,TCP 的性能就会下降很多。最近就遇到一个 TCP 下载速度很慢的问题,抓包分析发现有很多乱序的包。

网络发生了乱序,那就把锅甩给网络组的同事,但那不是我的风格。虽然我没有二层和三层设备的权限,无法排查哪里出了问题。但是我感觉我可以只从 TCP 的两端,探测出来乱序发生在哪一个节点上。

traceroute 的原理

traceroute 是一个很好的网络工具。之前在 mtr 的教程中也介绍过。

traceroute 的原理很精妙。它利用了 IP 协议本身的特性:每一个 IP 包都有一个 TTL 字段,表示这个包还能在网络中被转发多少次,每次路由器转发一个 IP 包就将其 -1,如果一个路由器发现 IP 包 -1 之后是 0 了,就直接丢弃,并且给 IP 包的 Source IP 发送一个 ICMP 包(包含此 hop 自己的 IP),说这个包气数已尽,无法送达目的地。

traceroute 原理

traceroute 想要知道去往另一个 IP,中间都会经过哪些 IP 节点。它发送一个 TTL=1 的 ping 包出去,包会挂在第一个 hop 上,第一个 hop 发回去 ICMP,traceroute 就知道了第一个 hop 的 IP 地址;它再发送一个 TTL=2 的 ping 包,就知道了第二个 hop 的 IP 地址…… 直到收到正确的 ping 响应,就算到头了。

mtr 类似于一个 traceroute + ping 的工具,还能告诉我们中间每一个 hop 的延迟。原理其实和 traceroute 是一样的,以下用 mtr 举例。

路由 path 的一致性问题

回到乱序的问题,最常见的问题是,中间某一跳到下一跳有多个节点可以选择。这时候,正确的情况下,对于 (src ip, src port, dst ip, dst port) 这样的四元组,应该固定走一条线路。就像 ECMP 的 hash 一样

ICMP Ping 没有端口的概念,但是对于 (src ip, dst ip),路线应该是一致的。即,我们在对某一个 IP mtr 的结果中,每一跳都应该只有一个唯一 IP。

mtr with ICMP, 每一跳都只有一个 IP

mtr 有 tcp traceroute 的功能,我用 tcpdump 看了下,原理和 traceroute 相同,只不过 IP 包的内容不是 ICMP 了,而是 TCP。路由器丢了 IP 包,不管里面是 TCP 还是 ICMP,都会发回来 ICMP 消息。于是 tcp traceroute,我们就可以用 tcp 包探测出来中间的转发节点。mtr 使用的 tcp 包是 syn 包,remote port 可以指定,但是 local port 每一个包都是随机选择的。这就导致,每一次发起探测,都是一个不同的四元组:(src ip, src port, dst ip, dst port) ,因为 src port 每次都在变,所以路径每次都是不一样的。这样的话相当于可以将路径中所有的路由设备 IP 都探测出来。

mtr with TCP, 每一跳可能有多个 IP

如图可以看出,一跳可能有多个 IP。

TCP multipath 探测

但是正确网络中的 TCP,如果 local port 也不变,那么相同的四元组,应该走同一条路,来尽量保持到达顺序和发送顺序一致。

利用这个原理,假设我们使用的 local port 一直保持不变,那么 TCP traceroute 的结果应该是,每一跳都只有一个 IP

mtr 没有提供固定 local ip 来 trace 的功能,我用 scapy 写了一个。

代码非常简单,就是发送 ttl 不同的包,然后检查收到的 ICMP 包。限制最多 20 次,如果 20 次还没到达终点就放弃。如果 reply 里面有 TCP 包,说明收到了正常的回复(即使是 RST 也算)。

另外,因为我们每次都用同一个 local port,所以不能用多线程,每次只能有一个探测存在。

实际测试发现,收到的 ICMP 响应并不是很稳定,有的时候 hop 4 丢了,有的时候 hop 5 丢了。可以使用一个 bash 循环多测试几次。

跑一段时间之后,我们可以查看这个日志文件,过滤掉错误的包 (??),然后排序之后,去重。理论上,每一跳都应该只有一个 IP 才对,如果有某一个 hop 出现了两个 IP,那说明就是出现了 multiple,会知道乱序。

如上输出,在 hop 5 出现了两个 IP,说明是 hop 4 到 hop 5 的时候出现了 multipath。

在得到了这个结果之后,去和网络组的同事做了确认。结果发现这个不是导致问题的根因。不过觉得挺有意思的,稍作记录一下。

小技巧:traceroute 只能测一个方向,有些情况下去的方向和回来的方向可能不是同一个路线。所以无论是 traceroute 还是 tcp traceroute,不妨从两端都试试。说不行会发现新的线索。

 

如何阅读火焰图

这篇文章是火焰图阅读的简明教程。

火焰图是我们用来分析性能的可视化工具。很多 profile 工具输出的信息都非常多,是一个巨大的文本,在这个文本中,找到性能瓶颈,会比较困难。但是如果画出来一张图,可以一下就看到问题所在。

火焰图是 Brendan Gregg 发明的。使用官方的工具 FlameGraph,可以将文本渲染成 svg。如下。

官方的 FlameGraph 渲染出来的 svg 截图

现在也会有其他的工具能渲染出来类似的图了,比如 golang 的 pprof 现在内置了一个新版的火焰图预览工具,在线的 speedscope 也可以渲染。我最喜欢的是 Flameshow,一个终端工具,可以直接在终端用字符渲染出来火焰图,设计的非常精妙。(其实就是我自己写的)。由于是我自己写的,那么下文我就以 Flameshow 来做展示的例子了。

Flameshow

阅读方法

火焰图作为一个可视化的工具,着重表达的信息是:父子之间的关系,每一个块的占比。

火焰图有从下向上的和从上向下的,本质是相同的,只是方块之间的关系方向不同。从上向下:下面的方块是上面的子块;从下向上:上面的方块是下面的子块。

主要信息有(以从上到下为例子):

  • 每一个方块,都是一个函数,方块的宽度,就表示函数消耗的时间占比。(如果是内存火焰图,那就表示的这个函数申请的内存占比。)所以我们看火焰图,主要去找最宽的一个方块。
  • 上下堆叠在一起的是表示函数调用。Y 轴表示调用的深度。

火焰图一般是支持交互式的,svg 和 flameshow 都支持点击其中一个 function,来放大。如下例子:

点击放大其中一个 function

标记的是,最开始调用的函数是 collector.NodeCollector.Collect.func1,然后这个函数的所有时间都在调用 collector.execute,以此类推。到下下面的 os.(*File).readdir,其中有一大部分是在调用函数 os.Lstat,然后其余的时间花在了 os.direntReclen

很多人对火焰图容易有一些误解,这里着重说明一下:

  • Y 轴的深度一般不是问题。我们用火焰图主要是排查性能问题,是要找消耗时间长的地方。调用深度很深,但是没花多久时间,一般不要紧;
  • 颜色(几乎)没有意义。不是说颜色越深时间越久。颜色只是为了区分出来不同的块而已。一般会将相同名字的函数都使用同一个颜色,这样,即使它们分散在不同的 stack 中,也能清晰看出总时间比较高。从 FlameGraph 的源代码也可以看出,颜色是根据 function 名字随机生成的。但是有一种优化:比如对于 Java 的 JVM 来说,可以用不同的红色表示 Java 代码消耗的时间,可以用黄色表示 Kernel 消耗的时间,用蓝色表示 JIT 时间。但是不同的红色,红色深浅,还是没有什么意义的。
  • 方块之间的顺序没有意义。因为火焰图的生成方式(后文介绍),和渲染方式(一般会将同名字的方块 merge 在一起,方便阅读),导致火焰图方块之间的顺序是没有意义的。不代表函数调用的顺序

火焰图的本质是旭日图(Sunburst Graph)

你有没有发现,主要表示占比,又能表示占比之间的关系,是不是跟某一种图很像?

使用 tokei-pie 渲染出来的旭日图

是的,其实火焰图的本质就是拉平了的旭日图。上图是我用 tokei-pie 渲染出来的代码仓库中不同文件夹、文件的行数占比。打开一个新的项目的时候可以轻松找到核心代码。

火焰图的生成和格式

火焰图的生成主要依赖 profile 工具,目前很多工具都支持了,比如 py-spy, golang 的 pprof.

生成的原理大致是去扫描程序的内存,主要是内存的 stack 部分,对 stack 做一个快照。如果扫描了 10 次,其中 function1 出现了 3 次,function2 出现了 6 次。那么它们的宽度占比就是 1:2. 很多 profile 工具就是如此工作的,不是 100% 精确的,但足以让我们分析性能问题了。

生成的格式一般是 stackcollapse 格式,这是官方的一种定义。比如如下的文本:

每一行就代表一个 stack,数字代表整个 stack 的占比。我们要把所有的 stack 相同层级相同名字的 merge 起来,最后就变成下面这样:

简单的 stackcollapse

另一种常见的格式是 pprof 的格式。虽然是 golang 最先开始用的,但是设计的(我个人认为)比较好,也是开源的,protobuf 定义,所以很多工具也支持输出这种格式了。

Continuous Profiling

持续 Profiling 也是我比较感兴趣的一个领域,很多 APM 工具都已经支持了。比如 DatadogGrafana。简单来说,就是不断地对线上部分实例进行 Profile,然后对结果不是简单的展示,而是收集起来。将它们的 stack 都合并起来,做成一个由多个实例的 stack 组成的 Flame Graph,就可以找到集群层面的性能热点了。

另外一个用处是,在发布新版本的时候,可以在灰度的时候,检查新版本的 Flame Graph 和之前的,看有没有引入新的性能热点。

相关链接

  1. https://www.brendangregg.com/flamegraphs.html
  2. https://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html
  3. https://queue.acm.org/detail.cfm?id=2927301
  4. https://youtu.be/6uKZXIwd6M0
  5. https://youtu.be/6uKZXIwd6M0
  6. https://www.webperf.tips/tip/understanding-flamegraphs/
  7. https://github.com/jlfwong/speedscope/wiki
  8. https://www.speedscope.app/