项目使用flask框架,是个较复杂的推荐系统,需要从设定的各类数据源取(有些复杂的排序、过滤)推荐数据,大部分数据存取使用redis,经过常规优化后取数据控制在200ms以内。
为进一步大幅度提升性能采用gevent作为并发框架,但是发现性能反而下降了大概25%,原来一个数据源就30ms,改造后上升到一两百毫秒都有,这是为什么?这种情况大家会怎么进一步调优了。
(使用场景除了比较集中的取数据模块,其他地方还有零星用到gevent)
黄舟2017-04-18 09:36:54
這個問題有點複雜,建議題主將環境以及啟動參數,運行的進程數量,以及如何運行的情況介紹一下。
在沒有這些條件的情況下,我想以我自己的理解談一下這個問題,這個問題原意題主是想藉gevent 提高性能,但是發現性能反而降低,那麼這個時候需要考察一下性能在哪降低了。
題主衡量性能降低的標準是獲取數據的時間變長了,這裡我說一下個人的見解,首先,題主不知道了不了解gevent 的工作方式,gevent 的作用一條線程跑多個協程,適合多IO 操作,如果夾雜稍微多CPU 操作的,時間上就不好把握了,例如題主這裡,要求的是幾十ms 級別的,萬一你哪一個協程跑個一兩百ms 的CPU運算,那麼即使你其他協程IO再快也無濟於事。
而且,需要強調的是引入 gevent 不會加快獲取數據的速度,例如,原來是 30ms,引入之後不會變少,只會變多,那麼引入的好處是什麼?原來你能在1秒之內接待33個客戶端請求,引入之後可能可以接待100個/s,也可能接待 300個/s,這才是 gevent 的好處。
在不完全理解題主環境的情況下只能提這麼多建議,如果題主沒理解的話可以提供一下之前的說的信息進一步分析。