Jul 6, 2019 - 记一次 Java 服务性能优化

7955 Word Count

背景 前段时间我们的服务遇到了性能瓶颈,由于前期需求太急没有注意这方面的优化,到了要还技术债的时候就非常痛苦了。 在很低的 QPS 压力下服务器 load 就能达到 10-20,CPU 使用率 60% 以上,而且在每次流量峰值时接口都会大量报错,虽然使用了服务熔断框架 Hystrix,但熔断后服务却迟迟不能恢复。每次变更上线更是提心吊胆,担心会成为压死骆驼的最后一根稻草,导致服务雪崩。 在需求终于缓下来后,leader 给我们定下目标,限我们在两周内把服务性能问题彻底解决。近两周的排查和梳理中,发现并解决了多个性能瓶颈,修改了系统熔断方案,最终实现了服务能处理的 QPS 翻倍,能...

Jun 18, 2019 - 从 Spring 的环境到 Spring Cloud 的配置

6783 Word Count

需求 不知不觉,web 开发已经进入 “微服务”、”分布式” 的时代,致力于提供通用 Java 开发解决方案的 Spring 自然不甘人后,提出了 Spring Cloud 来扩大 Spring 在微服务方面的影响,也取得了市场的认可,在我们的业务中也有应用。 前些天,我在一个需求中也遇到了 spring cloud 的相关问题。我们在用的是 Spring Cloud 的 config 模块,它是用来支持分布式配置的,原来单机配置在使用了 Spring Cloud 之后,可以支持第三方存储配置和配置的动态修改和重新加载,自己在业务代码里实现配置的重新加载,Spring Cloud 将...

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 写简单的服务器时,也追根究底了解了更多的系统底层知识。多亏了这些知识,让我对应用层的知识更有掌控感,也在上次排查问题时(从应用到内核查接口超...