簡體   English   中英

芹菜+事件= 100%CPU使用率

[英]celery + eventlet = 100% CPU usage

我們正在使用芹菜從不同的旅行社獲取航班數據,每個請求大約需要20到30秒的時間(大多數旅行社需要請求順序-授權,發送請求,查詢結果)。

正常的芹菜任務如下所示:

from eventlet.green import urllib2, time 
def get_results(attr, **kwargs): 
    search, provider, minprice = attr 
    data = XXX # prepared data 
    host = urljoin(MAIN_URL, "RPCService/Flights_SearchStart") 
    req = urllib2.Request(host, data, {'Content-Type': 'text/xml'}) 
    try: 
        response_stream = urllib2.urlopen(req) 
    except urllib2.URLError as e: 
        return [search, None] 
    response = response_stream.read() 
    rsp_host = urljoin(MAIN_URL, "RPCService/FlightSearchResults_Get") 
    rsp_req = urllib2.Request(rsp_host, response, {'Content-Type': 
'text/xml'}) 
    ready = False 
    sleeptime = 1 
    rsp_response = '' 
    while not ready: 
        time.sleep(sleeptime) 
        try: 
            rsp_response_stream = urllib2.urlopen(rsp_req) 
        except urllib2.URLError as e: 
            log.error('go2see: results fetch failed for %s IOError %s'% 
(search.id, str(e))) 
        else: 
            rsp_response = rsp_response_stream.read() 
            try: 
                rsp = parseString(rsp_response) 
            except ExpatError as e: 
                return [search, None] 
            else: 
                ready = rsp.getElementsByTagName('SearchResultEx') 
[0].getElementsByTagName('IsReady')[0].firstChild.data 
                ready = (ready == 'true') 
        sleeptime += 1 
        if sleeptime > 10: 
            return [search, None] 
    hash = "%032x" % random.getrandbits(128) 
    open(RESULT_TMP_FOLDER+hash, 'w+').write(rsp_response) 
   # call to parser 
    parse_agent_results.apply_async(queue='parsers', args=[__name__, 
search, provider, hash]) 

此任務在事件let池中以並發度300運行, prefetch_multiplier = 1broker_limit = 300當從隊列中獲取約100-200個任務時-CPU使用率提高到100%(使用整個CPU內核),並執行從隊列中獲取任務延遲。

您能否指出可能的問題-阻止操作(eventlet ALARM DETECTOR給出異常),錯誤的體系結構或其他原因。

抱歉遲了回應。

在這種情況下,我首先嘗試的是在Celery和您的代碼中完全關閉Eventlet,使用進程或OS線程模型。 對於OS調度程序而言,300個線程甚至進程的負載並不大(盡管您可能缺少內存來運行許多進程)。 所以我會嘗試一下,看看CPU負載是否急劇下降。 如果不是這樣,則問題出在您的代碼中,Eventlet無法神奇地修復它。 但是,如果確實下降了,我們將需要對此問題進行更深入的調查。

如果錯誤仍然存​​在,請通過以下任何一種方式報告該錯誤:

如果您向服務器發出200個請求,則會出現問題,響應可能會延遲,因此urllib.urlopen將掛起。

我注意到的另一件事:如果引發URLError,程序將停留在while循環中,直到睡眠時間大於10。因此,URLError錯誤將使此腳本休眠55秒(1 + 2 + 3 ..等)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM