Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 芹菜:为什么gevent和eventlet比prefork pool更慢、更不可靠?_Python_Celery_Gevent_Eventlet - Fatal编程技术网

Python 芹菜:为什么gevent和eventlet比prefork pool更慢、更不可靠?

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

我的主芹菜应用程序在AWS的EC2实例(“main”)中运行,它生成的任务与同一AZ(“db”)中的RDS数据库交互。工作负载每分钟生成多达数千个任务,我需要尽快并行执行它们。我让工人在两个物理位置执行任务。一个来自main的单独EC2实例(“worker EC2”),但与it和db位于同一AZ,另一个来自我们办公室专用数据中心的物理机(“worker local”)

worker EC2和local都在以
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,它将再次开始消耗任务一段时间,然后再次闲置。我注意到,在这些场景中,工人得到
    BrokenPipe
    error。请注意,这不会发生在prefork中,因此我认为这不是连接/网络,而是与池包有关。Gevent的这种行为比Eventlet更糟糕,但两者都不好
问题:

  • 为什么Eventlet和Gevent在本地和EC2工作人员之间的表现会有所不同?这两个worker之间的唯一区别是,其中一个在物理上更接近主芹菜应用程序和DB,这会影响绿色线程的执行吗

  • 如何让Eventlet真正利用完全并发设置

  • 为什么Gevent需要这么长时间才能访问内存缓存

  • 如何让远程工作者上的Eventlet/Gevent一致地使用任务

    注意:在使用prefork的相同工作人员的完全相同的设置中,这些问题都不会发生。prefork的唯一问题是,工作机器的CPU和内存负担很重,甚至有70个并发,我希望它接近700个


您提到,您的任务(大部分)与数据库通信,因此难怪在一种情况下(工作人员位于DB所在的同一网络上),他们工作得更快,而在另一种情况下工作得更慢。。。另外,如果您的DB客户机没有准备好gevent/eventlet,或者您的代码没有正确地编写这种并发性,那么它实际上可能会执行比预工作更糟糕的操作……谢谢@DejanLekic。请注意,使用prefork的两个worker之间的性能差异可以忽略不计,因此我不认为这是网络问题。如何检查DB客户端是否已准备好gevent/eventlet?这是一个RDS postgres 9.x DB。我们注意到,gevent pool(在Windows上,所以可能不是同一个根问题)也有相同的工作人员空闲行为,最后我们决定从芹菜切换到戏剧工作队列。