本文为 2021 年 11 月知识总结。
研发编码
C / C++
无。
golang
写了数字签名、数字信封的测试示例,了解了 RSA 、AES 加解密,知道 AES 的密钥长度必须大于16字节。
Docker
无。
Linux
监控指定进程的内存使用情况 shell 脚本memonitor.sh:
1 | !/bin/bash |
注:先获取指定进程ID,再进行条件过滤,得到内存占用。另外还打印系统内存的使用情况。
编码其它
Makefile指定运行时动态库路径
一般地,在编译时分别使用-L
和-l
来指定所需动态库的目录和名称。如:
1 | -L/usr/local/curl/lib/ -lcurl |
此种情况下,如果没有额外设置环境环境LD_LIBRARY_PATH,也没有在/etc/ld.conf.d/xx.conf
文件中指定目录的话,会提示动态库未找到。为减少麻烦,可以在编译时用-Wl,-rpath
来指定目录(注意其格式),如:
1 | -L/usr/local/curl/lib/ -lcurl -Wl,-rpath=/usr/local/curl/lib/ |
这样一来,在运行时就不用额外设置目录了。当然,编译环境和运行环境对应的库目录必须相同。
git 分支管理
用 git 开发过程中有关分支的管理和合并等,已初步形成一些方式,但对于个人来说略显麻烦。以 gitlab 为例,默认主分支,当出现新需求,创建feature-xx
分支,开发之,最后合并到主分支,打上标签;当发现 bug 时,创建bugfix-xx
或hotfix-xx
分支,改正之,最后合并到主分支。如果在修改 bug1 分支时,又出现 bug2,则在最新的主分支创建 bug2 分支,分别修改提交。至于合并,目前还未遇到,待后面补充。
git 版本号
对于版本号管理一直没有找到好的方法,但大体上确定为x.y.z
这种形式,版本号的定义,可在 Makefile,可在单独文件,或直接创建文件version.h
来定义,为方便跟踪,有时会添加编译时间。目前有几种:
- 用过脚本计算 git 提交了多少次版本,将其作为小版本号,每次测试通过后需发布时,先提交一次版本,再用该版本编译,这样本地版本和远程仓库版本保持一致。开发人员只需修改大版本号即可。
- 通过编译日期来确定版本号,之前曾经使用这种方式,即版本号固定,如
v1.1.0
,后面添加编译日期,日期即为真正版本号。可用脚本自动生成。 - 手动维护版本号,如当前已发布
v1.0.0
版本,则先修改版本号文件为开发版本,如v1.1.0-devel
,提交一次,此后的开发均使用该版本号,如确定新版本发布,则修改为v1.1.0
。下次迭代开始时,继续修改版本。这种方案需人工介入,如迭代频繁,可能会忘记版本号的修改。 - 与上法类似,但在最后确定发布版本时,再修改版本号。
研发思考
无。
其它研究
集中看了一些 redis 的知识,如缓存雪崩、缓存击穿等概念。但未有足够时间实践,先记概念以便应试。
工作记录
数据长度计算
某工程有写字符串数据到指定文件的模块,一日运维反馈 32 位系统概率性出现写的数据有不完整的现象。经查,的确只在 32 位系统出现,64 位一切正常,并且只有设备重启时概率性出现(否则以全区的体量,早就被投诉了)。较长时间排查跟踪,发现是某个缓存区越界了。问题代码片段如下:
1 | char databuf[60]={0}; |
databuf 长度为 60 字节,在某些情况下,sprintf 组装的长度刚好是60字节,此时用 strlen 函数计算长度,在 32 位系统得到的数值是 63(databuf后有额外的字符,其后才是’\0’),而写入的字符串有换行,因此造成一个错觉,认为写数据不完整,实际上是同一字符串,只是越界了。解决问题比较简单,增加长度即可。
内存泄漏
某工程遇到一个内存泄漏问题。经排查,是因为申请的内在指针被放置于全局 map 变量中,但在循环使用前,调用了 clear 函数清除了 key,但并未释放内存。解决之法十分简单,将其删除即可,经观察,问题解决。
CPU占用高问题
运维发现某进程占用CPU较高,一直在99%以上,使用 iotop、iostat等工具定位到 journal 服务有问题,以为系统配置方面的问题,但查了半天,最终发现问题集中在某工程的一个 FIFO 模块,经询问得知,该模块为2016年的资产,至今无人修改,当前机制已变,不再适用,但未删除。该模块每隔一秒读取一次某 FIFO 文件,而该文件不知何故变成为 root 权限,故一直打开出错,因为该读取函数会判断是否打开文件,如否则打开之,但权限不足,故一直打开,一直输出打开失败日志,故导致某个日志文件占用近700GB空间,再导致设备磁盘无空间,导致IO性能下降。将权限修改回普通用户,所有性能指标均正常。删除该模块的调用,经观察,已无类似现象。
本月做的事及计划
还有一周就考试了,前面浪费了很多时间,需要抽时间出来复习了,否则浪费报名费。等考完了再陪大锤玩。
李迟 2021.10.31 周日