Whosbug项目日志3
前言 今年是whosbug持续推进的第三个年头,经过2022届mini项目同学们的努力,whosbug在CI插件/webservice性能、责任人归属算法等方面取得了长足的进展,同时也积极推动了对whosbug可观测性监控系统、文档和系统测试的建设 CI插件优化 老版本的CI插件在对大型项目进行静态语法解析时仍有耗时过长的情况,很大一部分的耗时用在了git diff解析,针对这一性能瓶颈进行了优化 优化前 优化后 系统测试 whosbug的系统测试需要大量的测试用例,且测试用例主要来源于 github 大型开源项目的 issue,需要找那些提供堆栈,且合入修复的 issue(合入修复者作为 target_owner),在优化工作进行时我们也持续的在收集测试用例 web service重构 从技术栈一致性出发,基于 Golang gin 框架重构了 whosbug web-service,保证 web-service 的性能,同时完善了相关文档及接口测试用例 责任人归属算法优化 当前的责任人归属算法有两个版本,一个是基于项目语法树的完整版本,一个是基于定义链的 ...
Golang-optimization「2」: 字符串
前言 本系列的第二个部分,本文来谈谈程序员们喜闻乐见的string在Golang中有哪些值得注意的优化点 需要了解的词 string interning 一种在内存中仅存储每个唯一字符串的一个副本的技术 unsafe.Pointer Golang为“大胆的”程序员提供的更直接操作内存的方式,unsafe.Pointer是一种特殊意义的指针(通用指针),它可以包含任意类型的地址,有点类似于C语言里的void*指针,全能型的;在Golang中是用于各种指针相互转换的桥梁 选择合适的字符串拼接方式 首先来看看老生常谈的字符串拼接在 Golang 中的表现,这里我们主要看以下几个字符串拼接方法:fmt.Sprintf, +, strings.Join, bytes.Buffer, strings.Builder 实现一下单元测试: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455package testimport ( &quo ...
API慢请求问题排查记录「1」
前言 记录一次线上出现的API请求偶现严重慢请求的问题解决过程 需要了解的词 keep-alive HTTP keep-alive,又称为HTTP持久连接(HTTP persistent connection)或HTTP连接复用(HTTP connection reuse),指使用同一个TCP连接来发送和接收多个HTTP请求/应答,而不是为每一个新的请求/应答打开新的连接的方法 较少的CPU和内存的使用(由于同时打开的连接的减少了) 允许请求和应答的HTTP管线化 降低拥塞控制 (TCP连接减少了) 减少了后续请求的延迟(无需再进行握手) 报告错误无需关闭TCP连接 gomonkey 通过更改汇编机器码的方式在golang中实现monkey patch,原理可见这篇文章 现象 具体现象为在前端页面中的前几次API请求中,大概率出现一次慢请求(4s左右) 通过Apifox进行接口压力测试也能轻易复现问题,且在一轮3600次的请求中,慢请求基本只出现在前几次请求中 排查思路 整体思路为先由API服务从请求尾端向前查,同步可从客户端往后查 监控 首先看一看经过初步的接口 ...
Linux踩坑日记-No such file or directory
前言 近日在添加一个镜像内依赖时,出现了令人非常困惑的现象: 明明依赖文件(an excutable binary)是存在的,但执行却无法找到文件;这篇文章就来记录一下这个问题的解决过程 需要了解的词 32-bit & 64-bit 一般指CPU能处理的最大位数,64位的软件不能在32位的机器上运行,而64位的系统一般这两种类型的都支持 解决过程 确认系统位数及依赖binary的位数 使用uname -a查看系统位数 可以看到x86_64,64位系统 再查看依赖binary的位数,使用file命令(file命令会输出一个二进制文件的详细信息) 可以看到也是x86-64,64位的excutable binary 到这里可以排除位数不兼容的问题,并且只要安装了ia32-libs依赖或是更细粒度的libc6-i386(GNU C Library: 32-bit shared libraries for AMD64),就可以在64位系统(Ubuntu)上运行32位软件了 确认是否缺少依赖 使用ldd <file-name>命令可以检查是否有任何not f ...
Golang-optimization「1」: 数组和切片
前言 本系列的第一个部分,本文就来谈谈日常开发中几乎是最常用的,且在 Golang 中又有一定特殊性的数组和切片中有哪些值得注意的优化点 数组和切片的具体实现 首先我们来谈一谈数组和切片的具体实现 Go 的切片(slice)是在数组(array)之上的抽象数据类型,数组类型定义了长度和元素类型,数组变量属于值类型(value type),因此当一个数组变量被赋值或者传递时,实际上会复制整个数组 由于数组固定长度,缺少灵活性,我们在大部分场景下会选择使用基于数组构建的功能更强大,使用更便利的切片类型 切片使用字面量初始化时和数组很像,但是不需要指定长度: 1languages := []string{"Go", "Python", "C"} 或者使用内置函数 make 进行初始化,make 的函数定义如下: 1func make([]T, len, cap) []T 第一个参数是 []T,T 即元素类型,第二个参数是长度 len,即初始化的切片拥有多少个元素,第三个参数是容量 cap,容量是可选参数,默认 ...
Golang-optimization「0」: 序章
前言 从实习到正式工作,我使用 Golang 作为主力编程语言也已经有两年多的时间了;绝大多数的服务和需求我都会选择使用 Golang 实现,只有对性能不敏感、需要大量文本处理 / 数据处理的场景下我才会选择我的老相好 Python Golang是一门简单的语言,最为大家所推崇的莫过于 Go 的并发,协程加信道,sync 加 select,我觉得很难再有那么一门语言,并发能够做得像 Go 一样简单;其开发者团队一直秉承着“大道至简”的设计理念,但那些存在于各个角落的“简单”特性也让实际使用者们又爱又恨 这两年是我吸收知识最快的一段时间,加上工作上的忙碌,以至于我攒下了许多“要写的文章”,偶尔发出来的文章也是零零散散的一些知识点。我还是希望自己能够希望能够将这些知识真正的体系化起来,不断地完善,而不是仅仅讲零散的知识点打上 tag 那么这个系列我们就来聊一聊我们在Golang日常开发中就可以直接用到的一些简单的性能优化 需要了解的词 L1, L2, L3缓存 L1, L2, L3缓存都是计算机中的高速缓存,是计算机中的快速存储器,它们保存着CPU经常使用的数据,具体区别如下图: ...
Git 进阶使用1
前言 Git 作为全球软件开发者的标配代码管理工具,是程序员离不开的日常伙伴,除了基本的几条命令外,git其实还有很多日常会用到的option,这里以我的个人经验做个总结 Git Merge vs Git rebase 我们要知道的第一件事是,git rebase 和git merge 做的事其实是一样的;它们都被设计来将一个分支的更改并入另一个分支,只不过方式有些不同 想象一下,你刚创建了一个专门的分支开发新功能,然后团队中另一个成员在 master 分支上添加了新的提交。这就会造成提交历史被 fork 一份,用 Git 来协作的开发者应该都很清楚 现在,如果 master 中新的提交和你的工作是相关的;为了将新的提交并入你的分支,你有两个选择:merge 或 rebase Merge 将 master 分支合并到 feature 分支最简单的办法就是用下面这些命令: 12git checkout featuregit merge master 或者,你也可以把它们压缩在一行里 1git merge master feature 最终创建出这样的 workflow: Reb ...
notion 初步使用指南
前言 近期开始使用 notion 管理我的日程、待办等事项,出发点是自己的时间管理能力实在有些欠缺,且平时什么都想干什么都想学什么都想记录。青睐于 notion 的 page 嵌套,模版以及双向 link 关联等功能,最后选择了它(而且它的官方文档很完善很好看!) Notion的中文直译,是「概念」的意思,准确给它下个定义的话,官方说这是一款将笔记、知识库和任务管理整合在一起的协作工具 「协作工具」并非「笔记软件」,Notion 不同于大部分的笔记软件,使用传统的「笔记本-笔记-标签」这一组合设定,它的主要构成是Page(页面)、Block(编辑器)、Database(数据库)。这篇文章总结一下 Notion 初步使用的体验和见解 需要了解的词 iCloud Apple家的文件云端同步系统,并可保证这些数据在所有设备上及时自动更新 Page 一般的笔记软件,就是笔记本+笔记这样1+1的组合。Notion的Page可以是 page 嵌套 page,实现1+n的组合 具体来说,就是Notion中的Page既可以直接写笔记,又可以套上一个子Page: 这些 Page 又可以通 ...
大一统符号还原
前言 从3月中旬到前几天,我的工作重心一直在符号还原服务的重构上;整个重构从提案、方案设计,到难点攻关、核心功能实现,最后到功能验证,性能优化以及搭建监控和压力测试。全程的体验可以说是历尽艰险,但也成就感满满 符号还原系统的开发告一段落,这里我就遵循空雨伞的思考方式来总结下整个重构工作 需要了解的词 symbol demangle 在swift, C++, Rust等语言中,为了唯一标识变量/类/方法等程序实体,编译器以函数、结构、类或其他数据类型的名称对附加信息进行编码,以便将更多语义信息从编译器传递到链接器(如不同包中的同名方法等) 符号还原 根据平台的不同,程序的运行时堆栈中可能充满了内存地址或混淆后的函数名;这样的堆栈是无法阅读的。而符号还原则是将它们转换为人类可读的类名/方法名、文件名和行号的过程。本文中的符号还原泛指iOS、Java Native等内存地址形的符号还原以及Android, javascript等混淆形的符号还原 Android 混淆堆栈 Caused by: java.lang.Exception: Exception at the en ...
浅谈流程 in 2022
前言 工作两年有余,一开始的技术狂热仔也被各种需求磨平了棱角;技术的追求永远存在,但工作中面临的无穷的不确定性,流程上的缺失,让一些技术上很简单的事情带来了成倍的额外成本,下面的小总结来源于一次关于流程的分享会 需要了解的词 SOP 标准操作程序(SOP)是由组织编制的一套循序渐进的说明,以帮助工人进行日常操作。标准作业程序的目标是实现效率、质量产出和业绩的一致性,同时减少沟通错误和不遵守行业法规 SOC SOC负责制定组织的事件响应计划,该计划定义了威胁或事件发生时的活动、角色、责任,以及衡量任何事件响应成功与否的指标。定期测试 CMMI 能力成熟度模型集成(CMMI)是一个帮助组织实现过程改进的模型。开发可降低服务、产品和软件开发风险的行为 流程 流程是什么? 应该要做什么✅ / 实际要做什么❌ 一套成功的标准流程本身就是一个很大的成果,甚至是产品,市面上很多 tob 的解决方案产品其实本质上卖的就是流程 互联网公司发生了什么变化 互联网的红利来源发生了变化,互联网周期也许也到了寒冬周期,不再有“跑马圈地”的时候了(具体原因相信大家心里都有数✊) 变化下流程 ...