不知道你有没有这样的经验:看了很多计算机相关的书,觉得自己懂得很多,但是一遇到实际问题,就不会解。

再看身边的老司机,执行几行命令,看了几个指标,就准确地定位问题了。他可能也没看那么多理论,但实战能力确实强,心里一下子就失衡了。

这其中有很多原因,我认为其中有一个比较重要的就是:工具的使用。老司机因为经验多,积累了很多 命令、shell 脚本、代码库……这些东西就像瑞士军刀,关键时刻,直接就可以派上大用场。在线上出问题的时候,云淡风轻地说,这行代码有问题,删掉就可以了。潇洒至极!

今天我就把我最近积累的一些工具,包括一些软件、命令,这些是可以直接用于实战的。希望看完之后,能提升你的战斗力。

效率工具

今天推荐 2 个我日常用得比较多的,提升效率的软件:aText、paste。

aText

aText 是一个输入映射的软件,输入预先设定的字符串,就可以转成设定好的目标字符串。我用 aText 存了很多有用的映射,例如,我把打开博客文章的命令缩写成了 XPosts

因为博客文件所在的路径比较长,如果我每次都直接敲出完整路径的话,会很麻烦。有了这个映射后,只用输入 XPosts 就自动变成了我要的文件路径。

还有很多场景可以使用 aText,尤其是你经常要输入的相同的内容,非常方便。

paste

paste 管理剪贴版的历史,只要是你复制过的内容,它都会保存下来,甚至可以对文本内容进行搜索。

比如可以把开发、排查问题时常用的链接、命令都放到一个 tab 下面,要用的时候,直接快捷键调出,怎一个优雅了得。

命令

这部分挑了一些非常有用的命令出来,大家可以记在笔记里,关键时候直接拿出来用。

查看 cache size

看 Go 源码的时候,经常能看到一些 pad 字段,这个字段主要是用来防止 false sharing,一般是根据 cache line size 来算 pad 大小的。那么查看这个 size 的大小呢?

1getconf LEVEL1_DCACHE_LINESIZE

查看内核版本

有时候会遇到一些和内核版本相关的问题,例如 Go 语言里面的内存归还策略在 Go 1.12 有一个改动,将 MADV_FREE 改成了 MADV_DONTNEED,导致线上应⽤的 RSS ⼤幅上升。

使用 MADV_FREE 方式,程序内存不会立刻回收,即 RSS 值不会立刻下降,只有当 OS 内存紧缺时才会回收 Go 程序的内存;

而 Go 1.11 以及之前的版本默认采用的是 MADV_DONTNEED 方式,程序 RSS 值下降很快。

因此如果需要使程序内存占用下降很慢的话,可设置环境变量 GODEBUG=madvdontneed=1

另外,MADV_FREE 只在 Linux 4.5 及之后的版本才有,所以当你遇到 RSS 一直降不下去的场景时,要想确认是不是这个问题导致的,还得看你的内核版本是啥。那就用这个命令:

1uname -a

这个归还内存的策略在 Go 1.16 又改回去了。因此只有在 Go 1.12-Go 1.15 之间,且是 Linux 4.5 及之后的内核版本才会有这个问题。

输出代码行号

有时候需要用 cat 命令输出一段代码,截图发给别人。这时如果需要对着代码行号做一些说明的话,把代码行号一并输出来是非常 nice 的,只需要用这个命令:

1cat -n a.go

汇总展示代码构成

当我们想看一个开源项目的代码行数的时候,并且能看到各种类型的语言各占多少的时候,怎么办呢?一个命令搞定:

1tokei ./

就问你强不强!

这个用在什么场景呢?太多了,例如你准备看一个稍微简单一点的框架,有几个侯选的:chi, echo, gin……执行一下命令,看看代码行数,选择一个最少的。

后记

工具是很重要的,积累了很多前人的智慧,我们拿来直接用,不需要自己再从零开始。当然,适当地学习原理也是必须的。

我们要记住这些命令,存入自己的工具库,要用的时候直接调出来。它们可以节省我们大脑的内存,把宝贵的资源用在思考真正的问题上,而不是记住这些命令。

而且当我们有了自己的代码码、脚本库、工具库的时候,遇到问题,拿上相应的家伙上场,马上就可以得到很多相关的信息,我们再根据这些信息做决策。

今天就先列这些吧,其实还准备了好几个关于 Go 的,先不放出来。如果这篇比较受欢迎,就下期再写了。

最后,也欢迎在留言区分享你的工具,无论是软件,还是一行命令。我会汇总后再分享给大家,切实有效地提升大家的能力。