端上日志系统非常重要,对于用户侧的异常、排障、动线、行为等很多重要数据,都可以通过端上日志来做检索。如何搭建一套准确、高性能的完备日志 SDK 就显得尤为重要。 (另一个重要的排障信息源是埋点,通过埋点可以获取更精准的用户动线。后面有时间做一下埋点数据化方面的总结)。
移动端日志系统,将承载 Native、h5、动态化等多技术栈环境下的日志收口工作,同时要兼顾日志不丢不乱和高性能,其实还是有不少挑战的。
这一方面 CocoaLumberjack 其实已经做的很好,很多公司都用它作为自己的日志系统的基础框架。但它还不能作为大型 app 的流量日志收口系统。因为流量大了以后,少量的日志丢失也会带来很大的缺口,而性能方面它也有很多短板。
mmap 可以在 IO 性能方面有显著的提升,也就是后端比较通用的零拷贝技术。在移动端上 FastImageCache 对 mmap 有较深的应用,但它业务绑定太强,一般无法直接使用,更多的是学习 mmap 的落地。

本文会对日志系统的一些完备要素做一些说明,并特别讲解下 CocoaLumberjackFastImageCache 两个技术库。

  • 日志是否全量。很多业务开发同学不使用日志 SDK 做日志输出,可能使用系统日志做打印,这一部分日志是否需要做收口,需要权衡一下。
  • 分等级和模块。分 Level 和 modules 进行记录和检索,可以提供问题排查速度。这方面有专业的 Debug/Info/Error 等标准。技术上比较好实现。
  • 性能。主要是卡顿和耗电。日志系统会底层基础架构,大流量的打入,会频繁的内存释放、I/O,过多的占用 CPU 会导致卡顿和耗电,也会影响拖延上层业务异步代码的执行时机。
  • 数据不丢不乱。没有办法做到完全的不丢日志,只能尽可能少的减少。在 crash / CPU 繁忙 / 压缩加密严重耗时拖延队列等异常场景,这方面问题尤其突出。不乱就需要增加串型队列或者锁,这些同步机制都需要保障阻塞和性能。
  • 实时观测。开发和测试同学需要能够实时看到日志打印情况,这在开发和提测阶段非常有用。
  • 压缩 + 加密。压缩和加密都是耗时操作,对 CPU 的压力比较大。
  • 上报。得有回捞机制,得保障数据传输安全。
  • 后端系统。前置的采集完成后,后端系统的数据化检索、数据可视化等工作都是重中之重。
  • 隐私安全。这一块国内所有厂商都极度匮乏。大厂的开发同学也可以随意捞取用户日志,异常日志在内部系统可以随意传播。如果有这方面的诉求,那么整套安全体系都需要建立起来。

数字签名可以解决数据安全里面的完整性身份认证不可否认三大特性,但是解决不了机密性问题。机密性需要通过对称密钥 / 公私钥解决,所以数字签名其实和加解密 / 密文 / 机密性这些在概念上非一个层次。
签名的本质不在于加解密,而是加验签。
数字签名,定义上是拿着私钥的一方,通过私钥 X 对消息 M 进行加密 (加签),生成签名 N,并把消息 M 和签名 N 一起给出去。拿着公钥的一方,用公钥 Y 对签名 N 进行解密 (验签) 生成 M’。用消息 M 和 M’ 做比较,如果相等,则数据没有被篡改。如果不想等,则数据不再安全
对于公私钥,我们一般是使用公钥加密私钥解密,这样可以保障单向数据机密性。而私钥加密公钥解密是解决不了机密性问题的,如果要通过公私钥完全解决数据机密性,则需要双向认证。
数字签名就使用了私钥加密公钥解密这套方案,所以数字签名是没有密文 / 机密性可言的。在数据签名里,一般把私钥加密叫做加签,公钥解密叫做验签

时间流的实在是太快了,又是白劳的一年。也不忍回首,也不堪展望。站在年尾的节点,四处都是狼藉。
工作上没有大的建树,生活上没有啥起色。好像什么都不做,也应该是现在这样子。但今年实在太累了,在工作和生活上都投入了巨大的心血,也正因如此,越发感觉到徒劳。

在两个月前写《三年疫情五味杂陈》的时候,就是要放开了,所以当时想着写一篇,对疫情三年稍作记录,毕竟是一个时代的拐点。
那片文章过后半个月,就开始有放开的动作了,部分城市已经松动,我还给被隔离的小伙伴留言,说赶上了最后一波封控。

只是没想到,这个国家干啥都是一根筋。我以为这么大的人口,怎么也是省级别的逐步放开,没想到是全国一下子放开。赌气呢吧,一下子就放开了。

想起了一个老问题:浏览器按下回车的时候,后续流程是怎么变化的。
这个问题非常精妙,基本上把网络问题一次打包了。
对相关知识面了解越多的人,能说的内容也越多。越资深的人,能说的时间也越长。
我对网络也一直感兴趣,索性这次就做了大图,越做就盘子越大耗时越多,每个点都可以延伸一个举足轻重的行业。

浏览器按下回车键后,发生了太多太多事情,我文字理下图中写不下的重点,详细看下面大图。大图下载地址

DNS

  1. 重点是时机。DNS 查询是为了域名和 IP 映射,所以它的时机非常非常靠前,是所有网络活动的第一步。
  2. 发挥大作用的是负载均衡。
  3. 误解最大的是根 DNS。有镜像 DNS 在,不要拿封锁大陆域名后会怎么怎么样来做文章,技术同学说这话是要丢人的。如果这么做,我能想到的最大影响就是:大陆主动拒绝外界网络,外界都不愿意打开大陆访问,其实都是自由的选择。
  4. httpDNS 可以解决 DNS 污染和劫持问题,还有运营商偷懒导致的跨网非最近节点不准确问题,加快域名和 ip 的映射。一般只用在移动端,技术方案是 hook gethostbyname api 这个环节。别想着请求前把域名换成 ip,坑很多,尤其是 TLS 证书验证的时候。

Socket 套接字

  1. 网络通信的基石,只要是网络通信,这就是绕不开的大山,这就是中流砥柱。
  2. socket 的核心在于 socket 描述符和发送接收缓冲区。发送接收缓冲区不是 socket 特有的,是计算机基础的一部分,我们使用终端的时候,输入指令和参数的时候都在使用这套缓冲区。
  3. 大名鼎鼎的三次握手就在 socket 建联的时候发生的。成也萧何败也萧何,因为 socket 是内嵌计算机的底层服务,也包括 TCP。所以即使三次握手已经拖慢了互联网这么多年,但依旧无法做升级。Quic 的出现就是忍不了 socket tcp 的队头阻塞而破釜沉舟的东西。
  4. socket tcp 的详细过程,可查阅之前文章:TCP 数据传输过程分析
  5. 谈 socket 离不开端口,谈端口离不开进程。可查阅之前文章:Shell 和进程 - 两种进程创建方式
  6. socket 本身可查阅之前文章:IM 和 Socket 的关系及 Heart 的必要性

update:2022.10.29 昨天听说开始有解封迹象了,今天我收到了运营商发出的 “奥密克戎感染后的身体事项” 的说明短信。能收到这样的短信,就是一叶落知天下秋,看样子是要逐步解封了,应该会在一两年内全部解封。不好的消息是:没有听说 ICU、医疗、特效药、病房有做准备,即使逐渐放开,这些必要的医疗准备工作也要提前半年到一年就要开展起来的。目前看是打算逐渐解封 + 硬扛,要带走不少老年人了。老年人得注意。

COVID-19,从 2019 年可能在 10 - 11 月初步感染人体,到 12 月底被媒体曝光,再到现在,已经 3 年了。

这三年发生了太多太多事情,刻骨铭心的不计其数。我开始以为以前也是有很多很多事情,只是我没有关注。后来想想,或许就是这几年,发生的重大事情比较多。因为疫情和国际局势,中华人民坎坷的这几年。
金字塔的每个层级每个人都受到了很大影响,所有影响最终都会归到生活和金钱,质量总归是下降了不少。
也有很多人说没有受到影响,甚至蒸蒸日上,有些是身不由己,有些是笃信不疑。差异也都能理解,毕竟各种原因,真的是各种原因,不想再去细究,意义不大。

简单回忆下三年疫情,因为不知道什么时候才会结束,就当作是对个人疫情的期中总结。

我应该是最早一批知道武汉有疫情的人,当时只知道有人被感染,还没联想到非典这些传染病。当时有些朦朦胧胧,也有些对未知的恐惧。当时也快过年了,还有不少同学的婚场。
再过了几天,听到疫情严重了不少。已经记不清是在李文亮之前还是之后了。
我和亲人说过年可能回不去了,这次病毒没有媒体报道的那么简单,感染会很严重。过年人流大,火车站这些场所风险比较大。亲人说就是非典一样吧,开车应该好些。最后我们开车回去,老家过了三天赶着高速封路前回到了居住地。我姥姥说这就是古代的 “瘟疫 / 人瘟” 吧,好久没有听到这个词了,但很赞同。
我大学同学的婚礼是过年前段时间。我之前已经答应了我和老婆都会到场了,但是婚礼前我还是和同学说了抱歉,我说肺炎(那是还不叫 covid 或者疫情,只叫做武汉肺炎)不简单,火车站有风险,到场计划得取消了。

之前写有提高效率的手艺这些年我的软件清单两个推荐,一个用来提高文字编辑的效率,一个推荐了手机和电脑可以安装的一些高效率的软件。
这次推荐一些日常生活的避坑指北。生活还有几十年,掉坑在所难免,所以这篇推荐清单打算做长期更新。

指北概要

  • 日常物品避免线下消费,可以线下试用。线下的售后保障和价格上都比不上国内线上。
  • 不要担心购物资损,电商平台都有 7 天无理由退货。有些人已经有了线下消费阴影,不敢退换货了。其实就是手机点下退货,接一下快递员上门电话的事情。
  • 同一个系列,在价格承受范围内可以选贵一点的。也许多花了一点没意义的钱,也许底线就在那个便宜和贵中间。别想着讨巧,便宜是有原因的,商人从来不吃亏。
  • 买东西前多了解下要买的东西,包括组成、作用或者配置等,花不了多少时间。别瞎几把乱买,比如震动去脂、啥离子之类的,不主动了解就得做好被动收割的准备。平台的评价系统真假参半,但也是避雷的最好途径。
  • 对于想买的贵重物品,延迟一周后再决定下不下手。不缺那一周的时间,但钱是真金白银。
  • 对国产保持警惕,尤其是贴近皮肤和肠道的物品。
  • 拼多多的百亿补贴挺香,比其他知名平台要便宜不少。百亿补贴里面的海淘也非常好用,东西不多,都是实用系列。

洗漱

  • 男士洗面奶 - UNO(拼多多海淘 ¥15 一支,130g)
  • 牙膏 - 狮王 white&white,不要买国产那款,买产地日本的(拼多多海淘 ¥8-11 一个,天猫海淘 ¥15,150g)
  • 儿童洗手液 - 日本狮王泡沫式(拼多多海淘 ¥20-25,500ml)
  • 护发素 - Fino(又称红宝石,拼多多海淘 ¥30-40 一罐,230g)
  • 牙线 - 刚需,一定要用。不用一下都不会知道牙缝有多脏。
  • 抽纸 - 清风,金色外包装款
  • 剃须刀 - 吉列锋隐手动版。如果胡子比较茂盛,那可以把剃须当作生活的一部分。建议不要用电动的,虽然方便,但没有剃须的快乐。(要配合剃须泡,洗澡的时候胡子会变软,是动刀的好时机。剃须膏体感非常差。)
  • 水杯水壶 - 买好一些的自己喜欢一些的。自己喜欢的,就是可以多喝一些水。多喝水非常重要。
  • 浴巾 - 毛巾给身子擦水,又慢又累。洗澡后用浴巾两下子就擦干净了,省事。省的时间干其他的事不也很香么。

曾经有位老师问过:在 Linux 的 Shell 中运行程序时,操作系统是怎样对程序进行处理的吗?
我当时回复是这样的:操作系统对 Shell 的执行,是靠 Shell 解释器完成的。在操作系统运行后,Shell 解释器本身就加载并运行了。其中如 pwd,cd 这些是内部命令,本质是函数调用,可以直接使用。ls 这些是外部命令,需要 fork 一个新进程执行当前命令。一个 Shell 脚本,有很多个这些内外部命令组成,通过 Shell 解释器逐行解释完毕后执行。Shell 解释器也是一个应用程序,本质是一个 C 程序,不过在该程序中,手动模拟了函数调用栈,和 JVM 有相似之处。所以 Shell 解释器,也有静态库 / 动态库 / 静态链接 / 动态链接这些,为 Shell 命令的执行保障护航。
现在看起来,当时的回复虽然没有大的问题,但还是不够。只是浅表的认知了 Shell 解释器的用途,但是对 Shell 并没有深刻的理解。
最近看到子 Shell (SubShell),发现 Shell 和进程之间的关系非常密切。可以从进程的角度来理解操作系统是怎么运行 Shell 的
这篇文章的目的,是让你只关心 Shell 脚本的语法,而其他细节,都变成顺理成章。其实各个高级语言也都是这样,语言本身其实并不难,像工具一样使用而已。

一年前写了 “段页内存管理” 的部分章节,后面一直搁置在草稿箱中。最近发现内存相关的知识非常重要,最近几十年科技文明的巅峰,硬件侧就是 CPU,软件侧就围绕着操作系统对内存的控制了。就又整理补齐,形成内存分段分页较完整说明。
硬件 CPU 的不断革新,从 X86 和 ARM 架构的铺天盖地,到 RISC-V 新星崛起和 MIPS 的消退。还有各种流水线优化、APU-ZPU 的推成出新,以及 Apple M1 的展露头脚。虽然 CPU 本身短时间内看不到跨越式的提升,但 CPU 周边是玩出了花。
而已经趋于稳定的操作系统,最近好多年都没有啥惊世骇俗的壮举出现。依托着 CPU 侧的大腿,操作系统躺着进行升级。但换一个角度,也可以认为操作系统已经设计的足够完备,在商业化的时代,有需求就一定会有满足,或许对于当前操作系统来说,目前的设计应对有余。
操作系统的很多设计,都摆脱不了内存这尊大神。首先,操作系统本身和上层应用,就是放在内存里运行的。其次,操作系统的基石进程和线程,就贴着内存进行设计。多核心后的 L0-2 级缓存同步也是为内存定制,当然这个算 CPU 对内存的依赖。IO / 文件系统 / 网络也都离不开内存的影子。
内存本身的制作工艺门槛不高,有 N 多厂商做这个事情。但内存在科技长河中的位置,绝对举足轻重。整个计算机的发展史,内存表现不多,但是中流砥柱。
本文可以顺带解决如下几个问题:

  • 地址总线、数据总线、控制总线是什么?CPU 如何通过地址总线找到内存地址?
  • CPU 和内存之间的高速缓存引发的缓存一致性问题是怎么回事?锁 - 共享数据安全指↑
  • 16 位 CPU 是如何操作 1M 内存空间的 (2^16=64kb)?32 位 CPU 是如何操作 64G 内存空间的 (2^32=4G)?他们的原理一样吗?
  • 分段内存管理,里面的段指的是什么?
  • 除了虚拟地址、物理地址,还有线性地址和逻辑地址,它们是什么?
  • 两个进程的虚拟地址相同,是如何指向不同的物理地址的?虚拟地址的页目录 & 页偏移均一致,如何通过 m = f(n) 函数,以相同的 n 输入,返回不同的 m 输出。

推荐书:《汇编语言》- 王爽、《程序员的自我修养 - 链接装载与库》- 俞甲子
推荐网文:《深入浅出计算机组成原理》- 徐文浩、《操作系统实战》-LMOS、
一定要读的另一篇内存文章:锁 - 共享数据安全指↑
内存相关的知识非常重要,需要很大篇幅和示例图来阐述。在锁 - 共享数据安全指↑中文字数超过了 4W,本文的文字数也超过了 1W,均需要多张配图。重要性和难理解程度,都很高。

又一年中秋过去了,时间过的真快!中秋节的几天假,我是算着日子过的。准确来说,近几个月的节假日,我都是计算着过去了几个小时又过去了几天。我艰难的珍惜着时间,算计着时间的流逝,心里压力很大,劳累无穷。
因为有件事情需要落地,只有节假日这些非工作的时间才能够静下心来忙碌。最近又拖延症犯了,心里总想着那件没落地的事情,大山越压越重,就非常疲惫。
这次的中长期计划和预期差距较大,我也做了复盘,发现有很多需要注意的点值得记录。可以为大大小小的耗时耗力又重要的计划摆正方向。

健康 / 心情 / 拖延症 / 拥抱变化 / 分轻重 / 专心做好一件事 / 拆解计划 / 被计划推着前进

健康

健康非常重要,感觉身体跟不上了,那锻炼的时间就是立刻马上,就不要管那些还没有完成的事项了。
因为身体非常重要,而锻炼事项通常耗时较短,这就是第一优先级。那些未完成的事项可能动不动就是几小时或者几天,相比来说可以拖一拖。
睡眠时间,一定要分配好。靠脑子吃饭的人,不要吝啬自己的睡眠时间。这里不是说不要熬夜晚睡,是要保障睡眠时间。
睡眠不足大脑不在状态,绝对非常耽误事。思考能力下降会带来各种问题,扣着点时间不值得。

0%