有用户反馈 keystone 认证本地用户的接口性能很差,因此做了调研。
首先使用 ab ( apache benchmark )模拟用户认证,调用命令行如下:
ab -n 2000 -c 100 -p ~/auth_body.json -T 'application/json' http://192.168.1.248:5000/v3/auth/tokens
执行以上脚本过程中,采集 keystone 的 pprof 的 profile 数据:
wget http://192.168.1.248:5000/debug/pprof/profile
然后把 profile 数据文件拷贝到本地,用本地 go tool 打开一个 http 服务,查看 profile 的内容。
go tool pprof -http=0.0.0.0:8081 ~/profile
用浏览打开看,得到如下的调用图:
发现整个 profile 时间约 130 秒,调用 blowfish encryptBlock 的时间花了约 101 秒。查看代码发现这个是密码校验调用的方法 bcrypt.CompareHashAndPassword 。也就是说,70%的时间都花在验证本地用户的密码上了。
为什么这个 bcrypt.CompareHashAndPassword 方法这么慢呢?搜索 google 发现这个问答:
其中有一段文字:
Besides incorporating a salt to protect against rainbow table attacks, bcrypt is an adaptive function: over time, the iteration count can be increased to make it slower, so it remains resistant to brute-force search attacks even with increasing computation power.
因此,采用 bcrypt 加密用户密码后,为了防止密码被暴力破解,用户认证接口的校验速度是故意地越压越慢的,性能必然不会好。
作者: 云联壹云邱剑
GitHub: https://github.com/yunionio/cloudpods
开源地址: https://www.cloudpods.org/
Cloudpods 是一个开源的 Golang 实现的云原生的多云和混合云融合平台。Cloudpods 不仅可以管理本地的虚拟机和物理机资源,还可以管理其他公有云和私有云平台的资源。