Home

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,而避免中间过程的内存操作呢? 做法 以下...

Read more

Postgres使用PgAudit获取审计日志

背景 数据库的使用过程中,执行SQL的历史经常是需要被记录且审计的,例如在政府、企业等使用场景。 实现 本次使用PgAudit以插件的形式接入Postgres,实现审计日志的打印。 PgAudit审计信息与Postgres服务日志是放在一起的,筛选起来有难度,且官方不会做相关的支持。 因此我额外使用PgAuditLogToFile来作为PgAudit的辅助,将审计日志放到独立文件中,方便进行采集和分析。 插件编译安装 在postgres所在容器上,需要编译安装上述两个插件的动态库: # PgAudit编译安装 # 因为我使用postgres v12,因此使用PgAudit对应的v1.4.X版本或者REL_12_STABLE分支 git clone https://gith...

Read more

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 ...

Read more

vscode的debug配置

背景 有些时候我们想要直接在vscode上实现开发+调试+运行。 开发配置 对于部分语言(例如c),我们需要指定一些配置让vscode识别到它的代码、静态库、动态库等依赖,才能正常使用。不然会有很多的报错,也无法正常进行代码跳转。 我们可以通过配置c_cpp_properties.json和settings.json来解决。 这边以mac环境下的pgbouncer代码为例,配置两个文件: // c_cpp_properties.json { "configurations": [ { "name": "Mac", "includePath": [ "${workspaceFo...

Read more

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...

Read more

postgres协议学习

参考 基于postgres官方文档v15进行学习,协议为v3 基本操作 基本操作分为两个阶段: Startup: 启动连接。 Normal: 连接建立之后前后端的正常交互。这里的前端(Frontend)通常指的是连接pg的客户端,后端(Backend)指的是pg服务端。 SQL的协议类型 大致有两种协议: 简单查询协议(Simple Query Protocol): 直接传递纯文本进行查询,pg服务端可以直接解析并进行执行 扩展查询协议(Extended Query Protocol): 会分步骤做查询,更灵活、性能也更好 解析预定义语句(parsing) 绑定参数(binding of parameter values) ...

Read more

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...

Read more