作者简介

缘起

升级到Pike版本以后,服务反应非常慢,因此去追查原因。K版和P版的速度对比,如下:

Kilo版(0.077s):

Pike版本(0.480s):

Pike版本的速度是Kilo版本的6倍左右,考虑到Keystone的请求,在OpenStack中非常关键,所以需要优化。

追查过程

没有好方法,从代码一层层追吧。keystone采用的apache启动的,采用python编写,调用逻辑:

router: keystone/auth/routers.py (获取token的函数authenticate_for_token)

controller: ./auth/controllers.py

这个是上层调用函数,后面工作函数在272行(method.authenticate),通过追查,发现默认的backend的SQL,继续追查keystone/identity/backends/sql.py

通过_check_password对密码进行验证

追查 keystone/common/password_hashing.py

看看hasher是什么,如下:

配置了4种Hash算法,默认采用第一种bcrypt算法。通过反复对比,发现函数耗时就在密码验证。

原因

在Kilo版本中,密码验证采用的是sha512_crypt,如下:

那么sha512_crypt和bcrypt算法为什么有这么大差异呢,就要讲讲加密算了。

在数据库中,直接存储密码显然是不安全的,因为当敌手侵入到数据库中,就可以截获到所有账号对应的真实密码。为了解决上述问题,最好的方法就是使用一种不可逆的加密算法,将要保存密码进行加密处理。

当下不可逆的加密算法主要有以下几种:

- **简单的密码**
    - MD5
    - MD5+SLAT
- **中等的密码**
    - SHA-1
    - SHA-256
    - SHA-384
    - SHA-512
- **较安全密码**
    - PBKDF2
- **更安全密码**
    - bcrypt
    - scrypt

具体原理可以参考相关的算法资料。速度测试:

相比SHA-512,Bcrypt的速度实在低得可怜。所以问题和明显,修改算法就能解决问题,考虑到bcrypt的安全性,还是不要太降低安全性才好,通过查看文档,bcrypt算法中,有一个参数:加密轮数。尝试通过加密轮数解决问题。如下,测试从round=4到round=14的速度,发现round=5最快,结果如下:

查看keystone的配置文件,round=12,没有什么多说的,直接改成5试试。

速度测试

速度从0.480降低到0.143。速度提升了3倍多,但是相比K版本0.77的速度,还是多了一倍。主要原因是加密算法的强度加大,同时keystone的数据和逻辑更加复杂了。

悄悄讲个内幕

自从我们放出美少女架构师之后,很多人在后台留言,要求进行深入的技(qing)术(gan)交流,晓东哥按捺不住埋藏多年的网红梦,熬夜写稿,强行加档期,请走过的,路过的多多转发,送他出道~

文章来源于腾讯云开发者社区,点击查看原文