项目使用flask框架,是个较复杂的推荐系统,需要从设定的各类数据源取(有些复杂的排序、过滤)推荐数据,大部分数据存取使用redis,经过常规优化后取数据控制在200ms以内。为进一步大幅度提升性能采用gevent作为并发框架,但是发现性能反而下降了大概25%,原来一个数据源就30ms,改造后上升到一两百毫秒都有,这是为什么?这种情况大家会怎么进一步调优了。(使用场景除了比较集中的取数据模块,其他地方还有零星用到gevent)
光阴似箭催人老,日月如移越少年。
这个问题有点复杂,建议题主将环境以及启动参数,运行的进程数量,以及如何运行的情况介绍一下。
在没有这些条件的情况下,我想以我自己的理解谈一下这个问题,这个问题原意题主是想借 gevent 提高性能,但是发现性能反而降低,那么这个时候需要考察一下性能在哪降低了。
题主衡量性能降低的标准是获取数据的时间变长了,这里我说一下个人的见解,首先,题主不知道了不了解 gevent 的工作方式,gevent 的作用一条线程跑多个协程,适合多 IO 操作,如果夹杂稍微多 CPU 操作的,时间上就不好把握了,例如题主这里,要求的是几十 ms 级别的,万一你哪一个协程跑个一两百ms 的 CPU 运算,那么即使你其他协程IO再快也无济于事。
而且,需要强调的是引入 gevent 不会加快获取数据的速度,例如,原来是 30ms,引入之后不会变少,只会变多,那么引入的好处是什么?原来你能在1秒之内接待33个客户端请求,引入之后可能可以接待100个/s,也可能接待 300个/s,这才是 gevent 的好处。
在不完全理解题主环境的情况下只能提这么多建议,如果题主没理解的话可以提供一下之前的说的信息进一步分析。
这个问题有点复杂,建议题主将环境以及启动参数,运行的进程数量,以及如何运行的情况介绍一下。
在没有这些条件的情况下,我想以我自己的理解谈一下这个问题,这个问题原意题主是想借 gevent 提高性能,但是发现性能反而降低,那么这个时候需要考察一下性能在哪降低了。
题主衡量性能降低的标准是获取数据的时间变长了,这里我说一下个人的见解,首先,题主不知道了不了解 gevent 的工作方式,gevent 的作用一条线程跑多个协程,适合多 IO 操作,如果夹杂稍微多 CPU 操作的,时间上就不好把握了,例如题主这里,要求的是几十 ms 级别的,万一你哪一个协程跑个一两百ms 的 CPU 运算,那么即使你其他协程IO再快也无济于事。
而且,需要强调的是引入 gevent 不会加快获取数据的速度,例如,原来是 30ms,引入之后不会变少,只会变多,那么引入的好处是什么?原来你能在1秒之内接待33个客户端请求,引入之后可能可以接待100个/s,也可能接待 300个/s,这才是 gevent 的好处。
在不完全理解题主环境的情况下只能提这么多建议,如果题主没理解的话可以提供一下之前的说的信息进一步分析。