Python + Cassandra的一些性能优化

这一篇文章, 主要讲的是如何优化python client的性能, 不是Cassandra本身的性能优化.

Cassandra本身的性能优化, 主要是对DB Schema的设计上面的优化.
那python client 为什么需要优化呢?
正在进行的一个项目就遇到这种情况, 无论如何优化, 性能就是无法提升. 一直维持在2000条/s的水平. 这个时候发现:
1. 只使用了单核cpu
2. 这一颗CPU已经100%

官方其实已经有一些关于性能优化的建议与文章, 但是感觉有的并不实用. 作者根据自己的实际操作的经验, 总结了一下几点.

使用Docker作为运行环境

其实这个优化, 是架构上面的. 但是个人认为, 这一点能极大的方便后面的步骤.
最大的原因: 可以比较放心大胆的修改环境配置, 而不用担心改动影响其他的应用.

使用LibevConnection

这个C扩展的安装非常简单, 如下:

但是, 如果是先安装cassandra-driver再安装上面的Libev相关扩展, 就不会起作用. 一定要保证先安装Libev相关类库再安装cassandra-driver

如果先安装了cassandra-driver呢?
这个时候基于docker的环境优势就出现了 –> 重新起一个干净的docker环境, 先安装libev再安装cassandra-driver

我们来看看效果吧

没有安装libev

结论:
每2000条数据耗时1.25s左右

安装了libev

结论:
没有具体计算平均值, 但是可以看到略微降低了一些.
默认的是使用Cython, 所以实际上已经有一些C的优化效果了. 这里只是看到有略微提升

是否使用PyPy?

PyPy使用了完全不同的Python解释器, 如果使用PyPy需要把其他环境重新安装一次. 因此, 如果在你的环境可以达到这一点, 非常建议使用PyPy

根据官方测试, 使用PyPy, 性能可以提升1倍!

参考:
https://docs.datastax.com/en/drivers/python/2.6/performance.html

使用多进程

上面提到, 单颗CPU的使用率已经100%, 要想明显提升就一定需要使用多核的能力.

如果你像我一样, 是在jupyternotebook上面进行开发, 可能要面对, 如果是多进程运行, 在notebook上面的状态, 可能就不能显示是busy了. 具体原因另外开篇来讲.

使用多进程, 需要注意的是, cluster / session 需要在进程内部来创建, 不能在多个进程之间互相共享. 不光是Cassandra, 其他的数据库链接也是这样.

使用Batch Futures

这个直接看官方代码会比较合适.
参考: https://github.com/datastax/python-driver/blob/master/tests/integration/long/test_large_data.py#L72

注意: 原文的concurrency只设置成10. 你可以根据自己的环境来进行调节. 我自己的设置成2000了

后记

这一篇文章写得有点随意了. 娃娃还在旁边吵…
本文原创, 转载需要注明出处:

Python + Cassandra的一些性能优化

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注