May 18, 2019 - Git 如何优雅地回退代码

3809 Word Count

前言 从接触编程就开始使用 Git 进行代码管理,先是自己玩 Github,又在工作中使用 Gitlab,虽然使用时间挺长,可是也只进行一些常用操作,如推拉代码、提交、合并等,更复杂的操作没有使用过,看过的教程也逐渐淡忘了,有些对不起 Linus 大神。 出来混总是要还的,前些天就遇到了 Git 里一种十分糟心的场景,并为之前没有深入理解 Git 命令付出了一下午时间的代价。 先介绍一下这种场景,我们一个项目从 N 版本升到 A 版本时引入了另一项目的 jar 包,又陆续发布了 B、C 版本,但在 C 版本后忽然发现了 A 版本引入的 jar 包有极大的性能问题,B、C 版本都是基...

Apr 13, 2019 - 应用调试工具-火焰图

3834 Word Count

前言 工具的进化一直是人类生产力进步的标志,合理使用工具能大大提高我们的工作效率,遇到问题时,合理使用工具更能加快问题排查的进度。这也是我为什么非常喜欢 shell 的原因,它丰富的命令行工具集加管道特性处理起文本数据集来真的精准而优雅,让人迷醉。 但很多时候文本的表现力非常有限,可以说匮乏,表达绝对值时,自然是无往不利,但在展示相对值时,就有些捉襟见肘了,就更不用说多维数据了。我们用 shell 可以非常快速地查询出文本内的累加值、最大值等,但一遇到两组值的相关性分析时,就束手无策了。这个时候,就需要使用另一种分析工具 – 图了,如散点图就能很清晰地展示相关性。 今天就准备介绍一...

Jan 12, 2019 - 迷人的算法-排列组合

5812 Word Count

需求 最近工作中碰到一个需求:我们的数据表有多个维度,任意多个维度组合后进行 group by 可能会产生一些”奇妙”的反应,由于不确定怎么组合,就需要将所有的组合都列出来进行尝试。 抽象一下就是从一个集合中取出任意元素,形成唯一的组合。如 [a,b,c] 可组合为 [a]、[b]、[c]、[ab]、[bc]、[ac]、[abc]。 要求如下: 组合内的元素数大于 0 小于等于 数组大小; 组合内不能有重复元素,如 [aab] 是不符合要求的组合; 组合内元素的位置随意,即 [ab] 和 [ba] 视为同一种组合; 看到这里,就应该想到高中所学习的排列组合了,同...

Jan 5, 2019 - 2018 年度代码报告

2800 Word Count

昨天网易云音乐、B站等 APP 都放出了用户的 2018 年度使用报告,在朋友圈掀起了一股年度报告的热潮,我昨天在刷微博时看到”精分君”分享的《年度骂人报告》后,在被笑得眼泪都出来的同时,也在想我是不是也可以出一个《年度代码报告》呢? 转载随意,文章会持续修订,请注明来源地址:https://zhenbianshu.github.io 。 收集信息 得益于今年工作的稳定,所有本地代码仓库都老实地放在各个 jetBean 软件目录下,而且代码版本控制工具上,工作用 Gitlab,业余用 Github,都属于 git 系列,所有的提交记录都可以从 git log 里查询到,极大地方便了...

Dec 22, 2018 - 使用 shell 在多服务器上批量操作

3469 Word Count

需求 日常工作中,我们常需要同时在多台服务器上执行同样的命令,如对比日志、检查服务等。这就需要我们有服务器批量操作的能力。 两年前写过一篇文章,shell实现SSH自动登陆 使用 shell 的 expect 命令进行 ssh 登陆,这种方式的灵活性确实非常高,但实现起来比较麻烦,而且单进程阻塞的特性也是它的硬伤,如果使用它进行批量操作,就需要启动多个 expect 进程,涉及到各个进程和主进程的双向通信,处理起来非常麻烦。 不过我们可以借用 ssh 公钥登陆 的能力,方便地实现在多个服务器上批量执行命令。 转载随意,文章会持续修订,请注明来源地址:https://zhenbia...

Dec 15, 2018 - 谈谈 TCP 的 TIME_WAIT

2931 Word Count

由来 最近有同事在用 ab 进行服务压测,到 QPS 瓶颈后怀疑是起压机的问题,来跟我借测试机,于是我就趁机分析了一波起压机可能成为压测瓶颈的可能,除了网络 I/O、机器性能外,还考虑到了网络协议的问题。 当然本文的主角并不是压测,后来分析证明同事果然还是想多了,瓶颈是在服务端。 分析起压机瓶颈的过程中,对于 TCP TIME_WAIT 状态的一个猜想引起了我的兴趣。由于之前排查问题时,简单地接触过这个状态,但并未深入了解,于是决定抽时间分析一下,拆解一下我的猜想。 转载随意,文章会持续修订,请注明来源地址:https://zhenbianshu.github.io 。 TCP...

Dec 1, 2018 - 一次 Java 内存泄漏的排查

3956 Word Count

由来 前些日子小组内安排值班,轮流看顾我们的服务,主要做一些报警邮件处理、Bug 排查、运营 issue 处理的事。工作日还好,无论干什么都要上班的,若是轮到周末,那这一天算是毁了。 不知道是公司网络广了就这样还是网络运维组不给力,网络总有问题,不是这边交换机脱网了就是那边路由器坏了,还偶发地各种超时,而我们灵敏地服务探测服务总能准确地抓住偶现的小问题,给美好的工作加点料。好几次值班组的小伙伴们一起吐槽,商量着怎么避过服务保活机制,偷偷停了探测服务而不让人发现(虽然也并不敢)。 前些天我就在周末处理了一次探测服务的锅。 转载随意,文章会持续修订,请注明来源地址:https://z...

Nov 24, 2018 - 理解 Linux 的虚拟内存

3950 Word Count

前言 前不久组内又有一次我比较期待的分享:”Linux 的虚拟内存”。是某天晚上加班时,我们讨论虚拟内存的概念时,leader 发现几位同事对虚拟内存认识不清后,特意给这位同学挑选的主题(笑)。 我之前了解一些操作系统的概念,主要是毕业后对自己大学四年的荒废比较懊恼,觉得自己有些对不起计算机专业出身,于是在工作之余抽出时间看了哈工大在网易云课堂的操作系统公开课,自己也读了一本讲操作系统比较浅的书 《Linux内核设计与实现》,而且去年自己用 C 写简单的服务器时,也追根究底了解了更多的系统底层知识。多亏了这些知识,让我对应用层的知识更有掌控感,也在上次排查问题时(从应用到内核查接口超...

Nov 10, 2018 - Java 动态字节码技术

8159 Word Count

对 Debug 的好奇 初学 Java 时,我对 IDEA 的 Debug 非常好奇,不止是它能查看断点的上下文环境,更神奇的是我可以在断点处使用它的 Evaluate 功能直接执行某些命令,进行一些计算或改变当前变量。 刚开始语法不熟经常写错代码,重新打包部署一次代码耗时很长,我就直接面向 Debug 开发。在要编写的方法开始处打一个断点,在 Evaluate 框内一次次地执行方法函数不停地调整代码,没问题后再将代码复制出来放到 IDEA 里,再进行下一个方法的编写,这样就跟写 PHP 类似的解释性语言一样,写完即执行,非常方便。 但 Java 是静态语言,运行之前是要先进...

Oct 20, 2018 - 从应用到内核查接口超时(下)

4832 Word Count

再启 接上文 从应用到内核查接口超时(中),查到是因为 journal 导致 write 系统调用被阻塞进而导致超时后,总感觉证据还不够充分,没有一个完美的交待。而且 leader 还想着让我把问题排查过程分享给同事们,这让我更加不安,担心搞错了方向。 在以往的博客中,我的问题结论总是确定的,如果是推论的话,我会显式注明。现在的情况让我有点犯难,推论说出去担心误导了别人,而内核层的事,我只知道基本理论,有关此问题的结论还没有。 于是,我只好再次踏上查这个问题的征程。 转载随意,文章会持续修订,请注明来源地址:https://zhenbianshu.github.io 。 打印...