Python 芹菜:为什么gevent和eventlet比prefork pool更慢、更不可靠?
我的主芹菜应用程序在AWS的EC2实例(“main”)中运行,它生成的任务与同一AZ(“db”)中的RDS数据库交互。工作负载每分钟生成多达数千个任务,我需要尽快并行执行它们。我让工人在两个物理位置执行任务。一个来自main的单独EC2实例(“worker EC2”),但与it和db位于同一AZ,另一个来自我们办公室专用数据中心的物理机(“worker local”) worker EC2和local都在以Python 芹菜:为什么gevent和eventlet比prefork pool更慢、更不可靠?,python,celery,gevent,eventlet,Python,Celery,Gevent,Eventlet,我的主芹菜应用程序在AWS的EC2实例(“main”)中运行,它生成的任务与同一AZ(“db”)中的RDS数据库交互。工作负载每分钟生成多达数千个任务,我需要尽快并行执行它们。我让工人在两个物理位置执行任务。一个来自main的单独EC2实例(“worker EC2”),但与it和db位于同一AZ,另一个来自我们办公室专用数据中心的物理机(“worker local”) worker EC2和local都在以autoscale==70,4运行预工作事件池,并且工作正常(任务在2-3秒内完成),但C
autoscale==70,4
运行预工作事件池,并且工作正常(任务在2-3秒内完成),但CPU和内存使用率很高,如果可能的话,我需要更多的并行性。所以我一直在试验eventlet
和gevent
的concurrency=100
。我被困在以下问题上:
- worker EC2上的Eventlet任务完成时间(1s)比prefork(2-3s)快。但是,在worker local上,任务完成时间要慢得多(17-25秒),而且大部分时间都无法使用本地Redis缓存执行对db和I/O的简单查询。CPU和内存不会被进程严重占用。Gevent也会出现同样的问题,但更严重。任务在200多秒内完成
- worker EC2上的Eventlet任务完成时间更快,但它似乎没有使用完全并发。虽然每个任务都在1-1.5秒内完成,但我从未看到在任何给定的一秒钟内完成超过10-15个任务。因此,似乎没有使用完全并发。CPU的利用率为60-80%,内存不足50%,因此不会产生很大的负担
- 即使队列中有任务,同时运行Gevent和Eventlet的本地工作进程也经常处于空闲状态。一旦我重新启动worker,它将再次开始消耗任务一段时间,然后再次闲置。我注意到,在这些场景中,工人得到
error。请注意,这不会发生在prefork中,因此我认为这不是连接/网络,而是与池包有关。Gevent的这种行为比Eventlet更糟糕,但两者都不好BrokenPipe
- 为什么Eventlet和Gevent在本地和EC2工作人员之间的表现会有所不同?这两个worker之间的唯一区别是,其中一个在物理上更接近主芹菜应用程序和DB,这会影响绿色线程的执行吗
- 如何让Eventlet真正利用完全并发设置
- 为什么Gevent需要这么长时间才能访问内存缓存
- 如何让远程工作者上的Eventlet/Gevent一致地使用任务 注意:在使用prefork的相同工作人员的完全相同的设置中,这些问题都不会发生。prefork的唯一问题是,工作机器的CPU和内存负担很重,甚至有70个并发,我希望它接近700个