golang中进行类型转换时避免GC产生
背景
golang为了简洁性和易用性,在一些常用的使用方式上是有一定的性能损耗的。
例如将一个函数从[]byte转换成string,这个是一个很常见的需求,比如我们需要读取一个文件的内容并保存成一个字符串:
buf, err := os.ReadFile("file.txt")
if err != nil {
panic(err)
}
res := string(buf)
上述代码在将结果从[]byte转换成string时,是会进行内存分配和拷贝的,因此就会涉及到了GC。积少成多,也是会一定程度影响程序的性能的。
因此需要考虑,有没有一种重新解释(reinterpret cast)的方法,直接将[]byte转换成string,而避免中间过程的内存操作呢?
做法
以下...
Postgres使用PgAudit获取审计日志
背景
数据库的使用过程中,执行SQL的历史经常是需要被记录且审计的,例如在政府、企业等使用场景。
实现
本次使用PgAudit以插件的形式接入Postgres,实现审计日志的打印。
PgAudit审计信息与Postgres服务日志是放在一起的,筛选起来有难度,且官方不会做相关的支持。
因此我额外使用PgAuditLogToFile来作为PgAudit的辅助,将审计日志放到独立文件中,方便进行采集和分析。
插件编译安装
在postgres所在容器上,需要编译安装上述两个插件的动态库:
# PgAudit编译安装
# 因为我使用postgres v12,因此使用PgAudit对应的v1.4.X版本或者REL_12_STABLE分支
git clone https://gith...
k8s支持ipv6
背景
虽然ipv6已经支持许多年了,但是仍然不普及。正好最近遇到了k8s需要开启ipv6支持的问题,记录一下解决方案。
环境
Kind环境不低于0.11
Kubernetes服务器环境不低于v1.23
Calico环境不低于3.24
做法
要支持ipv6,就需要自上而下全部支持。即:
Cluster级别需要支持(我这边使用的是Kind)
CNI需要支持(我这边使用的是Calico)
Pod需要支持
Service需要支持
系统设置
linux环境下:
sudo sysctl -w net.ipv4.conf.all.forwarding=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1
...
vscode的debug配置
背景
有些时候我们想要直接在vscode上实现开发+调试+运行。
开发配置
对于部分语言(例如c),我们需要指定一些配置让vscode识别到它的代码、静态库、动态库等依赖,才能正常使用。不然会有很多的报错,也无法正常进行代码跳转。
我们可以通过配置c_cpp_properties.json和settings.json来解决。
这边以mac环境下的pgbouncer代码为例,配置两个文件:
// c_cpp_properties.json
{
"configurations": [
{
"name": "Mac",
"includePath": [
"${workspaceFo...
pgbouncer学习
背景
pgbouncer是一个PostgreSQL的轻量级线程池,支持客户端多种连接方式。
本地编译部署
# 依赖安装
brew install autoconf automake libtool
# 编译
sh autogen.sh
./configure --enable-debug --prefix=/usr/local --with-openssl=/usr/local/opt/openssl
make clean; make
# 部署到/usr/local/bin
make install
使用方式
连接用户数据库
使用pgbouncer需要配置增加配置文件:
; pgbouncer.ini
[databases]
db1 = host=localhost po...
postgres协议学习
参考
基于postgres官方文档v15进行学习,协议为v3
基本操作
基本操作分为两个阶段:
Startup: 启动连接。
Normal: 连接建立之后前后端的正常交互。这里的前端(Frontend)通常指的是连接pg的客户端,后端(Backend)指的是pg服务端。
SQL的协议类型
大致有两种协议:
简单查询协议(Simple Query Protocol): 直接传递纯文本进行查询,pg服务端可以直接解析并进行执行
扩展查询协议(Extended Query Protocol): 会分步骤做查询,更灵活、性能也更好
解析预定义语句(parsing)
绑定参数(binding of parameter values)
...
golang性能监控
背景
性能测试主要用于go benchmark等压力测试的场景下,进行cpu和内存的使用分析。这边主要使用pprof来进行性能的采集
性能查看
topN
先使用命令进行cpu profiling分析
go tool pprof ./backend_server http://localhost:port/debug/pprof/profile
进入命令行后使用命令topN即可看到最耗时的N项调用
(pprof)top5
调用树
同上先进行cpu profiling分析, 再执行命令(pprof)web, 即可看到调用树
火焰图
使用go-torch将pprof生成的结果展示成火焰图的形式
brew inst...
38 post articles, 6 pages.